如何使用 ImageMagick 获取整个图像文本中的 RGB 像素值?

问题描述 投票:0回答:2

我是 ImageMagick 新手。

我想知道图像整个像素的RGB颜色。

我已经知道如何获取一个像素的 RGB 颜色了。

但我不知道如何用一个命令获取所有像素的数据。

对每个像素执行每个命令太繁重,无法使用。

最好的命令结果是这样的...

#x,y={R,G,B}
1,1={100,230,105},
1,2={100,230,105},
1,3={100,230,135},
...
...
imagemagick
2个回答
13
投票

进一步的选择

如果您想分摊在大量图像上运行

identify
的成本以获得更好的性能,您可以这样做 - 其中
%k
为您提供颜色数量,
%n
为您提供文件名:

identify -format "%k:%f\n" *.jpg

输出

290972:7T6Dj.jpg
3641:a.jpg
8349:b.jpg
3019:back.jpg
3122:background.jpg
83155:blion.jpg
35136:brDaP.jpg
37106:cartesian.jpg

Java 中必须有

system()
shell_exec()
popen()
可以运行它,以便您可以获得输出。

更新答案

如果您只是想检查图像是否仅由单一颜色组成,您可以要求 ImageMagick 计算颜色,如下所示(使用与下图相同的图像):

identify -format "%k" a.gif
3

我不确定你如何使用 Java 做到这一点,但在 Ruby 中你可以做到:

image["%[k]"]

在 Perl 中你可以:

my $image = Image::Magick->new;
$image->ReadImage("c.png");

print $image->Get("%[k]");

原答案

您没有提供有关您的环境、编程语言、应用程序或任何其他信息的详细信息,但是,这可能会帮助您入门。

让我们从命令行创建一个小图像,其中有 3 个正方形,每个 4x4 像素,一个红色,一个绿色和一个蓝色,全部位于水平行中:

convert -size 4x4 xc:red xc:green xc:blue +append a.gif

我将其放大以便您可以看到它:

enter image description here

现在,我们可以以文本格式查看:

convert -size 4x4 xc:red xc:green xc:blue +append -depth 8 txt:
# ImageMagick pixel enumeration: 12,4,255,srgb
0,0: (255,0,0)  #FF0000  red
1,0: (255,0,0)  #FF0000  red
2,0: (255,0,0)  #FF0000  red
3,0: (255,0,0)  #FF0000  red
4,0: (0,128,0)  #008000  green
5,0: (0,128,0)  #008000  green
6,0: (0,128,0)  #008000  green
7,0: (0,128,0)  #008000  green
8,0: (0,0,255)  #0000FF  blue
9,0: (0,0,255)  #0000FF  blue
10,0: (0,0,255)  #0000FF  blue
11,0: (0,0,255)  #0000FF  blue
0,1: (255,0,0)  #FF0000  red
1,1: (255,0,0)  #FF0000  red
2,1: (255,0,0)  #FF0000  red
3,1: (255,0,0)  #FF0000  red
4,1: (0,128,0)  #008000  green
5,1: (0,128,0)  #008000  green
6,1: (0,128,0)  #008000  green
7,1: (0,128,0)  #008000  green
8,1: (0,0,255)  #0000FF  blue
9,1: (0,0,255)  #0000FF  blue
10,1: (0,0,255)  #0000FF  blue
11,1: (0,0,255)  #0000FF  blue
0,2: (255,0,0)  #FF0000  red
1,2: (255,0,0)  #FF0000  red
2,2: (255,0,0)  #FF0000  red
3,2: (255,0,0)  #FF0000  red
4,2: (0,128,0)  #008000  green
5,2: (0,128,0)  #008000  green
6,2: (0,128,0)  #008000  green
7,2: (0,128,0)  #008000  green
8,2: (0,0,255)  #0000FF  blue
9,2: (0,0,255)  #0000FF  blue
10,2: (0,0,255)  #0000FF  blue
11,2: (0,0,255)  #0000FF  blue
0,3: (255,0,0)  #FF0000  red
1,3: (255,0,0)  #FF0000  red
2,3: (255,0,0)  #FF0000  red
3,3: (255,0,0)  #FF0000  red
4,3: (0,128,0)  #008000  green
5,3: (0,128,0)  #008000  green
6,3: (0,128,0)  #008000  green
7,3: (0,128,0)  #008000  green
8,3: (0,0,255)  #0000FF  blue
9,3: (0,0,255)  #0000FF  blue
10,3: (0,0,255)  #0000FF  blue
11,3: (0,0,255)  #0000FF  blue

但是你说获取一个 1 像素需要太长时间,因此你可以将图像转换为纯 RGB 值的文件并读取:

convert -size 4x4 xc:red xc:green xc:blue +append -depth 8 x.rgb

如果我们查看该文件,我们可以看到它有 144 个像素长,16 个红色像素,16 个绿色像素,16 个蓝色像素 - 因此总共 48 个像素 - 每个像素都有一个字节的 R、G 和 B。(48x3 =144)

ls -l x.rgb
-rw-r--r--  1 mark  staff  144 29 Oct 11:06 x.rgb

ImageMagick 使用文件扩展名来确定格式,

rgb
表示
RGB
!。如果你想使用与
.rgb
不同的扩展名,你可以这样告诉ImageMagick:

convert -size 4x4 xc:red xc:green xc:blue +append -depth 8 RGB:x.raw

