Ruby on rails Rails 5 Carrierwave和MiniMagick在调整缩略图大小时会打断gif
我正在使用carrierwave和mini_magick调整图像大小,生成缩略图。它适用于静止图像,如jpg和png,但当我尝试gif时,它会扭曲图像。您可以在下面的示例中看到原始与调整大小的对比。你知道我如何让它在不破坏它的情况下生成gif拇指吗 原始GIF:) 生成的缩略图GIF:(Ruby on rails Rails 5 Carrierwave和MiniMagick在调整缩略图大小时会打断gif,ruby-on-rails,ruby-on-rails-5,carrierwave,gif,minimagick,Ruby On Rails,Ruby On Rails 5,Carrierwave,Gif,Minimagick,我正在使用carrierwave和mini_magick调整图像大小,生成缩略图。它适用于静止图像,如jpg和png,但当我尝试gif时,它会扭曲图像。您可以在下面的示例中看到原始与调整大小的对比。你知道我如何让它在不破坏它的情况下生成gif拇指吗 原始GIF:) 生成的缩略图GIF:( ps为什么缩略图的大小比原件大?原件是800*600px,缩略图是400*300px。无论如何,生成缩略图的关键是文件大小更小。 谢谢大家! image_uploader.rb class ImageUp
ps为什么缩略图的大小比原件大?原件是800*600px,缩略图是400*300px。无论如何,生成缩略图的关键是文件大小更小。 谢谢大家!
image_uploader.rb
class ImageUploader < CarrierWave::Uploader::Base
# Include RMagick or MiniMagick support:
# include CarrierWave::RMagick
include CarrierWave::MiniMagick
# Choose what kind of storage to use for this uploader:
storage :file
# storage :fog
# Override the directory where uploaded files will be stored.
# This is a sensible default for uploaders that are meant to be mounted:
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
# Provide a default URL as a default if there hasn't been a file uploaded:
# def default_url(*args)
# # For Rails 3.1+ asset pipeline compatibility:
# # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
#
# "/images/fallback/" + [version_name, "default.png"].compact.join('_')
# end
def default_url(*args)
ActionController::Base.helpers.asset_path("fallback/" + [version_name, "post.jpg"].compact.join('_'))
end
# Process files as they are uploaded:
# process scale: [800, 600]
# process :resize_to_fit => [800, 600]
#
# def scale(width, height)
# # do something
# end
# Create different versions of your uploaded files:
# version :thumb do
# process resize_to_fit: [50, 50]
# end
version :thumb do
process resize_to_fit: [400, 300]
end
# Add a white list of extensions which are allowed to be uploaded.
# For images you might use something like this:
def extension_whitelist
%w(jpg jpeg gif png)
end
# Override the filename of the uploaded files:
# Avoid using model.id or version_name here, see uploader/store.rb for details.
# def filename
# "something.jpg" if original_filename
# end
end
class ImageUploader[800600]
#
#def刻度(宽度、高度)
#做点什么
#结束
#创建上载文件的不同版本:
#版本:thumb do
#处理大小调整到合适的大小:[50,50]
#结束
版本:thumb do
处理大小调整到合适的大小:[400300]
终止
#添加允许上载的扩展的白名单。
#对于图像,您可以使用以下内容:
def扩展_白名单
%w(jpg jpeg gif png)
终止
#覆盖上载文件的文件名:
#避免在此处使用model.id或version\u名称,有关详细信息,请参阅uploader/store.rb。
#def文件名
#“something.jpg”如果是原始文件名
#结束
终止
您尝试调整大小的gif经过优化,以便在第一帧之后,每个后续帧仅包含需要更改的像素。当gif动画制作时,这些帧相互堆叠,从而创建完整的动画
此外,每个帧的大小仅足以包含需要更改的像素。因此,每个帧的大小是不同的。当您调整gif大小时,Imagemagick将每个帧的大小调整为400 x 300px,而不管其原始大小如何,这会导致您看到的失真
您可以使用名为coalesce
的Imagemagick命令(使用Ruby中的Minimagick绑定)修复此问题。它会对原始图像进行去优化,使每个帧都是画布的完整大小
调用coalesce
会使文件大得多,因此在调整完gif的大小后,有必要对其进行重新优化
下面是一个例子:
version :thumb do
process my_resize: [400, 300]
end
def my_resize(width, height)
if @file.content_type == "image/gif"
gif_safe_transform! do |image|
image.resize "#{width}x#{height}" # Perform any transformations here.
end
else
# Process other filetypes if necessary.
end
end
def gif_safe_transform!
MiniMagick::Tool::Convert.new do |image|
image << @file.path
image.coalesce # Remove optimizations so each layer shows the full image.
yield image
image.layers "Optimize" # Re-optimize the image.
image << @file.path
end
end
version:thumb-do
处理my_resize:[400300]
终止
定义我的大小(宽度、高度)
如果@file.content\u type==“image/gif”
gif_safe_transform!do|图像|
image.resize“#{width}x#{height}”在此处执行任何转换。
终止
其他的
#如有必要,处理其他文件类型。
终止
终止
def gif_安全_转换!
MiniMagick::工具::Convert.new do | image|
image您尝试调整大小的gif经过优化,以便在第一帧之后,每个后续帧仅包含需要更改的像素。当gif设置动画时,这些帧相互堆叠,从而创建完整的动画
此外,每个帧的大小仅足以包含需要更改的像素。因此,每个帧的大小是不同的。当您调整gif大小时,Imagemagick将每个帧的大小调整为400 x 300px,而不管其原始大小如何,这会导致您看到的失真
您可以使用名为coalesce
的Imagemagick命令(使用Ruby中的Minimagick绑定)修复此问题。它会对原始图像进行去优化,使每个帧都是画布的完整大小
调用coalesce
会使文件大得多,因此在调整完gif的大小后,有必要对其进行重新优化
下面是一个例子:
version :thumb do
process my_resize: [400, 300]
end
def my_resize(width, height)
if @file.content_type == "image/gif"
gif_safe_transform! do |image|
image.resize "#{width}x#{height}" # Perform any transformations here.
end
else
# Process other filetypes if necessary.
end
end
def gif_safe_transform!
MiniMagick::Tool::Convert.new do |image|
image << @file.path
image.coalesce # Remove optimizations so each layer shows the full image.
yield image
image.layers "Optimize" # Re-optimize the image.
image << @file.path
end
end
version:thumb-do
处理my_resize:[400300]
终止
定义我的大小(宽度、高度)
如果@file.content\u type==“image/gif”
gif_safe_transform!do|图像|
image.resize“#{width}x#{height}”在此处执行任何转换。
终止
其他的
#如有必要,处理其他文件类型。
终止
终止
def gif_安全_转换!
MiniMagick::工具::Convert.new do | image|
形象