2017-02-05 3 views
1

Я в настоящее время внедряю CarrierWave в свое приложение. Я заметил, что большинство загруженных изображений не позволяют правильно создать размер эскиза (64x64).Ruby on Rails - Carrierwave - Пустые/Пустые изображения с resize_to_fill

Я использую resize_to_fit и resize_to_fill для разных версий, и resize_to_fill (для обрезки) не работает большую часть времени.

Здесь я создал две версии, галерею и большой палец.

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, что я смог воспроизвести эту проблему.

Спасибо.

ответ

0

Очень странное поведение. Мне было очень интересно об этой проблеме, поэтому я сделал очень простой пример на своем dev. ссылка на машину Rates's Bates cropping images episode.

Вы можете просто следить, это может вам помочь.

Предположим, мы создали простой пользовательский эшафот, и у нас есть в наших полях БД: имя и: аватар типов строк.

В нашей модели пользователя мы будем монтировать загрузчик и создавать виртуальные атрибуты:

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

Метода создание в users_controller.rb будет выглядеть следующим образом (в том числе сильного Params):

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 

Мы можем создать в настоящее время crop.html.erb шаблон в папке views/users и заселить с кодом ниже:

<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.Еврорадио шаблон:

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

Я не включил в этом примере Jcrop library для обрезки изображений, это очень простой пример. В конце он должен обрезать 64x64 пикселей по умолчанию.

Существует также CarrierWave extension, чтобы обрезать загруженные изображения с помощью Jcrop-плагина с предварительным просмотром, который я не пробовал.

Надеюсь, это поможет

Смежные вопросы