2011-09-01 73 views
11

我ENV就是Linux CentOS的,并且使用Ruby 1.8.7,而代码是在这里如下:RMagick无法读取远程图像

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] 

一切都很好。 我跑识别-list格式,看看下面:

 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”

有人可以给我一些线索吗?先谢谢你。

+0

如果您复制并粘贴该网址并将其提供给wget,会发生什么情况? – Yahia

+0

@Yahia谢谢你的回复,我试过wget http://image.domain.com/images/random_bg/06.jpg,没关系。 – ywenbo

+0

看到我的答案在下面... – Yahia

回答

3

至于我可以看到Magick::Image.read不支持的URL,仅将文件/文件句柄 - 看到http://www.imagemagick.org/RMagick/doc/image1.html#read它说,它

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

它是由C函数ReadImage不支持网址实现 - 见线394 here ImageMagick的源。

,如果你想打开需要从你以某种方式下载图像URL的图像 - 到文件或流...那么你可以喂那个文件或流Magick...

+1

图片。现在读取支持直接从URL读取。 –

43

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 
6

快进到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上雪松堆栈(ImageMagick的6.5.7-8 2012年8月17日Q16)虽然。 :/

+0

如果您需要使用Image,然后执行上述操作,只需执行image = image_list.cur_image即可。 – bobbdelsol

+0

如果您的URL是HTTPS,就像我刚刚发现的那样,也不起作用。 – TGPrankster

+0

它对我来说是@TGPrankster。他们可能会在您发布后解决问题 – CoupDeMistral

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 

请注意,您应该额外小心处理来自open HTTP请求中出现的异常。也就是说,如果你得到404或非图像响应会发生什么?