爱载波。
运行 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 之后防止原始图像质量损坏的任何想法?