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

rails 5-活动存储-变量-异常:“35;<minimagick::error:`mogrify-调整大小以适合[800,800]”

  •  4
  • Pascal  · 技术社区  · 7 年前

    /配置/应用.rb

    问题:

    class Api::V1::User::CurrentUserSerializer < Api::V1::User::BaseSerializer
      include Rails.application.routes.url_helpers
    
      attributes(
        [...]
        :avatar
        :created_at
      )
    
      def avatar
        if object.avatar.attachment
          avatar = {
            image: url_for( object.avatar ), # This one works
            thumb: url_for( object.avatar.variant(resize_to_fit: [800, 800]) ), # EXCEPTION
            thumb_test: url_for( object.avatar.variant(resize: '800x800') ) # Returns image of size: 640x800 (expected 800x800)
          }
        end
      end
    end
    

    exception: "<MiniMagick::Error: `mogrify -resize-to-fit [800, 800] /tmp/mini_magick20180625-19749-rghjbg.jpg` failed with error: mogrify.im6: unrecognized option `-resize-to-fit' @ error/mogrify.c/MogrifyImageCommand/5519. >"
    

    谢谢@George Claghorn

    https://prograils.com/posts/rails-5-2-active-storage-new-approach-to-file-uploads

    class ActiveStorageVariants
      class << self
        def resize_to_fill(width:, height:, blob:, gravity: 'Center')
          blob.analyze unless blob.analyzed?
    
          cols = blob.metadata[:width].to_f
          rows = blob.metadata[:height].to_f
          if width != cols || height != rows
            scale_x = width / cols
            scale_y = height / rows
            if scale_x >= scale_y
              cols = (scale_x * (cols + 0.5)).round
              resize = cols.to_s
            else
              rows = (scale_y * (rows + 0.5)).round
              resize = "x#{rows}"
            end
          end
    
          {
            resize: resize,
            gravity: gravity,
            background: 'rgba(255,255,255,0.0)',
            extent: cols != width || rows != height ? "#{width}x#{height}" : ''
          }.merge(optimize_hash(blob))
        end
      end
    end
    

    require 'active_storage_variants' # /lib/active_storage_variants.rb
    
    module Users::ActiveStorageVariants
    
      def avatar_thumbnail
        variation = ActiveStorage::Variation.new(
          ActiveStorageVariants.resize_to_fill(
            width: 300, height: 300, blob: avatar.blob
          )
        )
        ActiveStorage::Variant.new(avatar.blob, variation)
      end
    end
    

    /型号/用户.rb

    class User < ApplicationRecord
      ...
    
      ## Concerns
      include Users::ActiveStorageVariants
    
      ...
    end
    

    user.avatar_缩略图

    1 回复  |  直到 7 年前
        1
  •  6
  •   George Claghorn    7 年前

    resize_to_fit: [800, 800] ImageProcessing

    # Gemfile
    gem "rails", github: "rails/rails"