Скрепка получить реальный размер изображения - PullRequest
1 голос
/ 20 июля 2011

Моя проблема заключается в следующем:

Я пытаюсь изменить размер изображения в зависимости от пропорционального размера. Пример Если у меня есть изображение размером 1440 * 1000, его новый размер будет 648 * 440 (я использую пропорцию в зависимости от max_size)

ПРИМЕЧАНИЕ. Затем я публикую свой код, чтобы вы поняли соотношение размеров.

Хорошо. так что я читаю этот пост stackoverflow:

Получение ширины и высоты изображения в модели в Ruby Paperclip GEM

Теперь я опубликую свой код, а затем опишу мою проблему.

 class ProductImage < ActiveRecord::Base
      belongs_to :product, :dependent => :destroy

      MAXIMUM_SIZE = 650

      has_attached_file :photo, :url => "/:attachment/:class/:id/:style_:basename.:extension", :styles => {:real_size => Proc.new { |instance| instance.real_size }, :original => "400x400>", :medium => "300x300>", :principal => "240x240>", :thumb => "100x100>", :small => "80x50>"}

     def real_size
        #image = Paperclip::Geometry.from_file(photo.to_file(:maximum_size))
        #OBTAIN REAL IMAGE SIZE, NOT ATTACHMENT SIZES
if image_less_than_maximum_size?
          return "#{image.width}x#{image.height}"
        else
          return adjust_image_size(self.width, self.height)
        end
      end

      def adjust_image_size(image_width, image_height)
        ratio                           = (image_width/image_height).to_f
        difference_between_size         = (image_width - image_height).abs
        percentage_difference           = ratio > 1 ? difference_between_size * 100.0 / image_width : difference_between_size * 100.0 / image_height
        difference_respect_maximum_size = ratio > 1 ? MAXIMUM_SIZE * 100.0 / image_width : MAXIMUM_SIZE * 100.0 / image_height
        width                           = height = 0.0

        if ratio > 1
          #USE 101.0 FOR INCREMENT OR DECREMENT THE VALUE A LITTLE BIT
          width  = image_width * difference_respect_maximum_size / 101.0
          height = width - (percentage_difference * width / 101.0)
        else
          heigth = image_height * difference_respect_maximum_size / 101.0
          width  = height - (percentage_difference * height / 101.0)
        end

        return "#{width}x#{height}"
      end

      def image_less_than_maximum_size?
        if self.width > self.height
          return self.width < MAXIMUM_SIZE
        else
          return self.height < MAXIMUM_SIZE
        end
      end
    end

Моя проблема в том, как я могу получить "real_size" ?. то есть, если размер изображения равен "1440 * 1000", чтобы получить этот размер (без размера вложения)

UPDATE:

Я думаю о решении. Так что я думаю, объявить две временные переменные для ProductImage модель и во время initialize метод использовать before_post_process обратный вызов скрепки.

    class ProductImage < ActiveRecord::Base
      belongs_to :product, :dependent => :destroy
      attr_accessor :height, :width

      MAXIMUM_SIZE = 650

      has_attached_file :photo, :url => "/:attachment/:class/:id/:style_:basename.:extension", :styles => {:real_size => Proc.new { |instance| instance.real_size }, :original => "400x400>", :medium => "300x300>", :principal => "240x240>", :thumb => "100x100>", :small => "80x50>"}
      before_post_process :image?
      before_post_process :assign_size

    ...

    def assign_size
            @width = Paperclip::Geometry.from_file(remote_original_photo_path).width
            @height = Paperclip::Geometry.from_file(remote_original_photo_path).height
    end

end

Тогда я мог бы использовать этот размер в другом методе.

Моя новая проблема: как я могу определить remote_original_photo_path в модели?

в контроллере я использую params[:product][:product_images_attributes][index][:photo].

Я мог бы сохранить временный путь в модели. Однако, поскольку мой real_size метод во время инициализации, я не знаю, как передать params информацию.

Еще раз спасибо заранее

1 Ответ

2 голосов
/ 20 июля 2011

С использованием такого драгоценного камня, как image_size ?

[EDIT]

Чтобы определить исходный путь загрузки, вы можете использовать:

remote_original_photo_path  = File.basename(upload['datafile'].original_path)
...