|
|
|
|
|
для: sim5
(03.02.2010 в 16:24)
| | спасибо. | |
|
|
|
|
|
|
|
для: Рома
(03.02.2010 в 13:57)
| | Я сейчас очень занят TDA9381PS/N2/ХХХХ, и до остального мне..., так что пока только информация к размышлению.
Создайте изображение, например, красный фон с прозрачностью 50% и помещенным на нем белом квадрате непрозрачном. Сохраните его в формате PNG24 (условно назовем его src.png). Теперь выведите это изображение в браузер двумя способами:
1. С помощью тега <img src="src.png" />
Что наблюдаем? Наблюдаем ОК - красный фон изображения полупрозрачен (в старых версиях IE этого только не увидеть).
2. С помощью GD библиотеки (учтите, что старые ее версии не поддерживали png - главную ее фичу, альфа канал):
<?
$im = imagecreatefrompng("src.png");
header ("Content-type: image/png");
imagepng($im);
|
Что наблюдаем? Наблюдаем NOТ OК - красный фон изображения выводится непрозрачным.
А теперь выведем так:
<?
$im = imagecreatefrompng("src.png");
imagesavealpha($im, true);
header ("Content-type: image/png");
imagepng($im);
|
Что наблюдаем? Все ОК, как и при выводе тегом.
imagesavealpha - указывает сохранять полную информацию об альфа канале (в отличии от одного уровня (цвета) прозрачности) в PNG изображении.
Теперь наложим изображение на ранее заготовленную подложку (изменение размеров на суть не влияет, но будем изменять):
<?
//пусть исходное 300х300
$im = imagecreatefrompng("src.png");
//подложка 100х100
$ims = imagecreatetruecolor(100,100);
//цвет подложки
$col = imagecolorallocate($ims, 0, 0, 0);
//указываем его как прозрачный
imagecolortransparent($ims, $col);
imagefill($ims, 0, 0, $col);
//эту строку пока оставим заремированной
//imagealphablending($ims,false);
imagesavealpha($ims, true);
imagecopyresampled($ims, $im, 0, 0, 0, 0, 100, 100, 300, 300);
header ("Content-type: image/png");
imagepng($ims);
imagedestroy($im);
imagedestroy($ims);
|
Что наблюдаем? Красный фон исходного изображения имеет прозрачность 50%, но он явно не того цвета (по умолчанию фон страницы белый), так как накладывается на черный фон подложки. И причина не в том, что мы забыли сделать его прозрачным (это сделано) - выведите ресурс im, заремировав лишние строки в коде, подложка будет выведена прозрачной. А вот теперь разремируйте строку imagealphablending($ims,false);, и все будет как положено - эскиз исходника также будет иметь красный цвет с прозрачностью 50%.
imagealphablending позволяет выбрать один из двух способов работы с альфа-каналом. Если второй параметр этой функции установлен в true, то при рисовании полупрозрачным цветом новое изображение частично накладывается на старое. Если же он установлен в false, то происходит полное замещение пикселей исходного изображения на пиксели нового.
А теперь сами попробуйте с gif-форматом - что из вышесказанного будет нужно, а что нет, попробуйте решить сами, ну или хотя бы постараться понять это. | |
|
|
|
|
|
|
|
для: sim5
(03.02.2010 в 05:26)
| | У меня есть функция, которая некоторые изображения с прозрачным фоном уменьшает и оставляет прозрачность, а в некоторых изображениях прозрачночть игнорируется. Вот и решил поинтересоваться, как это делать правильно, потому что обработка картинок через одну-две не айс.
<?php
// функция генерации превью
// путь к файлу имя мах шир max выс куда сохранять
function resize_img($file, $filename, $f_out_w, $f_out_h, $patch_img_small)
{
// снимаем параметры изображения
$f_getimagesize = getimagesize($file);
// выщитываем коофициент пропорциональности исх. изображения
$in_w = $f_getimagesize[0];
$in_h = $f_getimagesize[1];
$in_ratio = $in_w/$in_h;
// вычисляем размеры уменьшенной копии
$out_h = $in_w > $in_h ? floor($f_out_w/$in_ratio) : $f_out_h;
$out_w = $in_h > $in_w ? floor($f_out_h * $in_ratio) : $f_out_w;
// создание пустого изображение нужного размера
$img_out = imagecreatetruecolor($out_w, $out_h);
// если может поддерживаться прозрачность
if ($f_getimagesize['mime'] == 'image/gif' || $f_getimagesize['mime'] == 'image/png')
{
// создание белого цвета
$tr = imagecolorallocate($img_out, 255, 255, 255);
// заливка изображения белым
imagefill($img_out, 0, 0, $tr);
// удаление белого цвета
imagecolortransparent($img_out, $tr);
imagetruecolortopalette($img_out, false, 256);
}
else
{
imagecolorallocate($img_out, 0, 0, 0);
}
// присваиваем изображение переменной в зависимости от типа
switch ($f_getimagesize['mime'])
{
case 'image/gif': $img_in = imagecreatefromgif($file); $f_ext = '.gif'; break;
case 'image/jpeg': $img_in = imagecreatefromjpeg($file); $f_ext = '.jpg'; break;
case 'image/png': $img_in = imagecreatefrompng($file); $f_ext = '.png'; break;
}
// масштабирование изображение
imagecopyresampled($img_out, $img_in, 0, 0, 0, 0, $out_w, $out_h, $in_w, $in_h);
// сохранение в файл
switch ($f_getimagesize['mime'])
{
case 'image/gif': imagegif($img_out, $patch_img_small . $filename . $f_ext); break;
case 'image/jpeg': imagejpeg($img_out, $patch_img_small . $filename . $f_ext); break;
case 'image/png': imagepng($img_out, $patch_img_small . $filename . $f_ext); break;
}
// сохраняем информацию о превьюшке в базе
$sql = "INSERT INTO `image_small`
VALUES
(
'0',
'" . mysql_real_escape_string($filename) . "',
'0',
'" . mysql_real_escape_string($out_w) . "',
'" . mysql_real_escape_string($out_h) . "'
)";
$result = mysql_query($sql);
if (!$result)
{
//echo "Error: " . mysql_error();
exit('Идет перезагрузка сервера базы данных, работа сайта возобновиться через 5 - 10 минут<br>');
}
// чистим память
imagedestroy($img_in);
imagedestroy($img_out);
}
?>
|
| |
|
|
|
|
|
|
|
для: Рома
(02.02.2010 в 18:25)
| | А какой формат у исходного изображения? | |
|
|
|
|
|
|
| делаю так:
создаю подложку нужных размеров, сохраняю изображение в переменную, масштабирую изображение в размеры подложки в зависимости от миме типа.
как изменить алгоритм ресайза, чтоб уменьшенная копия оставляла прозрачность в тех местах изображения, где она имеется в исходном изображении? | |
|
|
| |
|