RMagick无法读取远程图片。

13

我的环境是Linux centos,使用的是ruby 1.8.7版本,以下是代码:

require 'rubygems'
require 'RMagick'
Magick::Image.read("http://image.domain.com/image.darenhui.com/images/random_bg/01.jpg")[0]

它会抛出以下错误:

in `read': no decode delegate for this image format `//image.domain.com/images/random_bg/01.jpg' @ error/constitute.c/ReadImage/532 (Magick::ImageMagickError), 

但是如果我从本地读取,像这样:

    require 'rubygems'
    require 'RMagick'
    Magick::Image.read("/local/staticimages/random_bg/01.jpg")[0]

一切都没问题。 我运行了identify -list format,看到以下内容:

     JPEG* JPEG      rw-   Joint Photographic Experts Group JFIF format (62)
     JPG* JPEG      rw-   Joint Photographic Experts Group JFIF format (62)

当我使用身份验证测试"http://image.domain.com/image.darenhui.com/images/random_bg/01.jpg"时失败,但对于"/local/staticimages/random_bg/01.jpg"成功了。

有人能给我一些线索吗?非常感谢。


如果您复制并粘贴该URL并将其提供给wget,会发生什么? - Yahia
@Yahia 感谢你的回复,我尝试了wget http://image.domain.com/images/random_bg/06.jpg,可以正常工作。 - ywenbo
5个回答

46

Magick::Image.read 不支持 URL 链接。但是您可以使用 Ruby 的open方法来读取远程图像:

 require 'rubygems'
 require 'RMagick'
 require "open-uri"


image = Magick::ImageList.new  
urlimage = open("http://www.jewelinfo4u.com/images/Gallery/ruby.jpg") # Image Remote URL 
image.from_blob(urlimage.read)

# crop = image.crop(10,10,200,300) You can crop this image too
# crop.write('C:/nameofyourNewImage.jpg') If you want to save the image you can use this line in windows 

7

快进到2014年5月,我能够轻松地...

require 'rubygems'
require 'RMagick'
include Magick
image = ImageList.new("http://www.jewelinfo4u.com/images/Gallery/ruby.jpg")

它只是能用。感觉很好。

(在ImageMagick 6.8.8-9 Q16上测试通过)

编辑:但在Heroku Cedar堆栈(ImageMagick 6.5.7-8 2012-08-17 Q16)上似乎无法工作, :/


如果你需要使用图像,那么只需执行上述操作,然后简单地执行image=image_list.cur_image即可。 - bobbdelsol
同样的方法在URL为HTTPS时也不起作用,我刚刚发现了。 - TWGerard
这对我有效,@TGPrankster。可能是因为你发布后他们修复了该问题。 - CoupDeMistral

6
据我所知,Magick::Image.read 不支持 URL,只支持文件或文件句柄 - 可以参见http://www.imagemagick.org/RMagick/doc/image1.html#read,其中指出:

从指定文件读取所有图像。

它是由 C 函数 ReadImage 实现的,其不支持 URL - 可以在这里查看 ImageMagick 源代码中第 394 行。

如果您想要从 URL 打开一个图片,则需要先将该图片下载到文件或流中... 然后您就可以将该文件或流提供给 Magick...


上面的链接已经失效了。这个问题需要一个更新后的被接受的答案。 - navraj

2
你可以使用open-uri从URL读取文件,然后将其输入到Rmagick的Image::from_blob中。
例如:
require 'open-uri'
require 'rubygems'
require 'Rmagick'

image_url = 'http://example.com/image.jpg'

image = Magick::Image.from_blob(open(image_url).read).first

请注意,您还应该特别注意处理由openHTTP请求引起的异常。也就是说,如果您收到404或非图像响应,会发生什么?

0
截至rmagick(4.1.2)Image.read支持URL链接。在我的情况下,我正在从AWS S3读取图像,特别是一个png文件。这是通过本地主机完成的。更新到最新版本应该可以解决这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接