4

我使用carrierwave,我有這樣的問題:一旦項目已交付您需要添加一個部分,其中在系統中的圖像需要用不同大小顯示 假設。我不想爲已經在系統中的每個圖像重新生成新維度。我希望能夠在視圖需要時生成(並緩存它)。例如:「/>。如果新的大小500x150已經存在,然後返回緩存的url,否則生成它並返回緩存的urlCarrierwave在飛行中調整

我喜歡很多Carrierwave,但不幸的是沒有任何動態調整大小功能大家都說它應該很簡單,加上這個功能,但是我幾乎找不到任何東西,唯一相當接近的就是這個上傳器https://gist.github.com/DAddYE/1541912 我不得不修改它以使其工作,所以這裏是我的版本

class ImageUploader < FileUploader 
    include CarrierWave::RMagick 

    #version :thumb do 
    # process :resize_to_fill => [100,100] 
    #end 
    # 
    #version :thumb_square do 
    # process :resize_to_fill => [100,100] 
    #end 
    # 
    #version :full do 
    # process :resize_to_fit => [550, 550] 
    #end 


    def re_size(string_size) 
    if self.file.nil? 
     return self 
    end 

    begun_at = Time.now 
    string_size.gsub!(/#/, '!') 
    uploader = Class.new(self.class) 
    uploader.versions.clear 
    uploader.version_names = [string_size] 
    img = uploader.new(model, mounted_as) 
    img.retrieve_from_store!(self.file.identifier) 
    cached = File.join(CarrierWave.root, img.url) 
    unless File.exist?(cached) 
     img.cache!(self) 

     img.send(:original_filename=, self.file.original_filename) 
     size = string_size.split(/x|!/).map(&:to_i) 
     resizer = case string_size 
        when /[!]/ then :resize_to_fit 
        # add more like when />/ then ... 
        else :resize_to_fill 
       end 
     img.send(resizer, *size) 
     FileUtils.mv(img.file.file, cached) 
     #img.store! 
    end 
    img 
    end 

    def extension_white_list 
    %w[jpg jpeg gif png] 
    end 

    def filename 
    Digest::MD5.hexdigest(original_filename) << File.extname(original_filename) if original_filename 
    end 

    def cache_dir 
    "#{Rails.root}/tmp/uploads" 
    end 

    def default_url 
    '/general/no-image.png' 
    end 
end 

與此版本的問題是,調用re_size明顯時(「100×100」)。網址,該網址被生成並返回前的實際大小的圖像是科瑞導致頁面中斷鏈接在後續刷新時顯示良好。

實現任何人願意分享更好的結果? :)

請不要告訴我切換到蜻蜓。我正在使用Carrierwave,我非常喜歡它。它也可以無縫集成RailsAdmin,這也是我的項目的一部分。

回答

0

你爲什麼不只是產生一個不同版本的圖像,如縮略圖?在你image_uploader.rb

# Create different versions of your uploaded files: 

include CarrierWave::RMagick 


version :thumb do 
    process :resize_to_limit => [100, 100] 
end 

然後在你看來只是叫

<%= image_tag nameofimage.image_url(:thumb).to_s %> 

你可以不調整原始圖像創建我們的原始圖像的多個版本。處理由RMagick完成,您需要安裝它。

RMagick需要你有ImageMagick的,所以你需要安裝爲好。這些可能會有點棘手的安裝和工作,但非常值得。另外,stackoverflow社區爲這個問題提供了很多幫助。

Error installing Rmagick on Mountain Lion

rmagick gem install "Can't find Magick-config"

+0

問題是大多數時候設計的非常差,我不知道確切的圖像尺寸超前發展的每次添加新的大小時產生縮放後的圖像無盡的再生或被發現。我需要一種方法來實時生成 – user711643

+0

以上內容將採用您的原始圖像,而不考慮尺寸,並將其尺寸調整到指定的尺寸限制。我不知道你'即時'的意思。 – ChrisBarthol

+1

我的意思是按需。假設項目交付後,您需要添加一個部分,系統中的圖像需要以不同的大小顯示。我不想爲已經在系統中的每個圖像重新生成新維度。我希望能夠在視圖需要時生成(並緩存它)。如:「/>。如果新的大小500x150已經存在,然後返回緩存的url,否則生成它並返回緩存的url – user711643