我正在使用 GraphicsMagick (1.3.16) 和 im4java (1.4.0) 创建 GIF 的缩略图。在命令行中,我可以执行以下操作:
convert original.gif -coalesce -resize 100x100 +profile * thumb.gif
缩略图创建成功,保留动画。但是我的应用程序中的某些内容没有翻译,因为看似相同/相似的命令:
- -coalesce -resize 100x100 +profile * gif:-
创建仅捕获动画的单个图像的缩略图。注意:输入通过管道输入,输出捕获为 BufferedImage。
如果有帮助,这里是用于创建我正在使用的上述 cmd 的代码块:
public static BufferedImage createThumb(byte[] imageFileData)
{
GMOperation op = new GMOperation();
op.addImage("-"); // input: stdin
op.coalesce();
op.resize(100, 100);
op.p_profile("*");
op.addImage("gif:-"); // output: stdout
ConvertCmd cmd = new ConvertCmd(true); // use GraphicsMagick
// Pipe the fileData to stdin, to avoid writing to a file first.
ByteArrayInputStream bais = new ByteArrayInputStream(imageFileData);
Pipe pipeIn = new Pipe(bais, null);
cmd.setInputProvider(pipeIn);
// Capture output from stdout into an image.
Stream2BufferedImage s2b = new Stream2BufferedImage();
cmd.setOutputConsumer(s2b);
// Run the command.
cmd.run(op);
// Return the resulting image.
return s2b.getImage();
}
我错过了什么?!
编辑:有趣的是,当我改变
op.addImage("gif:-"); // output: stdout
至
// Save the file instead of returning the bytes
op.addImage("gif:C:\\Pictures\\thumb.gif");
图像是用动画正确创建的。
我还发现从 s2b.getImage() 返回的 byte[] 长度只有 4,8777 字节(作为单个图像的 gif),而使用直接文件路径成功创建的 gif thumb 是 190,512 字节,这让我相信问题在于命令/流的某些设置。