2011-12-12 71 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 

我只是用事實惱火,任何圖像,任何人通過使用這個網址會工作。這不是很安全,是嗎?我仍然在想辦法解決這個問題。我會很感激任何幫助。