복붙노트

[RUBY-ON-RAILS] 이미지 회전 문제 EXIF ​​S3에 업로드 carrierwave 및 rmagick를 사용하여

RUBY-ON-RAILS

이미지 회전 문제 EXIF ​​S3에 업로드 carrierwave 및 rmagick를 사용하여

내 레일 응용 프로그램에서 사진 업로드 기능을 가지고있다. 이 앱의 업로드 rmagick 안개를 통해 carrierwave를 통해 S3에 직접. 오전 데 문제는 사진을 통해 모바일을 통해 업로드 할 때입니다 세로 (주이 아이폰으로하지만 내가 믿는 안드로이드 같은 문제가) "사진 옵션을". 이미지가 바탕 화면에서 볼 그러나 때, 모바일에서 잘 나타납니다 업로드하면 이미지가 나타납니다 90도 회전.

내 연구를 통해이 EXIF의 문제로 보인다. 이 유래 응답자는 2 개 잠재적 인 솔루션을 설명합니다. 이 요점은 또한뿐만 아니라 유망 보인다.

지금까지 나는 몇 가지 솔루션을 게시 발견했지만 아무도 일하지했다. 이상적으로는 그대로 그럼 그냥 이미지를 표시, 사진은 세로로 S3에 저장하고 싶습니다.

모든 제안을 잘 부탁드립니다.

다음은 내 코드입니다

class ImageUploader < CarrierWave::Uploader::Base
  include CarrierWaveDirect::Uploader

  include CarrierWave::RMagick

  # Include the Sprockets helpers for Rails 3.1+ asset pipeline compatibility:
  include Sprockets::Helpers::RailsHelper
  include Sprockets::Helpers::IsolatedHelper

  include CarrierWave::MimeTypes
  process :fix_exif_rotation
  process :set_content_type


  version :thumb do
    process resize_to_fill: [200, 200]
  end

  def extension_white_list
    %w(jpg jpeg png)
  end


  def fix_exif_rotation #this is my attempted solution
    manipulate! do |img|
      img = img.auto_orient!
    end
  end


end
class S3Image < ActiveRecord::Base
  attr_accessible :image, :name, :user_id
  mount_uploader :image, ImageUploader

  belongs_to :user


  def image_name
    File.basename(image.path || image.filename) if image
  end


  class ImageWorker
    include Sidekiq::Worker

    def perform(id, key)
      s3_image = S3Image.find(id)
      s3_image.key = key
      s3_image.remote_image_url = s3_image.image.direct_fog_url(with_path: true)
      s3_image.save!
      s3_image.update_column(:image_processed, true)
    end
  end
end
CarrierWave.configure do |config|
  config.fog_credentials = {
    provider: "AWS",
    aws_access_key_id: " ... ",
    aws_secret_access_key: " ... "
  }
  config.fog_directory = " ... "
end

BTW 내 S3 업로드 설정을위한 가이드로이 Railscast을 사용했다.

해결법

  1. ==============================

    1.그럼 내가 대신 또는 carrierwave_direct 안개를 사용하여이 작업을 얻었다.

    그럼 내가 대신 또는 carrierwave_direct 안개를 사용하여이 작업을 얻었다.

    다음은 나를 위해 일하는 결국 코드입니다 :

    응용 프로그램 / 업 로더 / image_uploader.rb

    class ImageUploader < CarrierWave::Uploader::Base
       include CarrierWave::MiniMagick
    
       include Sprockets::Helpers::RailsHelper
       include Sprockets::Helpers::IsolatedHelper
    
       storage :fog
    
      # Override the directory where uploaded files will be stored.
      # This is a sensible default for uploaders that are meant to be mounted:
      def store_dir
        "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
      end
    
    
      def fix_exif_rotation #this is my attempted solution
        manipulate! do |img|
          img.tap(&:auto_orient)
        end
      end
    
      process :fix_exif_rotation
    end
    

    응용 프로그램 / 모델 / s3_image.rb

    class S3Image < ActiveRecord::Base
      attr_accessible :image, :name, :user_id, :image_cache
      mount_uploader :image, ImageUploader
    
      belongs_to :user
    end
    

    초기화 / carrierwave.rb

    CarrierWave.configure do |config|
      config.fog_credentials = {
        provider: "AWS",
        aws_access_key_id: " ... ",
        aws_secret_access_key: " ... ",
        region: 'us-west-2'
      }
      config.fog_directory = " ... "
    end
    
  2. ==============================

    2.나는 비슷한 문제를 가지고 있었고, 당신과 거의 동일한 접근 방식으로 고정.

    나는 비슷한 문제를 가지고 있었고, 당신과 거의 동일한 접근 방식으로 고정.

    # In the uploader:
    def auto_orient
      manipulate! do |img|
        img = img.auto_orient
      end
    end
    

    (주 나는 auto_orient를 호출하지 오전! - 단지 auto_orient을 강타없이.)

    내가 만드는 모든 버전의 첫 번째 줄과 같은 auto_orient : 그럼 난 과정이있다. 예를 들면 :

    version :square do
      process :auto_orient
      process :resize_to_fill => [600, 600]
    end
    
  3. ==============================

    3.(Sumeet 매우 유사) 내 솔루션 :

    (Sumeet 매우 유사) 내 솔루션 :

    # painting_uploader.rb
    process :right_orientation
    def right_orientation
      manipulate! do |img|
        img.auto_orient
        img
      end
    end
    

    그것은 이미지를 반환 정말 중요합니다. 그렇지 않으면, 당신은 얻을 것이다

    NoMethodError (undefined method `write' for "":String):
    
  4. ==============================

    4.Lando2319의 대답은 나를 위해 작동하지 않았다.

    Lando2319의 대답은 나를 위해 작동하지 않았다.

    나는 RMagick을 사용하고 있습니다.

    나는 ImageMagick이 올바른 방향을 적용 (뷰어로 이중 회전을 방지하기 위해 EXIF ​​회전 데이터를 재설정)을 사용하여 만들어 관리 :

    def fix_exif_rotation # put this before any other process in the Carrierwave uploader
    
    manipulate! do |img|
      img.tap(&:auto_orient!)
    end
    

    내 솔루션 및 랜도의 차이는 뱅이다 (!). 내 경우에는 그것은 절대적으로 필요했다.

  5. from https://stackoverflow.com/questions/18519160/exif-image-rotation-issue-using-carrierwave-and-rmagick-to-upload-to-s3 by cc-by-sa and MIT license