[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблема конвертации png в jpeg
cytrus
Сохранение рисунков посредством php в jpeg- формат
здесь находится решение одной возникающей проблемы

При программировании на php, я однажды столкнулся с одной проблемой: подгружая из файла рисунок в png- формате(RGB-alpha), мне необходимо сохранить файл в jpeg- формат(RGB). Функция imagejpeg попросту игнорирует alpha-канал данного изображения, занося RGB- цвета в файл без изменений. В следствии чего возикла необходимо превратить RGB-alpha- рисунок в RGB- рисунок перед тем как записывать его в файл.


function image_change_alphaColor(& $image, $_transparent_color)
{
set_time_limit(0);
if(empty($_transparent_color))
$_transparent_color = imagecolorallocatealpha( $image , 255, 255, 255, 0 );
$_tc = imagecolorsforindex($image, $_transparent_color);
imagealphablending($image, false);
for($x = 0; $x < imagesx($image); $x++)
for($y = 0; $y < imagesy($image); $y++){
$color = imagecolorat($image, $x, $y);
if($color != $_transparent_color){
$c = imagecolorsforindex($image, $color);
foreach($c as $ci => $v)
$$ci = & $c[$ci];
if(!isset($alpha));
elseif($alpha == 127){
imagefill($image, $x, $y, $_transparent_color);
}elseif($alpha > 0){
foreach($c as $ci => $v)
$$ci = round(
(

$_tc[$ci] * $alpha + (
(
$ci == 'alpha')?
0 :
$$ci * (127 - $alpha)
)
) /
127
);
$new_color = imagecolorallocatealpha( $image , $red , $green , $blue, $alpha );
imagefill($image, $x, $y, $new_color);
}
}
}

imagesavealpha($image, true);
}


В данном случае, я расширил свойства данной функции так, чтобы фоновый цвет был не обязательно белый непрозрачный. , или, как вариант, чтобы, например, можно было заменить прозрачный фон на полупрозрачный цветный фон.


// рисунок на белом фоне
image_change_alphaColor($im);
imagesavealpha($im, false);
imagejpeg($im, ...);

// рисунок на белом фоне
image_change_alphaColor($im, imagecolorallocatealpha($im, 255, 255, 255, 0));
imagesavealpha($im, false);
imagejpeg($im, ...);

// рисунок на красном фоне
image_change_alphaColor($im, imagecolorallocatealpha($im, 255, 0, 0, 0));
imagesavealpha($im, false);
imagejpeg($im, ...);

// рисунок на полупрозрачном фоне цвета морской волны
image_change_alphaColor($im, imagecolorallocatealpha($im, 0, 255, 255, 60));
imagepng($im, ...);
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.