This Might Be Useful

Изменяем размеры картинки с сохранением прозрачности (PHP+GD)

По умолчанию при изменении размеров полупрозраных (и прозрачных) картинок вместо прозрачного фона получается заливка цветом. Это негативно сказывается на внешнем виде изображения и нервах. Поэтому я расскажу, как сохранять прозрачность.
Итак, для этого нам понадобятся следующие функции:

  • imagecolorallocatealpha
    int imagecolorallocatealpha ( resource $image, int $red, int $green, int $blue, int $alpha)
  • imagealphablending
    bool imagealphablending ( resource $image, bool $blendmode)
  • imagesavealpha
    bool imagesavealpha ( resource $image, bool $saveflag)

Код в результате выглядит примерно так:

PHP:
  1. $imgInfo = getimagesize($img);
  2. $im = imagecreatefrompng($img);
  3. $newImg = imagecreatetruecolor($nWidth, $nHeight);
  4. imagealphablending($newImg, false);
  5. imagesavealpha($newImg,true);
  6. $transparent = imagecolorallocatealpha($newImg, 255, 255, 255, 127);
  7. imagefilledrectangle($newImg, 0, 0, $nWidth, $nHeight, $transparent);
  8. imagecopyresampled($newImg, $im, 0, 0, 0, 0, $nWidth, $nHeight, $imgInfo[0], $imgInfo[1]);

Так что мою старую функцию можно доработать так, чтобы она сохраняла прозрачность картинок. Заодно и тип файла можно проверять не по расширению, а по тому, что вернет getimagesize (исходя из приведенного выше примера - это элемент $imgInfo[2]).

Постовой: Даже ребенок знает, что сделать сайт недостаточно, надо еще и найти качественный хостинг.
· No related posts

- Коментировать
- Trackback

3 Responses to “Изменяем размеры картинки с сохранением прозрачности (PHP+GD)”


  1. Memphys Says:

    Спасибо. Недавно столкнулся с подобной проблемой, но решение было не найдено, а необходимость исчезла в скором времени.) Теперь буду "вооружен" знанием)

  2. zael Says:

    не подскажете как тут изменить код чтоб фон превьюшки был прозрачным .

    спасибо.

  3. zael Says:

    пропал код - добавляю .

    Функция img_resize(): генерация thumbnails
    Параметры:
    $src - имя исходного файла
    $dest - имя генерируемого файла
    $width, $height - ширина и высота генерируемого изображения, в пикселях
    Необязательные параметры:
    $rgb - цвет фона, по умолчанию - белый
    $quality - качество генерируемого JPEG, по умолчанию - максимальное (100)
    ***********************************************************************************/
    function img_resize($src, $dest, $width, $height, $rgb=0xFFFFFF, $quality=95)
    {
    if (!file_exists($src)) return false;

    $size = getimagesize($src);

    if ($size === false) return false;

    // Определяем исходный формат по MIME-информации, предоставленной
    // функцией getimagesize, и выбираем соответствующую формату
    // imagecreatefrom-функцию.
    $format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
    $icfunc = "imagecreatefrom" . $format;
    if (!function_exists($icfunc)) return false;

    $x_ratio = $width / $size[0];
    $y_ratio = $height / $size[1];

    $ratio = min($x_ratio, $y_ratio);
    $use_x_ratio = ($x_ratio == $ratio);

    $new_width = $use_x_ratio ? $width : floor($size[0] * $ratio);
    $new_height = !$use_x_ratio ? $height : floor($size[1] * $ratio);
    $new_left = $use_x_ratio ? 0 : floor(($width - $new_width) / 2);
    $new_top = !$use_x_ratio ? 0 : floor(($height - $new_height) / 2);

    $isrc = $icfunc($src);
    $idest = imagecreatetruecolor($width, $height);

    imagefill($idest, 0, 0, $rgb);
    imagecopyresampled($idest, $isrc, $new_left, $new_top, 0, 0,
    $new_width, $new_height, $size[0], $size[1]);

    imagejpeg($idest, $dest, $quality);

    imagedestroy($isrc);
    imagedestroy($idest);

    return true;

Leave a Reply

code