0

爱载波。

运行 recreate_version 时!原始图像的质量显着降低/损坏。

我需要使用carrierwave的recreate_version!通过 mount_uploader :image 将新的“移动”版本添加到现有的照片模型。

现有版本:原始版本、:card 和 :thumb

同样,在运行 recreate_version 时!原始图像的质量大大降低。

市长的原始图像损坏到应该丢弃并重新上传图像的地步。

:mobile 版本是从原始版本中重新创建的,质量上乘。

:card 和 :thumb 版本保持不变,没有区别。

只是原件损坏了。诡异的。

作为测试,我重新运行了 'photo.image.recreate_versions!(:mobile)' 几次以测试不同的参数,试图找出损坏的罪魁祸首(删除不需要的 gem,重新创建:thumb 版本等)。但是每次原始图像的质量都变得越来越差。

dpi 越高,腐败越快:300dpi 第一次通过超级丑陋,100dpi 两次通过恶心,三通后 72dpi 只是犯罪。

腐败发生在 localhost 以及 Heroku(暂存和生产)上。

诡异的。我已经使用 Carrierwave 多年了,这是第一次遇到这样的问题。

红宝石'2.4.1'

导轨'5.1.7'

gem 'carrierwave', :git => ' https://github.com/carrierwaveuploader/carrierwave.git '

这是设置。

我通过 Delayed_Job 一次将一个用户传递给carrierwave recreate_version

<% @user.photos.find_each do |photo| %>
  <% photo.delay.recreate_mobile %> 
<% end %>

在照片模型中

class Photo < ApplicationRecord
    def recreate_mobile
      self.image.recreate_versions!(:mobile) if self.image?
    end
end

并在 ImageUploader

class ImageUploader < CarrierWave::Uploader::Base

 include ::CarrierWave::Backgrounder::Delay
 include CarrierWave::MiniMagick
 include CarrierWave::BombShelter
 include CarrierWave::Processing::MiniMagick

  storage :aws

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  process resize_to_limit: [1350, 1350]

  process :store_dimensions

    version :mobile do
        process resize_to_limit: [400, 600]
    end

    version :card do
        process resize_to_limit: [300, 460]
    end

    version :thumb, from_version: :card do
        process resize_to_limit: [100, 150]
    end

  private

  def store_dimensions
    if file && model
      model.width, model.height = ::MiniMagick::Image.open(file.file)[:dimensions]
    end
  end

  def max_pixel_dimensions
    [6024, 6024]
  end

  def extension_white_list
    %w(jpg jpeg gif png)
  end

end

和宝石

gem 'carrierwave-aws'
gem 'carrierwave', :git => 'https://github.com/carrierwaveuploader/carrierwave.git'
gem 'carrierwave_backgrounder'
gem 'carrierwave-bombshelter'
gem 'carrierwave-processing'
gem 'mini_magick'
gem 'remotipart', '~> 1.2'

删除了所有不必要的宝石。仍然是图像损坏问题。

原始图像和所有版本的质量都非常好。

只是在运行 recreate_version 之后,原始图像已损坏。

关于如何在 recreate_version 之后防止原始图像质量损坏的任何想法?

4

1 回答 1

0

解决了:将处理切换到 RMagick

在 carriewave image_uploader.rb 文件中

代替:

包括 CarrierWave::MiniMagick

包括 CarrierWave::Processing::MiniMagick

和:

包括 CarrierWave::RMagick

包括 CarrierWave::Processing::RMagick

MiniMagick 被认为有更好的内存管理,但已经过时了。加上损坏的图像。手指交叉 RMagick 现在有更好的内存管理。

RMagick 为胜利而战!

于 2019-11-29T15:37:33.917 回答