Уменьшить прозрачный PNG

Yura123

Новичок
Уменьшить прозрачный PNG

Ребята, простая задача -- сабж.
Аргументы функции:
$pID -- айди для имени записываемой превьюшки,
$pImage -- изображение, загруженное post-формой ($_FILES['image']['tmp_name'])


PHP:
function makeImages($pID, $pImage) {

	$lImgInfo = getimagesize($pImage);

	$lPath1 = 'images';

	$lPreview1 = imagecreatefrompng($pImage);

	$lPercent = ceil(120 * 100 / $lImgInfo[0]);
	$lHeight = ceil($lPercent * $lImgInfo[1] / 100);

	$lPreview2 = imagecreatetruecolor(120, $lHeight);

	imagecopy($lPreview2, $lPreview1, 0, 0, 0, 0, 120, $lHeight);

	imagepng($lPreview2, $lPath1.'/'.$pID.'_1.png');

}
Результат -- черный фон, хотя первоначальная картинка прозрачная.
Есть похожая тема, но в ней нет ответов.
 

ksnk

прохожий
А чего тут удивительного? При копировании в truecolor информация о прозрачном цвете теряется. Ее необходимо снова проставить функцией [m]imagecolortransparent[/m]
 

Yura123

Новичок
Ребята, поиск ничего не дал, схожих тем нет.
Я попробовал пользовать imagecolortransparent, но результат тот же -- черный фон, где ж грабли?

PHP:
function makeImages($pID, $pImage) { 

	$lImgInfo = getimagesize($pImage); 

	$lPath1 = 'images'; 

	$lPreview1 = imagecreatefrompng($pImage); 

	$lPercent = ceil(120 * 100 / $lImgInfo[0]); 
	$lHeight = ceil($lPercent * $lImgInfo[1] / 100); 

	$lPreview2 = imagecreatetruecolor(120, $lHeight); 

	$lColor = imagecolorallocate($lPreview2, 0, 0, 0);
	imagecolortransparent($lPreview2, $lColor);

	imagecopy($lPreview2, $lPreview1, 0, 0, 0, 0, 120, $lHeight); 

	imagepng($lPreview2, $lPath1.'/'.$pID.'_1.png'); 

}
-~{}~ 23.05.06 13:36:

Ответа не дождался.
Нужно еще 3 строчки:

imagealphablending($lPreview2, false);
imagesavealpha($lPreview2, true);
imagecolorallocatealpha($lPreview2, 0, 0, 0, 127);

Итого:

function makeImages($pID, $pImage) {

$lImgInfo = getimagesize($pImage);

$lPath1 = 'images';

$lPreview1 = imagecreatefrompng($pImage);

$lPercent = ceil(120 * 100 / $lImgInfo[0]);
$lHeight = ceil($lPercent * $lImgInfo[1] / 100);

$lPreview2 = imagecreatetruecolor(120, $lHeight);

imagealphablending($lPreview2, false);
imagesavealpha($lPreview2, true);
imagecolorallocatealpha($lPreview2, 0, 0, 0, 127);

imagecopy($lPreview2, $lPreview1, 0, 0, 0, 0, 120, $lHeight);

imagepng($lPreview2, $lPath1.'/'.$pID.'_1.png');

}
 

ksnk

прохожий
Yura123
Ответа не дождался...
Самый лучший вариант - разобраться самому. Хотя ответы, вобще говоря, прозвучали.
Если по моей ссылке просмотреть примеры работы с imagecolortransparent можно увидеть, что в предложенном вами варанте, в частности, не хватает функции imagetruecolortopalette перед ней...
Поиск по альфа каналу в этом форуме действительно не дает ответа :) Но поиск в гугле по словам "альфа канал PHP" выдал вполне приличную статью http://www.realcoding.net/article/view/3282 второй строчкой поиска...
 

Yura123

Новичок
А толку с того, что ф-ции imagetruecolortopalette не хватает, если получен необходимый результат? :)
 
Сверху