现在让我们看看十六进制文件:

xxd -g3 -c12 x.rgb
0000000: ff0000 ff0000 ff0000 ff0000  ............
000000c: 008000 008000 008000 008000  ............
0000018: 0000ff 0000ff 0000ff 0000ff  ............
0000024: ff0000 ff0000 ff0000 ff0000  ............
0000030: 008000 008000 008000 008000  ............
000003c: 0000ff 0000ff 0000ff 0000ff  ............
0000048: ff0000 ff0000 ff0000 ff0000  ............
0000054: 008000 008000 008000 008000  ............
0000060: 0000ff 0000ff 0000ff 0000ff  ............
000006c: ff0000 ff0000 ff0000 ff0000  ............
0000078: 008000 008000 008000 008000  ............
0000084: 0000ff 0000ff 0000ff 0000ff  ............

希望你能看到第一行是 4 个红色像素,第二行是 4 个绿色像素...

所以,简而言之,如果您只想将图像中的纯二进制数据读取到 C 程序中,您可以这样做:

convert YourImage.jpg -depth 8 RGB:- | YourProgram

8
投票

ImageMagick 有一个更新的选项,速度非常快。它与 txt 类似:但将数据列为逗号分隔的三元组(x,y,颜色,其中颜色是颜色名称或 rgb(rr,gg,bb)。使用 Mark 的红色,绿色,蓝色图像:

time convert WM9qM.gif sparse-color:

0,0,red 1,0,red 2,0,red 3,0,red 4,0,red 5,0,red 6,0,red 7,0,red 8,0,red 9,0,red 10,0,red 11,0,red 12,0,red 13,0,red 14,0,red 15,0,red 16,0,red 17,0,red 18,0,red 19,0,red 20,0,red 21,0,red 22,0,red 23,0,red 24,0,red 25,0,red 26,0,red 27,0,red 28,0,red 29,0,red 30,0,red 31,0,red 32,0,green 33,0,green 34,0,green 35,0,green 36,0,green 37,0,green 38,0,green 39,0,green 40,0,green 41,0,green 42,0,green 43,0,green 44,0,green 45,0,green 46,0,green 47,0,green 48,0,green 49,0,green 50,0,green 51,0,green 52,0,green 53,0,green 54,0,green 55,0,green 56,0,green 57,0,green 58,0,green 59,0,green 60,0,green 61,0,green 62,0,green 63,0,green 64,0,blue 65,0,blue 66,0,blue 67,0,blue 68,0,blue 69,0,blue 70,0,blue 71,0,blue 72,0,blue 73,0,blue 74,0,blue 75,0,blue 76,0,blue 77,0,blue 78,0,blue 79,0,blue 80,0,blue 81,0,blue 82,0,blue 83,0,blue 84,0,blue 85,0,blue 86,0,blue 87,0,blue 88,0,blue 89,0,blue 90,0,blue 91,0,blue 92,0,blue 93,0,blue 94,0,blue 95,0,blue 0,1,red 1,1,red 2,1,red 3,1,red 4,1,red 5,1,red 6,1,red 7,1,red 8,1,red 9,1,red 10,1,red 11,1,red 12,1,red 13,1,red 14,1,red 15,1,red 16,1,red 17,1,red 18,1,red 19,1,red 20,1,red 21,1,red 22,1,red 23,1,red 24,1,red 25,1,red 26,1,red 27,1,red 28,1,red 29,1,red 30,1,red 31,1,red 32,1,green 33,1,green 34,1,green 35,1,green 36,1,green 37,1,green 38,1,green 39,1,green 40,1,green 41,1,green 42,1,green 43,1,green 44,1,green 45,1,green 46,1,green 47,1,green 48,1,green 49,1,green 50,1,green 51,1,green 52,1,green 53,1,green 54,1,green 55,1,green 56,1,green 57,1,green 58,1,green 59,1,green 60,1,green 61,1,green 62,1,green 63,1,green 64,1,blue 65,1,blue 66,1,blue 67,1,blue 68,1,blue 69,1,blue 70,1,blue 71,1,blue 72,1,blue 73,1,blue 74,1,blue 75,1,blue 76,1,blue 77,1,blue 78,1,blue 79,1,blue 80,1,blue 81,1,blue 82,1,blue 83,1,blue 84,1,blue 85,1,blue 86,1,blue 87,1,blue 88,1,blue 89,1,blue 90,1,blue 91,1,blue 92,1,blue 93,1,blue 94,1,blue 95,1,blue 0,2,red 1,2,red 2,2,red 3,2,red 4,2,red 5,2,red 6,2,red 7,2,red 8,2,red 9,2,red 10,2,red 11,2,red ....

real    0m0.035s
user    0m0.024s
sys 0m0.007s

如果你想要每个像素一行,你可以这样做

convert WM9qM.gif sparse-color: | tr " " "\n"

0,0,red
1,0,red
2,0,red
3,0,red
4,0,red
5,0,red
6,0,red
7,0,red
8,0,red
9,0,red
10,0,red
11,0,red
12,0,red
13,0,red
14,0,red
15,0,red
16,0,red
17,0,red
18,0,red
19,0,red
20,0,red
21,0,red
22,0,red
23,0,red
24,0,red
25,0,red
26,0,red
27,0,red
28,0,red
29,0,red
30,0,red
31,0,red
32,0,green
© www.soinside.com 2019 - 2024. All rights reserved.