有没有办法向ImageMagick传递RGBA数组以将其渲染为图像?

有没有办法向ImageMagick传递RGBA数组以将其渲染为图像?,imagemagick,imagemagick-convert,Imagemagick,Imagemagick Convert,这个问题几乎说明了一切 其思想是生成程序性PNG。我知道imageMagick的“-fx”操作符,但速度非常慢 一种解决方法是将我的数组保存到.bmp(基本上就是保存它),然后使用ImageMagick将.bmp转换为.png,但最好采用更直接的方法。您可以利用ImageMagick的TXT图像格式实现此目的。我不能告诉你关于性能的任何事情,你必须测试一下 首先尝试以下操作: convert some-small.png some-small-png.txt convert some-sm

这个问题几乎说明了一切

其思想是生成程序性PNG。我知道imageMagick的“-fx”操作符,但速度非常慢


一种解决方法是将我的数组保存到.bmp(基本上就是保存它),然后使用ImageMagick将.bmp转换为.png,但最好采用更直接的方法。

您可以利用ImageMagick的TXT图像格式实现此目的。我不能告诉你关于性能的任何事情,你必须测试一下

首先尝试以下操作:

convert  some-small.png  some-small-png.txt
convert  some-small.jpg  some-small-jpg.txt
convert  some-small.tif  some-small-tif.txt
[...]
(此转换也可能很慢。)

然后进行反向转换:

convert  some-small-png.txt  some-small-roundtripped.png
convert  some-small-png.txt  some-small-roundtripped.jpg
convert  some-small-png.txt  some-small-roundtripped.tif
[...]
(此转换应更快。)

比较初始的PNG、JPEG、TIFF和往返的

查看*.txt文件以了解其格式:

  • 它是一种正式的文本描述,逐行枚举每个像素的坐标和各自的颜色值
  • 第一行是描述图像尺寸、深度和使用的颜色空间的标题
  • 还要注意的是,在每一行上,
    #
    后面的所有内容(描述各自颜色的十六进制值)都不是必需的,您可以将其视为注释。此外,每行上的所有剩余空格都是可选的
这意味着您可以重新组织RGBA数组,使其与ImageMagick的TXT图像格式相匹配(正如我所说,您不需要十六进制值或友好的颜色名称),然后只需调用
convert
(添加所需的标题行后)


更新 我给你举个例子

这是一个极其简单的、没有空格、名称和颜色的#十六进制值的、2x2像素的sRGBA迷你图像,由
2x2.txt
表示。它的文件大小是129字节

cat 2x2.txt # ImageMagick pixel enumeration: 2,2,65535,srgba 0,0:(65535,0,0,65535) 0,1:(0,65535,0,65535) 1,0:(0,0,65535,65535) 1,1:(0,0,0,0)
2x2.png
为293字节。由于2x2像素的PNG有点太小,无法在网站上识别,我们可以转换为更大的:

convert 2x2.txt  -scale 10000%  200x200.png
convert 2x2.txt  -scale 1000%   20x20.png
这两个PNG可在网页上识别:

