2010-12-15 99 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