Обединяване на изображения с помощта на GD с PHP

работя върху създаването на едно PNG изображение от две други.

Изображение A и B имат еднакви размери, и двете са 200x400px. Крайното изображение е същото.

Използвам GD библиотеката с PHP.

Така че идеята ми беше да създам PNG-24 от моя оригинален PNG-8, след това да използвам цветна прозрачност и накрая да копирам второто изображение в този нов PNG-24. Проблемът така или иначе се появява в първата стъпка, когато преминавате от PNG-24 към PNG-8 с прозрачност на цветовете:

Това е, за да получите оригиналния PNG-8 и неговите размери:

$png8 = imagecreatefrompng($imageUrl);
$size = getimagesize($imageUrl);

Сега създавам нов PNG и запълвам неговия фон със зелен цвят (не присъства в изображенията):

$png24 = imagecreatetruecolor($size[0], $size[1]);
$transparentIndex = imagecolorallocate($png24, 0x66, 0xff, 0x66);
imagefill($png24, 0, 0, $transparentIndex);

Това е, за да направите зеления цвят прозрачен:

imagecolortransparent($png24, $transparentIndex);     

След това копирам png8 в PNG-24:

imagecopy($png24, $png8, 0, 0, 0, 0, $size[0], $size[1]);

Ето го проблемът: оригиналният PNG-8 изглежда добре, но има зелена граница около формата в оригиналното изображение. Трудно е да се обясни наистина. Изглежда, че част от зеления фон е останала в оставащия PNG.

Какво мога да направя?

Благодаря предварително

С Най-Добри Пожелания,

Фернандо


person Fernando Gabrieli    schedule 04.07.2011    source източник


Отговори (1)


Имах някои проблеми с png прозрачността преди и успях да ги разреша с този модел:

// allocate original image to copy stuff to
$img = imagecreatetruecolor(200, 100);

// create second image
$bg = imagecreatefrompng('bg.png');

// copy image onto it using imagecopyresampled
imagecopyresampled($img, $bg, 0, 0, 0, 0, 200, 100, 200, 100);
imagedestroy($bg);

// create third image
// do same routine
$fg = imagecreatefrompng('fg.png');
imagecopyresampled($img, $fg, 50, 50, 0, 0, 50, 50, 50, 50);
imagedestroy($fg);

// output image
imagepng($img);
imagedestroy($img);

Мисля, че единствената разлика между моя и твоя е imagecopy() срещу imagecopyresampled(). Изглежда си спомням, че имах проблеми с това, въпреки че беше преди доста време. Можете да видите пример за изображение, на което използвам този модел тук: http://www.ipnow.org/images/1/bggrad/bg4/yes/TRANSIST.TTF/8B0000/custombrowserimage.jpg (разпределям празно изображение, копирам фоновото изображение в, копирайте наслагването с прозрачност в)

person Anthony Sottile    schedule 04.07.2011
comment
Мога да комбинирам и двете изображения, следвайки вашия код. Проблемът, който имам сега, е, че едно от тези изображения има сянка. Сега, когато използвам imagecopy или imagecopyresampled, изглежда, че тази сянка (влошаване на сивото) се комбинира с прозрачния цвят, който зададох на заден план, което води до почти перфектно крайно изображение, но заобиколено от прозрачния цвят на фона, който зададох преди, грозно зелено. След като получих това, опитах да използвам прозрачен PNG вместо това, но тези пиксели отново са проблем: получавам някакво замъгляване. Звучи ми като проблем с изображението, а не свързан с програмирането. - person Fernando Gabrieli; 06.07.2011