爱carrierwave。
当运行recreate_version时!原始图像的质量大大降低/损坏。
我需要使用carrierwave的recreate_version!通过mount_uploader :image向现有的照片模型添加一个新的“移动”版本。
现有版本: original、:card和:thumb
同样,在运行recreate_version时!原始图像的质量会显著降低。
市长形象的原始损坏到了应该丢弃并重新上传的地步。
:mobile版本是从原来的版本中创建的,它的质量非常好。
而且:card和:thumb版本保持不变,没有区别。
只有原件被损坏了。真奇怪。
作为测试,我重新运行了几次'photo.image.recreate_versions!(:mobile)‘来测试不同的参数,试图抓住损坏的罪魁祸首(删除不需要的gems,重新创建:thumb版本等)。但每次原始图像的质量都变得越来越差。
dpi越高,腐败越快: 300dpi第一次通过超级丑陋,100dpi两次通过讨厌,三次通过后72dpi是犯罪。
本地主机和Heroku (登台和生产)上都会发生损坏。
真奇怪。我已经使用Carrierwave很多年了,这是第一次遇到这样的问题。
ruby '2.4.1‘
rails '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后的原始图像质量下降吗?
发布于 2019-11-29 23:37:34
解决了这个问题:将处理切换到RMagick
在carriewave image_uploader.rb文件中
替换:
包含CarrierWave::MiniMagick
包含CarrierWave::Processing::MiniMagick
通过以下方式:
包含CarrierWave::RMagick
包含CarrierWave::Processing::RMagick
MiniMagick被认为具有更好的内存管理,但已经相当过时了。Plus损坏了图像。祈祷RMagick现在有了更好的内存管理。
RMagick为胜利而战!
https://stackoverflow.com/questions/58787789
复制相似问题