2016-12-11 7 views
2

Я пытаюсь удалить альфа-канал (прозрачность) PNG-файла и заменить его на белом фоне в PHP.PHP: преобразовать альфа-канал на белый фон с ImageMagick

Использование ImageMagick Я пробовал несколько функций без везения. Это функция, которая не работает:

$iMagick->setImageAlphaChannel(Imagick::ALPHACHANNEL_DEACTIVATE); 
    $iMagick->setImageBackgroundColor('#FFFFFF'); 
    $iMagick = $iMagick->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN); 

Также setBackgroundColor('#FFFFFF') вместо setImageBackgroundColor('#FFFFFF') не помогло. То же самое касается замены '#FFFFFF' на 'white' в этих двух функциях.

Использование ImageMagick 3.4.0RC6 (дата выпуска: 2016-11-29), скомпилированное с ImageMagick 6.8.9-9 Q16 x86_64 2016-03-14. Текущие версии (Ubuntu 16.04).

Любые идеи? Заранее спасибо
ninsky

ответ

1

Просто опустить свою первую строку кода, который отключает прозрачность и работать с:

$iMagick->setImageBackgroundColor('#FFFFFF'); 
$iMagick = $iMagick->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN); 
+0

Я пробовал это и проверил с идентификатором Imagick -verbose. Got: «Глубина канала: красный: 8 бит, зеленый: 8 бит, синий: 8 бит, альфа: 1 бит. Прозрачный цвет: нет». Поэтому я думаю, что это сделал трюк. Благодаря! – ninsky

+0

Не могли бы вы объяснить, как это работает? – peter

+1

@peter Представьте стопку изображений, каждая из которых содержит в себе несколько прозрачных битов (прозрачные области). Во-первых, положите на стол белый лист бумаги, то есть «BackgroundColor (белый)», теперь лежат все остальные изображения с прозрачными областями сверху. Эффект nett - вы увидите белый цвет, все они прозрачны. –

1

Вот функция, которую я использую. Однако это не основано на ImageMagick. Взял его из другого ответа stackoverflow и настроил его только для раскрашивания прозрачных пикселей.

function colorizeTransparent($file, $targetR, $targetG, $targetB, $targetName) { 

     $im_src = imagecreatefrompng($file); 
     $width = imagesx($im_src); 
     $height = imagesy($im_src); 
     $im_dst = imagecreatefrompng($file); 

     for($x=0; $x<$width; $x++) { 
      for($y=0; $y<$height; $y++) { 
       $rgba = imagecolorat($im_src, $x, $y); 
       $alpha = ($rgba & 0x7F000000) >> 24; 
       if ($rgba == 0) { 
        $col = imagecolorallocatealpha($im_dst, 
         $targetR - (int) (1.0/255.0 * $alpha * (double) $targetR), 
         $targetG - (int) (1.0/255.0 * $alpha * (double) $targetG), 
         $targetB - (int) (1.0/255.0 * $alpha * (double) $targetB), 
         $alpha 
        ); 
       } else $col = $rgba; 
       imagesetpixel($im_dst, $x, $y, $col); 
      } 
     } 
     imagepng($im_dst, $targetName); 
    } 

Вызов функции таким образом:

colorizeTransparent($sourceImage, 0xFF, 0xFF, 0xFF, $colorizedImage); 

С $ sourceImage является имя исходного файла и $ colorizedImage быть имя файла назначения.

Сообщите мне, как это сработало для вас.

+0

Спасибо. Не тестировал его, поскольку я хочу придерживаться функций Imagick. Спасибо, в любом случае. – ninsky