Ruby on Rails - Carrierwave - 使用resize_to_fill的空白/空图像

时间:2017-02-05 15:08:05

标签: ruby-on-rails ruby carrierwave

我目前正在将CarrierWave应用到我的应用中。我注意到的一个问题是,我上传的大多数图片无法正确生成缩略图大小(64x64)。

我使用resize_to_fitresize_to_fill用于不同的版本,而resize_to_fill(用于裁剪)在大多数情况下失败。

我在这里制作了两个版本,gallery和thumb。

explorer

// image_uploader.rb

class ImageUploader < CarrierWave::Uploader::Base
    include CarrierWave::MiniMagick

    storage :file

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


    version :gallery do
        process resize_to_fit: [400, 300]
    end

    version :thumb do
        process :resize_to_fill => [64, 64]
    end

    def extension_whitelist
        %w(jpg jpeg gif png)
    end
end

他们看起来正确;但是,如果你真的在Paint中打开拇指,它就完全是空白的。

enter image description here

我用一堆不同的图片对此进行了测试,大多数情况都是这样。但我确实注意到,如果我打开主图像,保存它(不做任何事情),然后重新创建版本,它已修复。必须是有关它如何被保存的东西。

以下是source image,我已经能够重现此问题。

感谢。

1 个答案:

答案 0 :(得分:0)

非常奇怪的行为。我对这个问题非常好奇,所以我在开发方面做了一个非常简单的例子。机器参考瑞恩的贝茨 cropping images episode

你可以跟进,它可能对你有帮助。

假设我们生成了简单的用户脚手架,我们在DB域中有:name和:字符串类型的头像。

在我们的用户模型中,我们将安装上传器并创建虚拟属性:

class User < ApplicationRecord
  mount_uploader :avatar, AvatarUploader
  attr_accessor :crop_x, :crop_y, :crop_w, :crop_h
end

users_controller.rb 中的方法创建将如下所示(包括强参数):

def create
  @user = User.new(user_params)
  if @user.save
    if params[:user][:avatar].present?
      render :crop  # Render crop template
    else
      redirect_to @user, notice: "Successfully created user."
    end
  else
    render :new
  end
end

# Strong params# Never trust parameters from the scary internet, only allow the white list through.
def user_params
  params.require(:user).permit!
end

您发布的 image_uploader.rb 很好。我将发布我的,因为我制作了大型和拇指版本并使用了resize_to_limit进程 而不是resize_to_fit

version :large do
  resize_to_limit(400, 300)
end

version :thumb do
  resize_to_fill(64, 64)
end

我们现在可以在views/users文件夹中创建 crop.html.erb 模板,并填写以下代码:

<h1>Crop Avatar</h1>

<%= image_tag @user.avatar_url(:large) %>

<h4>Preview</h4>
<div style="width:100px; height:100px; overflow:hidden">
  <%= image_tag @user.avatar.url(:large) %>
</div>

<%= form_for @user do |f| %>
  <% %w[x y w h].each do |attribute| %>
    <%= f.hidden_field "crop_#{attribute}" %>
  <% end %>
  <div class="actions">
    <%= f.submit "Crop" %>
  </div>
<% end %>

创建新用户表单时,它将具有头像附件。当您上传照片并提交照片时,它会触发 def create方法,它会检查是否显示了参数,并呈现 crop.html.erb 模板:

if params[:user][:avatar].present?
  render :crop  # Render crop template
else

我没有在此示例Jcrop library中包含裁剪图像,这是一个非常简单的示例。最后,它应裁剪64x64像素 默认情况下。

还有CarrierWave extension使用带预览的Jcrop插件裁剪上传的图片,我还没试过。

我希望它有所帮助