Неправильные цвета при объединении изображений с PHP - PullRequest
2 голосов
/ 01 апреля 2010

Я хочу получить идентификаторы изображений и создать из файлов объединенное изображение в соответствии с заданными идентификаторами. Этот код вызывается ajax и возвращает имя файла изображения (время сервера для предотвращения кэширования в браузере). код:

if (isset($_REQUEST['items'])){
$req_items = $_REQUEST['items'];
} else {
    $req_items = 'a';
}
$items = explode(',',$req_items);

$bg_img = imagecreatefrompng('bg.png');

for ($i=0; $i<count($items); $i++){

$main_img = $items[$i].'-large.png';

$image      = imagecreatefrompng($main_img);

$image_tc = imagecreatetruecolor(300, 200);
imagecopy($image_tc,$image,0,0,0,0,300,200);
$black = imagecolorallocate($image_tc, 0, 0, 0);
imagecolortransparent($image_tc, $black);

$opacity        = 100;  
$bg_width   = 300;  
$bg_height  = 200;  

$dest_x         = 0;//$image_size[0] - $bg_width - $padding;  
$dest_y         = 0;//$image_size[1] - $bg_height - $padding;

imagecopymerge($bg_img, $image_tc, $dest_x, $dest_y, 0, 0, $bg_width, $bg_height, $opacity)

;

}
$file = $_SERVER['REQUEST_TIME'].'.jpg';
imagejpeg($bg_img, $file, 100);
echo $file;
imagedestroy($bg_img);
imagedestroy($image);
die();

Изображения отображаются именно так, как я хочу, но с неправильными цветами. Недавно я добавил деталь с imagecreatetruecolor и imagecolortransparent , и все равно получил неправильные результаты.

Я также сохранил сам PNG в 24-битном формате и позже как 8-битный - не помогло. каждая идея очень приветствуется! Спасибо

1 Ответ

2 голосов
/ 01 апреля 2010

После долгих попыток ... как всегда, решение было очень простым:

Просто сделайте фоновое изображение 24-битным. Поэтому, если кто-то ищет способ создания многослойных прозрачных изображений, это полный код:

<?php  

if (isset($_REQUEST['items'])){
    $req_items = $_REQUEST['items'];
} else {
    $req_items = 'a';
}

$items = explode(',',$req_items);

$bg_img = imagecreatefrompng('bg.png');
$bg_tc = imagecreatetruecolor(300, 200);
imagecopy($bg_tc,$bg_img,0,0,0,0,300,200);


for ($i=0; $i<count($items); $i++){

    $main_img = $items[$i].'-large.png';

    $image      = imagecreatefrompng($main_img);
    $image_tc = imagecreatetruecolor(300, 200);



    imagecopy($image_tc,$image,0,0,0,0,300,200);
    $black = imagecolorallocate($image_tc, 0, 0, 0);
    imagecolortransparent($image_tc, $black);


    $opacity        = 100;  
    $bg_width   = 300;  
    $bg_height  = 200;  

    $dest_x         = 0;//$image_size[0] - $bg_width - $padding;  
    $dest_y         = 0;//$image_size[1] - $bg_height - $padding;

    imagecopymerge($bg_tc, $image_tc, $dest_x, $dest_y, 0, 0, $bg_width, $bg_height, $opacity);

}
$file = $_SERVER['REQUEST_TIME'].'.jpg';
imagejpeg($bg_tc, $file, 100);
echo $file;
imagedestroy($image);
imagedestroy($bg_img);
imagedestroy($bg_tc);
imagedestroy($image_tc);
die();
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...