0

我正在尝试使用RMagickChunky_PNG例如将每个像素的值读取为十六进制(HTML 表示法) #5DBCD2。目前我有以下哪种方法可以满足我的需求,但我找不到实际读取十六进制值的正确方法。不过我更喜欢用Chunky_PNG,谢谢!

require 'chunky_png'

img = ChunkyPNG::Image.from_file("image.png")

height = img.dimension.height
width  = img.dimension.width

height.times do |i|
  width.times do |j|
    p [ChunkyPNG::Color.r(img[j,i]), ChunkyPNG::Color.g(img[j,i]), ChunkyPNG::Color.b(img[j,i])]
  end
end

或者

require 'RMagick'
include Magick

image = ImageList.new("image.png")
(0..image.columns).each do |x|
  (0..image.rows).each do |y|
    pixel = image.pixel_color(x, y)
    p [pixel.red, pixel.green, pixel.blue]
  end
end
4

2 回答 2

1

如果使用 RMagick,您可以对每个像素颜色使用 to_s 方法来查找相应的十六进制值。这并不完全简单,但这篇博文解释了如何去做:

http://blog.kellishaver.com/image-color-analysis-with-rmagick/

于 2016-02-18T18:32:44.747 回答
1

有点笨拙的解决方案,但它应该可以解决问题。

require 'chunky_png'

img = ChunkyPNG::Image.from_file("image.png")

height = img.dimension.height
width  = img.dimension.width

height.times do |i|
  width.times do |j|
    arr = [ChunkyPNG::Color.r(img[j,i]), ChunkyPNG::Color.g(img[j,i]), ChunkyPNG::Color.b(img[j,i])]
    p "\##{arr.map {|x| x.to_s(16).rjust(2, '0')}.join.upcase}"
  end
end

例如,假设您想要 [204, 102, 0] 的值(转换为#cc6600),您可以使用以下代码。

"\##{[204, 102, 0].map {|x| x.to_s(16).rjust(2, '0')}.join.upcase}"
=> "#CC6600"

将其分解.to_s(16)为将整数转换为十六进制格式,.rjust(2, '0')如果字符串的长度与 2 个字符不匹配,则在前面加上“0”。

希望这可以帮助。

于 2016-02-18T18:29:41.997 回答