Railsアプリに写真のアップロード機能があります。アプリはrmagickとfogを介してcarrierwaveを介してs3に直接アップロードします。私が抱えている問題は、写真がモバイルを介して縦向きの「写真を撮るオプション」(これはiphoneの場合ですが、Androidでも同じ問題があると思います)。アップロードすると、モバイルでは画像は正常に表示されますが、デスクトップで表示すると画像が表示されます) 90度回転しました。
私の調査では、exifの問題のようです。この stackoverflowレスポンダー 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
ところで、私はこれを使用しました Railscast s3アップロードを設定するためのガイドとして。
代わりにfogまたはcarrierwave_directを使用してこれを機能させました。
以下は私のために働くことになったコードです:
app/uploaders/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
app/models/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
私も同様の問題を抱えていて、あなたとほぼ同じアプローチで修正しました。
# In the uploader:
def auto_orient
manipulate! do |img|
img = img.auto_orient
end
end
(私はauto_orient!
を呼び出していないことに注意してくださいbangなしでauto_orient
だけを呼び出します。)
次に、作成したversion
の最初の行としてprocess :auto_orient
を使用します。例えば:
version :square do
process :auto_orient
process :resize_to_fill => [600, 600]
end
私の解決策(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):
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
私のソリューションとLandoのソリューションの違いは、強打(!)です。私の場合、それは絶対に必要でした。