为了演示完整格式(不包括空格、名称或颜色的#十六进制值),让我们创建相应的20x20.txt并查看它:

convert 20x20.png 20x20.txt cat 20x20.txt # ImageMagick pixel enumeration: 20,20,255,srgba 0,0: (255, 0, 0,255) #FF0000 red 1,0: (255, 0, 0,255) #FF0000 red 2,0: (255, 0, 0,255) #FF0000 red 3,0: (255, 0, 0,255) #FF0000 red 4,0: (255, 0, 0,255) #FF0000 red 5,0: (255, 0, 0,255) #FF0000 red 6,0: (255, 0, 0,255) #FF0000 red 7,0: (255, 0, 0,255) #FF0000 red 8,0: (255, 0, 0,255) #FF0000 red 9,0: (255, 0, 0,255) #FF0000 red 10,0: ( 0, 0,255,255) #0000FF blue 11,0: ( 0, 0,255,255) #0000FF blue [....] [....] [....] 7,19: ( 0,255, 0,255) #00FF00 lime 8,19: ( 0,255, 0,255) #00FF00 lime 9,19: ( 0,255, 0,255) #00FF00 lime 10,19: ( 0, 0, 0, 0) #00000000 none 11,19: ( 0, 0, 0, 0) #00000000 none 12,19: ( 0, 0, 0, 0) #00000000 none 13,19: ( 0, 0, 0, 0) #00000000 none 14,19: ( 0, 0, 0, 0) #00000000 none 15,19: ( 0, 0, 0, 0) #00000000 none 16,19: ( 0, 0, 0, 0) #00000000 none 17,19: ( 0, 0, 0, 0) #00000000 none 18,19: ( 0, 0, 0, 0) #00000000 none 19,19: ( 0, 0, 0, 0) #00000000 none 转换20x20.png 20x20.txt cat 20x20.txt #ImageMagick像素计数:20,20255,srgba 0,0:(255,0,0255)#FF0000红色 1,0:(255,0,0255)#FF0000红色 2,0:(255,0,0255)#FF0000红色 3,0:(255,0,0255)#FF0000红色 4,0:(255,0,0255)#FF0000红色 5,0:(255,0,0255)#FF0000红色 6,0:(255,0,0255)#FF0000红色 7,0:(255,0,0255)#FF0000红色 8,0:(255,0,0255)#FF0000红色 9,0:(255,0,0255)#FF0000红色 10,0:(0,0255255)#0000FF蓝色 11,0:(0,0255255)#0000FF蓝色 [....] [....] [....] 7,19:(02550255)#00FF00石灰 8,19:(02550255)#00FF00石灰 9,19:(02550255)#00FF00石灰 10,19:(0,0,0,0)#00000000无 11,19:(0,0,0,0)#00000000无 12,19:(0,0,0,0)#00000000无 13,19:(0,0,0,0)#00000000无 14,19:(0,0,0,0)#00000000无 15,19:(0,0,0,0)#00000000无 16,19:(0,0,0,0)#00000000无 17,19:(0,0,0,0)#00000000无 18,19:(0,0,0,0)#00000000无 19,19:(0,0,0,0)#00000000无
回答得很好,谢谢。事实上,我已经习惯于使用rgba格式,阅读STDIN中的所有内容;因此,我调用了一个用C编写的程序,该程序输出字节,然后通过管道将它们传输到
convert-size WxH rgba:-output.ext
。我以这种方式实现了一些模糊过滤器,我很惊讶它们比imageMagick中运行模糊过滤器的速度快(10倍)。 convert 20x20.png 20x20.txt cat 20x20.txt # ImageMagick pixel enumeration: 20,20,255,srgba 0,0: (255, 0, 0,255) #FF0000 red 1,0: (255, 0, 0,255) #FF0000 red 2,0: (255, 0, 0,255) #FF0000 red 3,0: (255, 0, 0,255) #FF0000 red 4,0: (255, 0, 0,255) #FF0000 red 5,0: (255, 0, 0,255) #FF0000 red 6,0: (255, 0, 0,255) #FF0000 red 7,0: (255, 0, 0,255) #FF0000 red 8,0: (255, 0, 0,255) #FF0000 red 9,0: (255, 0, 0,255) #FF0000 red 10,0: ( 0, 0,255,255) #0000FF blue 11,0: ( 0, 0,255,255) #0000FF blue [....] [....] [....] 7,19: ( 0,255, 0,255) #00FF00 lime 8,19: ( 0,255, 0,255) #00FF00 lime 9,19: ( 0,255, 0,255) #00FF00 lime 10,19: ( 0, 0, 0, 0) #00000000 none 11,19: ( 0, 0, 0, 0) #00000000 none 12,19: ( 0, 0, 0, 0) #00000000 none 13,19: ( 0, 0, 0, 0) #00000000 none 14,19: ( 0, 0, 0, 0) #00000000 none 15,19: ( 0, 0, 0, 0) #00000000 none 16,19: ( 0, 0, 0, 0) #00000000 none 17,19: ( 0, 0, 0, 0) #00000000 none 18,19: ( 0, 0, 0, 0) #00000000 none 19,19: ( 0, 0, 0, 0) #00000000 none