2011-12-12 25 views
1

有一段时间,我试图将托管在Flickr上的图像转换为灰度。Rails,Canvas和Javascript - 将图像从Flickr转换为灰度

我试过javascript/canvas解决方案,但被same origin policy抓住了。 为此,有$.getImageData解决方案,但由于它取决于另一台服务器,我认为它不会很可靠。

我决定尝试转换服务器端的图像。使用Rails。

我的第一个选择是使用AciveSupport::Base64将图像转换为base64,然后在canvas上显示它们,然后使用javascript转换。这样我可能欺骗相同的来源政策。只是想知道每次有人加载该页面时,所有这种转换的速度有多慢。

另一种选择是使用类似Rmagick这样的技巧。但我不确定在将视图链接到某个位置之前是否可以使用RMagick而不将转换后的图像保存在某处。

对于这个解决方案我会很高兴,因为我是初学者,不知道这些实现可能有多么错误。

回答

0

只要在服务器上做到这一点。无论如何,相同的原产地策略迫使您使用某种服务器。 Rmagick没问题,之前我用它进行颜色(直方图)分析。也许去饱和是更优化库的候选者。

至于服务实际的图像,你不需要一个文件,图像本身是一个单独的GET命令(动作),需要你的服务器支持。所以它只能返回数据。这并不是说这总是最好的方法。

+0

谢谢,我会尝试在服务器上做到这一点。你有没有建议图书馆处理去饱和? – Gustavo

+0

不,但您需要公式将RGB转换为HSB,然后忽略S值。 – buddhabrot

0

只是在这里发布我如何实施解决方案。我决定为外部图像创建一种代理。通过这种方式,我不会陷入同一来源策略中,并且可以使用canvasjavascript以及许多可用脚本之一对图像进行去饱和处理。

在我的观点:

<%= image_tag "/proxy?url=#{photoset.flickr_thumb_url}", :class => "gray" %> 

在我的控制器:

def image_proxy 
    image_url = params[:url] 
    image = open(image_url).read 
    response.headers["Expires"] = CGI.rfc1123_date(Time.now + 1.day) 
    send_data image, :filename => File.basename(image_url), :disposition => 'inline' 
end 

我只是用事实恼火,任何图像,任何人通过使用这个网址会工作。这不是很安全,是吗?我仍然在想办法解决这个问题。我会很感激任何帮助。