2010-12-15 157 views
5

經過一番調查後,我決定在我的新rail3應用上使用Carrierwave和mini_magick。Carrierwave和mini_magick查找寬度和高度

我已經設置好了,它完美地工作。不過,我有一個問題是我想能夠訪問的寬度和高度,所以我可以正確地形成HTML。然而,沒有默認的信息,因爲它存儲數據的方式,我真的沒有什麼辦法可以加入數據庫。

有沒有人有任何提示或想法?它甚至有可能嗎?

回答

14
class Attachment 
    mount_uploader :file, FileUploader 

    def image 
    @image ||= MiniMagick::Image.open(file.path) 
    end 
end 

而且使用這樣的:

Attachment.first.image['width'] # => 400 
Attachment.first.image['height'] # => 300 
2

只是爲了記錄,我已經使用了類似的解決方案,但是使用與蒙戈GridFS的文件,這裏有雲:

def image 
    @image ||= MiniMagick::Image.read(Mongo::GridFileSystem.new(Mongoid.database).open(file.path, 'r')) 
    end 
0

在運行時使用RMagickMiniMagick計算圖像height/width的缺點

  • 它的CPU密集型
  • 它需要互聯網來獲取圖像,計算尺寸。
  • 它是一個緩慢的過程

僅供參考,您還可以計算圖像HeightWidth的 圖片後,通過使用與 <img>標籤使用jQuery的幫助相關的load事件滿載。

對於實例

$(document).ready(function(){ 
    var $image = $('.fixed-frame img'); 
    $image.load(function(){ 
     rePositionLogo($image); 
    }); 

    if($image.prop('complete')){ 
    rePositionLogo($image); 
    } 

}); 

function rePositionLogo($image){ 
    var height = $image.height(); 
    var width = $image.width(); 
    if (width > height) { 
    $image.parents('.header').addClass('landscape'); 
    var marginTop = (105 - $image.height())/2; 
    $image.css('margin-top', marginTop + 'px') 
    }else{ 
    $image.parents('.header').addClass('portrait'); 
    } 
} 

要小心,因爲在已經被加載圖像load()不會觸發。當圖像在用戶的瀏覽器中時,這很容易發生cache

您可以使用$('#myImage').prop('complete')檢查圖像是否已經加載,加載圖像時返回true