За последние 24 часа нас посетили 15257 программистов и 1673 робота. Сейчас ищут 900 программистов ...

Собираем прозрачный PNG из прозрачных GIF-ов

Тема в разделе "Обработка изображений средствами PHP", создана пользователем ZuArt, 8 мар 2007.

  1. ZuArt

    ZuArt Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    14
    Симпатии:
    0
    Исходные данные...
    - есть некоторый набор прозрачных GIF-ов
    - в скрипт передается параметр, в зависимости от которого определяется набор используемых GIF-ов

    На выходе...
    - PNG (т.к. генерация гифов в последних GD-библиотеках не представляется возможным) картинка с прозрачным фоном, состоящая из набора исходных GIF-ов.

    Мудохаюсь уже 3 дня - нифига не выходит. Основная трабла в том, что теряется какой-либо цвет картинки, а соответственно падает качество, и то, GIF-ы, используемые для построения картинки могут наслаиваться. а потому просто взять и принудительно присобачить всем какой-то "цвет фона", который потом указать, как прозрачный, не выходит, т.к. при наслоении происходит перекрывание канвой перекрывающего элемента...
    Никакой "подложки" нет - прозрачная "подложка" должна генериться на лету, т.к. размер подложки тоже непостоянный.

    Подмогните кодом, который даст возможность это реализовать.

    по сути вызыватся функция, в которую передается список файлов-частей (GIF-ы), а на выходе нужно получить картинку в PNG-формате.

    Тезисно обозначу код...

    Код (Text):
    1.  
    2. ... // тут разбирается параметр и генерится список GIF-ок и размер выходной картинки ($sz)
    3.  
    4. $fls = array(имена файлов);
    5. $gifs = LoadGifs($fls); // загруженные GIF-ы
    6. $img = GenerateImg($sz, $gifs); // генерация выходной картинки
    7.  
    8. Header("Content-type: image/png");
    9. imagepng($img);
    10.  
    11. function LoadGifs($fls)
    12. {
    13. ...
    14. };
    15.  
    16. function GenerateImg($sz, $gifs)
    17. {
    18. ...
    19. };
    Спасайте, народ - горю!
     
  2. simpson

    simpson Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    как пытаетесь? кодом, если можно.

    P.S.
    это что за последние библиотеки такие?

    Код (Text):
    1. GD Version  bundled (2.0.28 compatible)
    все работает.
     
  3. ZuArt

    ZuArt Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    14
    Симпатии:
    0
    GD Version bundled (2.0.28 compatible)
    где достать можно? не подскажете? - у меня 2.0.18 - на фугкцию imagegif ругается
     
  4. ZuArt

    ZuArt Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    14
    Симпатии:
    0
    отдельно не нашел - качаю php 4.4.4 и php 5.2.0 - там и возьму.
    Респект за науку
     
  5. ZuArt

    ZuArt Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    14
    Симпатии:
    0
    Обновил библиотеку - все равно не выходит.... Получаю картинку на сером фоне - чувствую, что что-то не так или при чтении "базовых" GIF-ок или при составлении из них одной картинки, но не могу понять что именно....

    Вот немного обрезанный (части, которые не работают с графикой) код скрипта:

    Код (Text):
    1.  
    2. <?php
    3.  
    4.  тут идет обработка входных параметров и набор массива $cfg (в нем такие параметры, как смещение, размеры картинок базовый и картинки в целом)
    5.  ...
    6.  
    7.  $img = null; $imgs = array();
    8.  if((!LoadImgs($cfg["lst"], &$imgs))or(!CreateCanvas($cfg, &$img)))
    9.   return;
    10.  
    11.  if(BuildImg($cfg, &$img, &$imgs))
    12.  {
    13.   Header("Content-type: image/gif");
    14.   imagegif($img);
    15.  };
    16.  
    17.  FreeCanvas(&$img);
    18.  FreeImgs(&$imgs);
    19.  
    20. /**********************************************/
    21.  
    22.  // построение картинки
    23.  function BuildImg($cfg, &$img, &$imgs)
    24.  {
    25.   $ret = true;
    26.   switch(count($imgs))
    27.   {
    28.    case 1:
    29.     imagecopy($img, $imgs[0], 0, 0, 0, 0, $cfg["w"], $cfg["h"]);
    30.     break;
    31.    case 2:
    32.     imagecopy($img, $imgs[0], 0, 0, 0, 0, $cfg["w"], $cfg["h"]); imagecopy($img, $imgs[1], $cfg["dw"], 0, 0, 0, $cfg["w"], $cfg["h"]);
    33.     break;
    34.    ...
    35.   };
    36.   return $ret;
    37.  };  
    38.  // Удаление канвы
    39.  function FreeCanvas(&$img)
    40.  {
    41.   imagedestroy($img);
    42.  };
    43.  // Создание канвы
    44.  function CreateCanvas($cfg, &$img)
    45.  {
    46.   $w = 0; $h = 0;
    47.   if (count($cfg["lst"]) > 2)
    48.    {$w = $cfg["rw"]; $h = $cfg["rh"];}
    49.   else if (count($cfg["lst"]) > 1)
    50.    {$w = $cfg["rw"]; $h = $cfg["h"];}
    51.   else
    52.    {$w = $cfg["w"]; $h = $cfg["h"];};
    53.   return ($img = @imagecreate($w, $h));
    54.  };
    55.  // выгрузка картинок
    56.  function FreeImgs(&$imgs)
    57.  {
    58.   foreach($imgs as $key => $val)
    59.    imagedestroy($imgs[$key]);
    60.  };
    61.  // загрузка кртинок
    62.  function LoadImgs($lst, &$imgs)
    63.  {
    64.   if(count($imgs) > 0)
    65.    return false;
    66.   $path = "pics/";
    67.   foreach ($lst as $key => $val)
    68.   {
    69.    $val = trim(strtolower($val));
    70.    if(file_exists($path.$val.".gif"))
    71.     $imgs[$key] = @imagecreatefromgif($path.$val.".gif");
    72.    else if(file_exists($path.$val.".png"))
    73.     $imgs[$key] = @imagecreatefrompng($path.$val.".png");
    74.    else
    75.     continue;
    76.   };  
    77.   return (count($imgs) == count($lst));
    78.  };
    79. ?>
    Подозрение на траблы в функции CreateCanvas() или LoadImgs()...

    Хелп, плизззз...
     
  6. Mavir

    Mavir Guest

    В каком броузере смотрите?

    Одна и та же картинка в IE и FireFox
    [​IMG] [​IMG]