carrierwave recreate_versions!破坏原始图像



爱的载体。

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

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

现有版本:原件,:卡片和:拇指

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

市长的图像损坏了原来的点,图像应该被丢弃并重新上传。

:手机版是从原来的基础上创造出来的,质量非常好。

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

只是原件被损坏了。奇怪的

作为测试,我重新运行了"photo.image.recreate_versions!"(:mobile("多次测试不同的参数,试图抓住腐败的罪魁祸首(删除不需要的宝石,重新创建:拇指版本等(。但每次原始图像的质量都变得越来越差。

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

本地主机以及Heroku(包括暂存和生产(上都会发生损坏。

奇怪。我已经使用Carrierwave很多年了,这是第一次出现这样的问题。

ruby‘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之后,原始映像才被损坏。

关于如何防止重新创建版本后原始图像质量损坏,有什么想法吗?

解决了它:将处理切换到RMagick

在carriewave image_uploader.rb文件中

替换:

包括CarrierWave::MiniMagick

包括载波::处理::MiniMagick

带有:

包括CarrierWave::RMagick

包括CarrierWave::处理::RMagick

MiniMagick被认为具有更好的内存管理,但已经过时了。Plus已损坏图像。但愿RMagick现在有更好的内存管理。

RMagick获胜!

最新更新