[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Масштабирование Gif-файла
calg0n
Люди кто знает как можно масштабировать gif-файл без потери прозрачности?

Есть код :
Код
<?php
// f - имя файла
// src - исходное изображение
// dest - результирующее изображение
// w\h - ширина\высота изображения
// ratio - коэффициент пропорциональности

$src = imagecreatefromgif($f);
header("Content-type: image/gif");
$w_src = imagesx($src);
$h_src = imagesy($src);

$ratio = $h_src/$h;
$w_dest = round($w_src/$ratio);
$h_dest = round($h_src/$ratio);
$dest = imagecreatetruecolor($w_dest,$h_dest);
imagecopyresized($dest, $src, 0, 0, 0, 0, $w_dest, $h_dest, $w_src, $h_src);
imagegif($dest);
imagedestroy($dest);
imagedestroy($src);
?>

Но он выдает масштабированное изображение с черным фоном, т.е. там где должна быть прозрачность - черный цвет.

Кто подскажет как сохранить прозрачность?



Спустя 24 минуты, 4 секунды (11.12.2007 - 20:59) Sylex написал(а):
Цитата(calg0n @ 11.12.2007, 17:35) [snapback]30476[/snapback]
Люди кто знает как можно масштабировать gif-файл без потери прозрачности?

Есть код :
Код
<?php
// f - имя файла
// src - исходное изображение
// dest - результирующее изображение
// w\h - ширина\высота изображения
// ratio - коэффициент пропорциональности

$src = imagecreatefromgif($f);
header("Content-type: image/gif");
$w_src = imagesx($src);
$h_src = imagesy($src);

$ratio = $h_src/$h;
$w_dest = round($w_src/$ratio);
$h_dest = round($h_src/$ratio);
$dest = imagecreatetruecolor($w_dest,$h_dest);
imagecopyresized($dest, $src, 0, 0, 0, 0, $w_dest, $h_dest, $w_src, $h_src);
imagegif($dest);
imagedestroy($dest);
imagedestroy($src);
?>

Но он выдает масштабированное изображение с черным фоном, т.е. там где должна быть прозрачность - черный цвет.

Кто подскажет как сохранить прозрачность?


Перед вызовом imagecopyresized()

Код
$originaltransparentcolor = imagecolortransparent( $src );
if( $originaltransparentcolor >= 0
    && $originaltransparentcolor < imagecolorstotal( $src )
) {
    $transparentcolor = imagecolorsforindex( $src, $originaltransparentcolor );
    $newtransparentcolor = imagecolorallocate(
        $dest, $transparentcolor['red'], $transparentcolor['green'], $transparentcolor['blue']
    );
    imagefill( $dest, 0, 0, $newtransparentcolor );
    imagecolortransparent( $dest, $newtransparentcolor );
}

Спустя 2 часа, 6 минут, 7 секунд (11.12.2007 - 23:05) calg0n написал(а):
Спасибо, Sylex!
Только есть одно НО. :\

У меня на компе установлен PHP 5.2.3, на удаленном хосте - PHP 4.4.7
Настройки GD на хосте :
GD Support: enabled
GD Version: bundled (2.0.28 compatible)
FreeType Support: enabled
FreeType Linkage: with freetype
GIF Read Support: enabled
GIF Create Support: enabled
JPG Support: enabled
PNG Support: enabled
WBMP Support: enabled
XBM Support: enabled
Апач: Apache/1.3.34 (Unix) mod_deflate/1.0.21 PHP/4.4.7 rus/PL30.22

У меня на компе :
GD Support: enabled
GD Version: bundled (2.0.34 compatible)
FreeType Support: enabled
FreeType Linkage: with freetype
FreeType Version: 2.1.9
T1Lib Support: enabled
GIF Read Support: enabled
GIF Create Support: enabled
JPG Support: enabled
PNG Support: enabled
WBMP Support: enabled
XBM Support: enabled
Апач: Apache/2.2.4 (Win32) DAV/2 mod_ssl/2.2.4 OpenSSL/0.9.8e mod_autoindex_color PHP/5.2.3

Причем у меня прозрачность нормально выставляется, а на хосте - все также чернО. sad.gif
В чем может быть проблема и как можно сие решить?

Спустя 22 минуты, 49 секунд (11.12.2007 - 23:28) calg0n написал(а):
Проблему решил таким образом. До вызова функции imagecopyresized() пишем :
Код
$colorTransparent = imagecolortransparent($src);
if( $colorTransparent >= 0 && $colorTransparent < imagecolorstotal( $src ) )
{
    imagepalettecopy($src, $dest);
    imagefill($dest, 0, 0, $colorTransparent);
    imagecolortransparent($dest, $colorTransparent);
    imagetruecolortopalette($dest, true, 256);
}


smile.gif

Спустя 3 года, 11 месяцев, 21 день, 22 часа, 38 минут, 25 секунд (3.12.2011 - 21:06) Тоха написал(а):
есть вариант еще проще, перед вызовом функции imagecopyresampled использовать

imagealphablending($img, false);
imagesavealpha($img, true);

не знаю, как с гифами, но с png работает на ура!

Спустя 12 минут, 12 секунд (3.12.2011 - 21:18) alex12060 написал(а):
Тоха

Эту проблему решили уже почти 4 года назад smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.