Непонятный баг с ImageCopyResampled

Leonid

PHP? нет, не слышал...
Непонятный баг с ImageCopyResampled - Как заменить прозрачный цвет на белый?

Сделал функцию для формирования уменьшенной копии картинки, с помощью
ImageCopyResampled
Так вот, большинство картинок ресайзится нормально, но из некоторых получается какая-то цветная мешанина. Формат, размеры примерно одинаковые, а результат разный.

PHP:
$maxwidth = 300;

$WWW_DIR = $_SERVER["DOCUMENT_ROOT"].'/';

$fullname = $WWW_DIR.$_GET['img'];

if(file_exists($fullname) && is_file($fullname))
{

	$filedata = getimagesize($fullname);
	if($filedata[2])
                	{
		$w = $filedata[0];
		$h = $filedata[1];

		$k = $maxwidth/$w;

		$nw = round($k*$w);
		$nh = round($k*$h);


		switch($filedata[2])
		              {
			case 1 : $im = @imagecreatefromgif($fullname);
					break;
			case 2 : $im = @imagecreatefromjpeg($fullname);
					break;
			case 3 : $im = @imagecreatefrompng($fullname);
					break;
		           }

	$dst = imagecreatetruecolor($nw,$nh);
	ImageCopyResampled($dst, $im, 0, 0, 0, 0, $nw, $nh, $w, $h);

                header("Content-type: image/jpeg");
                imagejpeg($dst,"",92);
                imagedestroy($dst);

	}
}
-~{}~ 22.06.07 10:45:

Причину вроде нашел, но как от нее избавиться непонятно. Цветная мешанина появляется, если картинка GIF с прозрачным фоном.

-~{}~ 22.06.07 11:18:

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

korvin0

моська
Насколько я понимаю, проблемы с прозрачностью из-за того, что вы сохраняете результат в формате jpeg. Попробуйте сохранять в gif.


Ну, а заменить белый цвет на прозрачный можно с помощью функции imagecolortransparent():
$image = "blad.gif";
$im = imagecreatefromgif($image);
$white = imageColorAllocate ($im, 255, 255, 255);
$trans = imagecolortransparent($im,$white);
 

Leonid

PHP? нет, не слышал...
так мне наоборот, надо прозрачный на белый.... А такой функции вроде нет. Или может трансформировать палитровое изображение с прозрачным цветом в полноцветное? Но такой функции тоже почему-то нет, есть обратная imagetruecolortopalette()
 

Leonid

PHP? нет, не слышал...
сейчас попробую... такой фотошоповский подход :)
 

korvin0

моська
ой, извиняюсь. я описался :) Прозрачный на белый меняется так:
$white = imageColorAllocate ($im, 255, 255, 255);
$trans = imagecolortransparent($im,$white);
 

Leonid

PHP? нет, не слышал...
Не помогло, хотя цветная мешанина стала на белом фоне.
 

kruglov

Новичок
Leonid
У меня в CMS именно такой порядок
$a=imageCreateFromGif(...)
$b=imageCreateTrueColor(...)
imageFill($b ...)
imageCopyResampled($b, $a ...)
imageJPEG($b ...)
Цветовых мешанин за несколько лет применения этого кода пока не наблюдал.
 
Сверху