首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >carrierwave recreate_versions!损坏原始图像

carrierwave recreate_versions!损坏原始图像
EN

Stack Overflow用户
提问于 2019-11-10 18:34:41
回答 1查看 159关注 0票数 0

爱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的调用

代码语言:javascript
复制
<% @user.photos.find_each do |photo| %>
  <% photo.delay.recreate_mobile %> 
<% end %>

在照片模型中

代码语言:javascript
复制
class Photo < ApplicationRecord
    def recreate_mobile
      self.image.recreate_versions!(:mobile) if self.image?
    end
end

在ImageUploader中

代码语言:javascript
复制
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

和宝石

代码语言:javascript
复制
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后的原始图像质量下降吗?

EN

回答 1

Stack Overflow用户

发布于 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为胜利而战!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58787789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档