PHP / GD: как работать с прозрачностью jpg? - PullRequest
0 голосов
/ 04 января 2019

JPG не поддерживает прозрачность.

Тем не менее, вы можете экспортировать изображение с прозрачными областями, например, из GIMP. В этом случае прозрачные области будут отображаться либо черным, либо белым цветом в вашем браузере, проводнике Windows или другом программном обеспечении.

Я регулярно получаю такие файлы, которые мне нужно обработать и предоставить в нескольких меньших форматах. Я делаю это с помощью PHP-скрипта, используя библиотеку GD. Проблема в том, что непредсказуемо, будут ли эти области черными или белыми в обработанных версиях. Даже белый фон может превратиться в черный.

Поэтому мой вопрос заключается в том, можно ли каким-то образом обнаружить эту "прозрачную" область в GD и назначить ей определенный цвет.

См., Например, эти два изображения: http://www.bilbil.com/9156-thickbox_default/bus.jpg http://bilbil.com/img/p/9/1/5/6/9156.jpg

В данный момент я использую этот код:

$srcfile = "9158.jpg";
$dir ="/test/";
list($width, $height, $imgtype, $attr) = @getimagesize( $dir.$srcfile );
$src = imagecreatefromjpeg($dir.$srcfile);
$newheight=$newwidth = 800;
$img = imagecreatetruecolor ( $newwidth , $newheight );
$white = imagecolorallocate($img, 255, 255, 255);
imagefill($img, 0, 0, $white);
imagecopyresampled($img, $src, ($newwidth-$width)/2, ($newheight-$height)/2, 0, 0, $width, $height, $width, $height);
if(!imagejpeg($img, $dir.'test.jpg', 97))
  echo("Error creating testimage");

Ответы [ 3 ]

0 голосов
/ 05 января 2019

Я не уверен, что вы спрашиваете. Вы начинаете с изображения не-JPG с прозрачностью и конвертируете в JPG? Или у вас уже есть JPG.

Если вы начинаете с прозрачного изображения, такого как PNG или TIFF, и хотите конвертировать в JPG и всегда иметь черный (или любой другой цвет) фон, то в Imagemagick вы можете сделать:

convert image.png -background black -alpha background -alpha off image.jpg


или

convert image.png -background black -flatten image.jpg


Замените черный на любой другой цвет, который вы хотите, чтобы он был прозрачным, например белый.

Если у вас уже есть JPG с каким-то цветом и вы хотите изменить его на черный, выполните:

convert image.jpg -fuzz XX% -fill black -opaque somecolor image.jpg


где XX% - это процент, который вы хотите считать близким к «somecolor», для которого вы хотите изменить «somecolor» и близлежащие цвета на черный.

Извините, я не знаю GD. Но я ожидаю, что он имеет аналогичную функциональность. Или вы можете использовать PHP Imagick, который построен на Imagemagick.

0 голосов
/ 05 января 2019

Почти во всех случаях вы можете использовать цвет верхнего левого пикселя в качестве прозрачного цвета.

0 голосов
/ 05 января 2019

Вы можете дать шанс ImageMagick . Следующая команда преобразует файл .jpeg в .png с прозрачностью.

convert bus.jpg \
    -alpha set -fill none -fuzz 1% \
    -bordercolor white -border 1 -draw 'color 0,0 floodfill' -shave 1x1 \
    -bordercolor black -border 1 -draw 'color 0,0 floodfill' -shave 1x1 \
    a.png

Вот как это работает:

  1. Добавить белую рамку вокруг всего изображения
  2. Залить белый цвет (и все цвета, похожие на него на 1%) прозрачным, начиная с верхнего левого угла
  3. Удалить лишнюю рамку вокруг изображения
  4. Добавить черную рамку вокруг всего изображения
  5. Залить черный цвет (и все цвета, похожие на него на 1%) прозрачным, начиная с верхнего левого угла
  6. Удалить лишнюю рамку вокруг изображения
  7. Записать изображение результата в файл a.png

А это фрагмент кода для PHP:

<?php

function jpg_to_png($jpg, $png)
{
$templ = trim("
convert {{jpg}} \
    -alpha set -fill none -fuzz 1% \
    -bordercolor white -border 1 -draw 'color 0,0 floodfill' -shave 1x1 \
    -bordercolor black -border 1 -draw 'color 0,0 floodfill' -shave 1x1 \
    {{png}}
");
    $cmd = strtr($templ, [
        '{{jpg}}' => escapeshellarg($jpg),
        '{{png}}' => escapeshellarg($png)
    ]);
    exec($cmd, $stdout, $exitcode);
    if ($exitcode) {
        throw new Error("Command failed with code $exitcode");
    }
}

jpg_to_png('bus.jpg', 'a.png');

Следующая команда ( ref ) также может быть полезна в вашем случае:

convert bus.jpg -fuzz 1% -trim +repage a.jpg

Удалит все «пробелы» из входного изображения.

...