新手问题 Ruby 在 Windows 下面有办法提取图片某一点像素的 RGB 值么?

jusdina_ · 2016年03月13日 · 最后由 jusdina_ 回复于 2016年03月14日 · 2289 次阅读

本人是一个建筑设计师,机缘巧合结识了代码的世界,于是深陷其中,撸的欲仙欲死,欲罢不能。。。。 -----------------------------------背景分割线------------------------------------- 建筑师的工作平台主要在 WINDOWS 下面,可能稍微了解的兄弟们会知道,工作过程中常用的软件就是 CAD, SKECHUP,PHOTOSHOP 等。。。 现在经济市场不好,建筑师都没什么事情做,于是,半年前我就疯狂学期了代码,先撸了 C,然后又撸了标准库。。。 最近忽然脑抽,想在自己常用的 sketchup 设计软件下面写几个插件给自己用,一方面可以提高工作效率,另外一方面,恩。装那啥。。。当然,锻炼自己的写代码能力也是一方面。。 但是 SKETCHUP 提供的接口语言是 RUBY。。。于是狂撸半月 RUBY,也大概理解了所谓的 OO 是啥。。。代码写的正 HIGH,有个问题难住了我,就是在提取图片长款像素个数的基础上,每个几个像素提取一下图片的 RGB 的值。当然,我知道我只需要一个类或者方法,弄个嵌套循环就 O 了。但是,我查遍了软件的 RUBY API 本身并没有提供这个类或者方法。于是就懵逼了,各种百度谷歌,得到的大概答案都是 RMAMAGICK 之类的库,但是 RMAMAGICK 大概只能在 LINUX 上用?然后我研究了一下 ruby 本身提供的 gem ,发现了两个库,一个 win32API 还有个 win32ole,貌似可以。win32API 提供的一个 GETPIXEL 的方法可以提取 RGB,但是它是使用在屏幕上的,win32ole 可以打开 word,ie,excel 等,我想,可能也可以打开 photoshop 或者 windows 的画图工具来提取。。。但是总是告诉我连接服务器失败,百度谷歌半天也没有合适的答案。。。结果一直懵逼了半个月不知道怎么办,7 天前注册 RUBY CHINA,焦虑等待这么久终于可以发帖了。。。

-------------------------------不知道问题讲清楚没了的分割线----------------

实在不好意思,做了伸手党,但是能否问下各位大神,能不能提供一个可行的方法,让我解决这个问题,已经被困半月之久。。。 http://www.sketchup.com/intl/en/developer/SKETCHUP 提供的 RUBY这是 API 接口的网页

http://rmagick.rubyforge.org/install-faq.html#win

Use the rmagick-win32 gem. This gem is bundled with a a copy of the ImageMagick Windows installer so you don't need to download your own copy. Download the rmagick-win32 gem from the RMagick project page on RubyForge, unzip it into a temporary directory, and follow the instructions in the README.html file you'll find in the package. (This gem is not for use with the Cygwin environment for Windows. See this question.)

嗯,需要相应的解析相应图片格式的库文件。你说的是不是 rmagic?没用过,我看 readme 可以在 windows 安装,估计需要编译。看了一下 Sketchup 的 api,有个 Sketchup::Color 类,应该是你需要的吧,里面有 red green blue 这三个方法。

简而言之,你是要解析位图(比如 PNG 格式),抽样获取像素点?然后开发环境是 Windows?

如果你说的是 PNG 文件的话,可以尝试下 ChunkyPng,这是纯 Ruby 编写的,没有啥依赖。至于别的,就看情况咯~

借助 rmagick 比较方便.

require 'RMagick'

class MyImage
  include Magick

  MAGIC = 257 # for 0..255 values.

  def initialize(image)
    @image = ImageList.new(image).first.quantize(number_colors = 256)
  end

  def color_of(x, y)
    color = @image.pixel_color(x, y)

    # return [R, G, B] in 0..255
    [color.red, color.green, color.blue].map { |n| n / MAGIC }
  end
end

m = MyImage.new('123.jpg')

puts m.color_of(1357, 905).inspect

测试了下大概可行. 具体代码

感谢楼上各位大神提供的各种思路,我尝试一下!!!!感激不尽!!!!!!!!

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册