经过一番调查后,我决定在我的新rails3应用上使用Carrierwave和mini_magick。
我已经设置好了它完美无缺。但是我有一个问题。我希望能够访问宽度和高度,所以我可以正确地形成html。但是,没有用于获取此信息的默认数据。由于它存储数据的方式,我无法想到任何可以将其添加到数据库的方式。
有人可以提出任何提示或想法吗?它甚至可能吗?
答案 0 :(得分: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
答案 1 :(得分:2)
仅仅是为了记录,我使用了类似的解决方案,但使用Mongo GridFS的文件,在这里:
def image
@image ||= MiniMagick::Image.read(Mongo::GridFileSystem.new(Mongoid.database).open(file.path, 'r'))
end
答案 2 :(得分:0)
height
或width
计算图片RMagick
/ MiniMagick
的缺点:
仅供参考你还可以在之后计算图像
Height
,Width
使用与之关联的load
事件完全加载图像 在jQuery的帮助下标记<img>
。
例如:
$(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
。
答案 3 :(得分:0)
我认为最好的方法是将图像尺寸存储在模型(数据库)中。
就我而言,型号名称为attachment
。然后我创建了一个迁移:
rails g migration add_dimensions_to_attachments image_width:integer image_height:integer
之后,运行迁移:
rake db:migrate
在我的Image Uploader文件app/uploaders/image_uploader.rb
中,我有:
class ImageUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
process :store_dimensions
private
def store_dimensions
if file && model
model.image_width, model.image_height = ::MiniMagick::Image.open(file.file)[:dimensions]
end
end
end
使用此功能,图像尺寸将保存在上传步骤中。
要获取尺寸,我只需运行attachment.image_width
或attachment.image_height
请参阅reference here。