我目前正在将CarrierWave应用到我的应用中。我注意到的一个问题是,我上传的大多数图片无法正确生成缩略图大小(64x64)。
我使用resize_to_fit
和resize_to_fill
用于不同的版本,而resize_to_fill
(用于裁剪)在大多数情况下失败。
我在这里制作了两个版本,gallery和thumb。
// 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中打开拇指,它就完全是空白的。
我用一堆不同的图片对此进行了测试,大多数情况都是这样。但我确实注意到,如果我打开主图像,保存它(不做任何事情),然后重新创建版本,它已修复。必须是有关它如何被保存的东西。
以下是source image,我已经能够重现此问题。
感谢。
答案 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插件裁剪上传的图片,我还没试过。
我希望它有所帮助