英文:
How to multiply a color over every frame of a gif using Imagemagick
问题
我一直在尝试编写一个ImageMagick命令,该命令接受一个输入的GIF,将每一帧与命令中指定的十六进制颜色(包括透明通道)进行复合乘法合成,然后保存为新的GIF。
目标是通过该颜色着色整个GIF,而透明背景变成目标颜色。我已经在PHP中使用Imagick库实现了这个功能,但在我的环境和PHP版本下速度太慢。
我尝试过像这样的命令:magick input.gif -coalesce \( -size "300x311" xc:"#DEADFF" -compose multiply) output.gif
以及其他变体,包括在括号外进行合成等。尺寸已硬编码为正确的尺寸。
我还尝试过使用convert
,但是我尝试过的一切都没有奏效或者非常接近。
在PHP中的工作但速度慢的实现如下:
$targetColor = "#DEADFF";
$imagePath = "input.gif";
$image = new Imagick($imagePath);
$colorImage = new Imagick();
$colorImage->newImage($image->getImageWidth(), $image->getImageHeight(), new ImagickPixel($targetColor));
foreach($image as $frame) {
$frame->compositeImage($colorImage, Imagick::COMPOSITE_MULTIPLY, 0, 0, Imagick::CHANNEL_ALL);
}
header('Content-type: image/gif');
echo $image->getImagesBlob();
$image->clear();
$image->destroy();
英文:
I've been trying to write an imagemagick command that takes an input gif, composite multiplies every frame by a hex color specified in the command (on all channels including transparency), and then saves that new gif.
The goal is to tint the whole gif by the color, and the transparent background becomes the target color. I've gotten it working with the Imagick library in PHP, but it was too slow with my environment and PHP version.
I've tried commands like magick input.gif -coalesce \( -size "300x311"\ xc:"#DEADFF" -compose multiply) output.gif
As well as other variations, composing outside of the () and things like that. The size is hard coded to the correct sizes.
I've also tried using convert
but nothing I've tried has worked or gotten very close.
The working, but slow, implementation in PHP is
$targetColor = "#DEADFF";
$imagePath = "input.gif";
$image = new Imagick($imagePath);
$colorImage = new Imagick();
$colorImage->newImage($image->getImageWidth(), $image->getImageHeight(), new ImagickPixel($targetColor));
foreach($image as $frame) {
$frame->compositeImage($colorImage, Imagick::COMPOSITE_MULTIPLY, 0, 0, Imagick::CHANNEL_ALL);
}
header('Content-type: image/gif');
echo $image->getImagesBlob();
$image->clear();
$image->destroy();
答案1
得分: 2
也许这个Imagemagick命令可以满足您的需求。您需要使用null:分隔符和-layers composite参数。
magick input.gif -coalesce null: \( -size "300x311" xc:"#DEADFF" \) -compose multiply -layers composite -layers optimize output.gif
英文:
Perhaps this will do what you want in Imagemagick. You need to use the null: separator and -layers composite.
magick input.gif -coalesce null: \( -size "300x311" xc:"#DEADFF" \) -compose multiply -layers composite -layers optimize output.gif
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论