2012-05-31 6 views
4

Итак, у меня есть situtation с ImageMagick и php, где мне нужно обрабатывать каждый из RGB-каналов отдельно, а затем объединить их обратно в конечное изображение. Итак, в коде, который у меня ниже, $ red, $ green и $ blue - это каналы (как изображения с серой шкалой). Следующий код - это то, что я пробовал (и несколько вариантов), но каждый раз, когда я заканчиваю изображение, которое показывает только голубое, пурпурное или желтое. В этом случае результирующее изображение является голубым.Слияние каналов RGB обратно в одно изображение с ImageMagick (php)

$im->removeImage(); 
$im->addImage($red); 
$im->addImage($green); 
$im->addImage($blue); 
$img = $im->combineImages(self::CHANNEL_ALL); 

$im->removeImage(); 
$im->removeImage(); 
$im->removeImage(); 
$im->addImage($img); 

Я думаю, часть моей проблемы заключается в том, что документация PHP ничего не говорит о том, как использовать combineImages и нет образцов, насколько я могу найти. Поэтому очень вероятно, что я использую этот конкретный метод неправильно, и я подозреваю, что это связано с тем, как я совмещаю изображения в одном объекте Imagick для начала.

EDIT

Этот вопрос в конечном счете сводится к следующему: Как восстановить следующий сценарий, используя только PHP?

convert tmp_r.png tmp_g.png tmp_b.png -combine tmp_rgb.png 
+1

Я провел весь вечер, пытаясь работать, и я всегда получаю красное или серое изображение.Через несколько часов я начал думать, что addImage ошибочен, поскольку это похоже на анимацию gif. Я нашел сообщение на форуме Imagemagick, предлагая вместо этого компоновку. Я не могу понять, как работает Imagick, поскольку документация бесполезна и вводит в заблуждение. – Bonzo

+0

100% согласны с документацией .... – gregghz

+0

где вы нашли этот пост? – gregghz

ответ

3

Так что я думаю, что я понял, как заставить это работать. Недостающим элементом был вызов flattenImages(). Я не совсем уверен, почему это сработало, но, похоже, это то, что я искал. Вот код (имейте в виду, что $ это в контексте метода члена класса, который простирается Imagick):

$this->removeImage(); // gets rid of the old, unprocessed image 
$rgb = clone $this; 

$rgb->addImage($red); 
$rgb->addImage($green); 
$rgb->addImage($blue); 
$rgb->flattenImages(); // this is what was missing above 

$rgb = $rgb->combineImages(self::CHANNEL_ALL); 

$this->addImage($rgb); 

Может кто-нибудь прокомментировать, почему это может быть? Я ожидал, что flattenImages() объединит три изображения в один и уничтожит часть информации, но кажется, что он фактически сообщает ImageMagick обрабатывать все содержащиеся изображения вместе, тогда как он обрабатывал их независимо ранее.

+0

Я думаю, у меня есть ИДЕЯ. Пробовали ли вы отображать $ rgb БЕЗ выполнения подпрограммы combImages?Я думаю, что так или иначе происходит, что все $ red, $ green и $ blue изображения поступают как 24 или 32-битные изображения, где $ red имеет пиксели, идущие от 0x000000 до 0xFF0000, зеленый - от 0x000000 - 0x00FF00, а синий - от 0x000000 до 0x0000FF. Сглаживание изображения существенно добавляет слои. Поэтому вместо истинных оттенков серого они каким-то образом входят в RGB с выровненным цветом. Просто мысль :-) – trumpetlicks

+0

Интересная мысль, к сожалению, вызов combImages(), по-видимому, очень важен. Когда я пробовал это без этого звонка, я получаю полностью изображение в оттенках серого. combImages() - это секретный соус, который превращается в оттенки серого в цвет. – gregghz

+0

+1 - LOL, интересно, спасибо за обновление! – trumpetlicks

4

[EDIT] Я должен признать, глядя дальше в документации, я не уверен, что делает постоянное CHANNEL_ALL. Они заявляют, что вы можете объединить каналы, логически объединив их. Вы можете попробовать:

$ im-> combImages (imagick :: CHANNEL_RED | imagick :: CHANNEL_GREEN | imagick :: CHANNEL_BLUE);

[ОРИГИНАЛ] Я искал в это API, и честно, что я думаю, что вы ищете является функцией преобразования, НЕ функция комбайна.

Посмотрите на ниже приведенную ссылку и нажмите на специально «Объединяя RGB Channel Images» http://www.imagemagick.org/Usage/color_basics/

Попробуйте это, оставьте комментарий, если вам нужна дополнительная помощь :-)

+0

convert - это программа, которая предназначена для использования в командной строке. -combine - это специфическая функциональность конвертирования, которую я пытаюсь воспроизвести. – gregghz

+0

Вот почему я редактировал свой пост с помощью EDIT. попробуйте использовать конкатенацию трех цветных каналов s, а не CHANNEL_ALL в вызове, который вы уже делаете !!! – trumpetlicks

+0

Извините, поток вашего ответа немного искалечен, я запутался в том, что вы предлагали в первую очередь. Но да, я тоже пытался это сделать с теми же результатами. – gregghz

-1

Попробуйте это:

$im->addImage($red); 
$im->addImage($green); 
$im->addImage($blue); 
$im->combineImages(imagick::CHANNEL_RED | imagick::CHANNEL_GREEN | imagick::CHANNEL_BLUE); 

btw combImages не возвращает объект imagick, но true/false указывает на успех или неудачу, поэтому $im будет содержать ваше комбинированное изображение.

Edit: Видимо combineImages сосет большое время, так вот альтернатива: imagick::compositeImage

$im->compositeImage($red, imagick::COMPOSITE_COPY, 0, 0, imagick::CHANNEL_RED); 
$im->compositeImage($green, imagick::COMPOSITE_COPY, 0, 0, imagick::CHANNEL_GREEN); 
$im->compositeImage($blue, imagick::COMPOSITE_COPY, 0, 0, imagick::CHANNEL_BLUE); 
+0

согласно http://us2.php.net/manual/en/imagick.combineimages.php, combImages * does * возвращает объект Imagick, а не bool. Я пробовал это с помощью обоих методов, хотя и не повезло. Предполагая, что он возвращает bool, после вызова combImages, я получаю изображение в градациях серого (я предполагаю синий канал), и, полагая, что он возвращает Imagick, я получаю голубые затененные изображения. – gregghz

+0

Сама страница, с которой вы связались, имеет «Возвращает TRUE на успех». под меткой Return values. Добавлена ​​другая функция, которая может быть использована. – c2h5oh

+1

@ c2h5oh greggory.hz верен. 1) документы ужасны для расширения Imagemagick (все они скопированы/вставлены из документов MagickWand), 2) * описание * на этой странице указывает, что функция возвращает объект Imagick, 3) вам кажется, что действительно попробовали свой собственный код. – Crontab

Смежные вопросы