Ruby on rails Rails 5 Carrierwave和MiniMagick在调整缩略图大小时会打断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

我正在使用carrierwave和mini_magick调整图像大小,生成缩略图。它适用于静止图像,如jpg和png,但当我尝试gif时,它会扭曲图像。您可以在下面的示例中看到原始与调整大小的对比。你知道我如何让它在不破坏它的情况下生成gif拇指吗

原始GIF:)

生成的缩略图GIF:(


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|
形象