5

我正在尝试使用 rmagick 和 rest-client 将带水印的图像发布到 url。当我生成合成图像时,我保存它(.write),用 File.new 读回它,然后发布那个 File 对象。不过,理想情况下,我想绕过写操作,因为我再也不需要这张照片了。有什么方法可以将 Magick::Image 对象转换为 File 对象,以便我可以使用 rest-client 发布它?

require 'rmagick'
require 'rest-client'

photo = Magick::Image.read('myphoto.jpg').first
water_mark = Magick::Image.read('watermark.png').first

result = photo.composite(water_mark, 0, 0, Magick::OverCompositeOp)
result.write('result.jpg')

file = File.new('result.jpg', 'rb')
RestClient.post("http://example.com", :source => file)
4

1 回答 1

6

我终于用 StringIO 和 Koala gem(Facebook API 的 ruby​​ 包装器)弄明白了。代码如下所示:

access_token = "asdfasdfasdfasdf"
graph = Koala::Facebook::API.new(access_token)
photo = Magick::Image.read("my_photo.jpg").first
watermark = Magick::Image.read("watermark.png").first
watermarked = photo.composite(watermark, 5, 5, Magick::OverCompositeOp)
photo_graph_id = StringIO.open(watermarked.to_blob) do |strio|
  response = graph.put_picture(strio, "image/jpeg", { "message" => "hi" })
  response['id']
end

关键是在 Magick::Image 上调用 to_blob,然后从该字符串创建一个 StringIO。当前版本的 Koala gem 与 StringIO 存在故障,但我已经在我的 fork 中修复了它并提交了一个拉取请求:

https://github.com/arsduo/koala/pull/122

于 2011-09-05T19:35:01.437 回答