代码之家  ›  专栏  ›  技术社区  ›  Henri

Carrierwave:如何裁剪和调整大小,使最终图片的宽度和高度完全相同?

  •  5
  • Henri  · 技术社区  · 12 年前

    我使用的是带有carrierwave和Rmagick的Rails 3。 我想将图片的大小调整为192 x 135 起初这很简单,但直到现在我都没有尝试过。

    有人找到解决方案了吗?这是我的上传程序代码。

    class AvatarUploader < CarrierWave::Uploader::Base
    
       #Include RMagick or MiniMagick support:
      include CarrierWave::RMagick
      include CarrierWave::MiniMagick
    
      # Choose what kind of storage to use for this uploader:
      storage :file
      # storage :fog
    
      def store_dir
        "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
      end
    
    
      # Provide a default URL as a default if there hasn't been a file uploaded:
       def default_url
      #   # For Rails 3.1+ asset pipeline compatibility:
       ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
      #
      #   "/images/fallback/" + [version_name, "default.png"].compact.join('_')
       end
      process :resize_to_fit => [250, 250]
    
    
      # Process files as they are uploaded:
      # process :scale => [200, 300]
      #
      # def scale(width, height)
      #   # do something
      # end
    
      # Create different versions of your uploaded files:
       version :thumb do
         process :resize_to_fit => [200, 200]
       end
    
       version :medium do
           process :resize_to_fit => [250, 250]
        end
    
        version :mini do
            process :resize_to_fit => [100, nil]
            process crop: '100x100+0+0'
         end
    
         version :grid do
             process :resize_to_fit => [192, 135]
             process crop: '192x135+0+0'
          end
    
      # Add a white list of extensions which are allowed to be uploaded.
      # For images you might use something like this:
      # def extension_white_list
      #   %w(jpg jpeg gif png)
      # end
    
      # Override the filename of the uploaded files:
      # Avoid using model.id or version_name here, see uploader/store.rb for details.
      # def filename
      #   "something.jpg" if original_filename
      # end
    
      private
    
        # Simplest way
        def crop(geometry)
          manipulate! do |img|      
            img.crop(geometry)
            img
          end    
        end
    
        # Resize and crop square from Center
        def resize_and_crop(size)  
          manipulate! do |image|                 
            if image[:width] < image[:height]
              remove = ((image[:height] - image[:width])/2).round 
              image.shave("0x#{remove}") 
            elsif image[:width] > image[:height] 
              remove = ((image[:width] - image[:height])/2).round
              image.shave("#{remove}x0")
            end
            image.resize("#{size}x#{size}")
            image
          end
        end
    
    end
    
    1 回复  |  直到 12 年前
        1
  •  8
  •   Community Mohan Dere    9 年前

    更改线路

    process :resize_to_fit => [250, 250]
    

    process :resize_to_fill => [192, 135]
    

    我问了一个 similar question 大约一个月前。希望这能有所帮助!:)