【问题标题】:How to get image whole pixel's RGB color with ImageMagick?如何使用 ImageMagick 获取图像整个像素的 RGB 颜色?
【发布时间】:2014-10-29 08:39:36
【问题描述】:

我是 ImageMagick 的新手。

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

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

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

对每一个像素执行每条命令太重了,用不着。

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

#x,y={R,G,B}
1,1={100,230,105},
1,2={100,230,105},
1,3={100,230,135},
...
...

【问题讨论】:

  • 什么平台/操作系统?什么编程语言?还是命令行?您总体上想做什么?
  • linux/CentOS 和 JAVA。我将在 JAVA 中调用执行命令行。我想确定一张图像仅由一种颜色组成。(单色图像)

标签: imagemagick


【解决方案1】:

更多选择

如果您想在大量图像中分摊运行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

我将它放大以便你可以看到它:

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

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

【讨论】:

  • 谢谢~这就是我想要的。 =====> 转换 YourImage.jpg -depth 8 txt:-
  • 但是!不幸的是,它非常非常慢。
  • 哦,这很简单。等几分钟。
  • 我添加了更多选项 - 再看看并告诉我你的进展情况。
  • 我的程序不能等这么久。进程需要至少结束 15 秒。所以我尝试使用JMagick,im4java来使用ImageMagicK。谢谢。
【解决方案2】:

ImageMagick 中有一个更新的选项,速度非常快。它类似于 txt: 但将数据列为逗号分隔的三元组 (x,y,color 其中颜色是颜色名称或 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 2020-12-22
    • 2017-11-08
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多