Soru carrierwave kullanarak exif görüntü döndürme sorunu ve s3'e yüklemek için rmagick


Raylarım uygulamasında bir fotoğraf yükleme özelliği var. Uygulama, rmagick ve sis ile s3 üzerinden carrierwave'a yüklenir. Sorun şu ki, bir fotoğraf, "fotoğraf çekme seçeneği" aracılığıyla bir fotoğrafa mobil aracılığıyla yüklendiğinde (bunun iphone ile olduğuna dikkat edin ancak Android'in aynı sorunu yaşadığına inanıyorum). Yüklendikten sonra görüntü mobilde iyi görünüyor, ancak masaüstünde görüntülendiğinde görüntü 90 derece döndürülüyor.

Araştırmamla, exif ile ilgili bir sorun gibi görünüyor. Bu stackoverflow yanıtı 2 potansiyel çözümü özetlemektedir. Bu öz ayrıca umut verici görünüyor.

Şimdiye kadar yayınlanmış birkaç çözüm buldum ama hiçbiri işe yaramadı. İdeal olarak, fotoğrafın s3'e bir portre olarak kaydedilmesini istiyorum, sonra görüntüyü olduğu gibi göster.

Herhangi bir öneri iyi takdir edilmektedir.

Aşağıda benim kod

Uygulama / yükleyicilerden / image_uploader.rb

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

Uygulamanın / modeller / s3_image.rb

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

yapılandırma / başlatıcılar / carrierwave.rb

CarrierWave.configure do |config|
  config.fog_credentials = {
    provider: "AWS",
    aws_access_key_id: " ... ",
    aws_secret_access_key: " ... "
  }
  config.fog_directory = " ... "
end

btw bunu kullandım Railscast s3 yüklememi kurmak için bir rehber olarak.


25
2017-08-29 19:07


Menşei




Cevaplar:


Peki bunun yerine sis veya carrierwave_direct kullanarak çalışıyor.

Aşağıda benim için çalışma sona eren kod:

Uygulama / yükleyicilerden / 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

Uygulamanın / modeller / s3_image.rb

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

  belongs_to :user
end

ilklendiriciler / 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

33
2017-09-06 05:29



Neden tap? () - Jonathan Allard
Emin değilim... - lando2319
@JonathanAllard manipulate! blok bir görüntü istiyor ama image.auto_orient boş bir dize döndürür. image.tap(&:auto_orient) kabaca karşılık gelir image.auto_orient ; image. - benizi
Sadece kullanım sırasında benim için çalıştı img.tap(&:auto_orient!) (Patlama notu!). Ama ben de kullanıyorum CarrierWave::RMagick yerine CarrierWave::MiniMagick - Sandro L
Sumeet'in çözümü sadece versiyonlar için çalışıyor. Yüklenen orijinal görüntü hala döndürülüyor. @ Lando2319'daki bu çözüm hem orijinal görüntü hem de küçük resimler için çalışır. - jcuervo


Benzer bir problemim vardı ve sizinkiyle neredeyse aynı olan bir yaklaşımla çözdüm.

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

(Aramamaya dikkat edin auto_orient! - sadece auto_orientolmadan patlama.)

Sonra var process :auto_orient herhangi birinin ilk satırı olarak version Ben yaratırım. Örneğin:

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

14
2017-08-30 21:43



Öneri için teşekkürler, maalesef bu sorunumu gidermedi. - lando2319
Bunu sürümlerime ekledim, sonra sürümleri yeniden oluşturdum ve yan görüntü sorunlarını çözdüm. Şimdiye kadar sadece ios 7'de safari ile yüklenen imgelerle test ettim. Umarım tahtada çalışır. Teşekkürler. - wuliwong
Teşekkürler Sumeet, harika çalışıyor! - littleforest
@Sumeet Jain Aferin Sumeet - Amrinder Singh


Benim çözümüm (Sumeet'e oldukça benzer):

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

Bir görüntü döndürmek gerçekten çok önemli. Aksi takdirde, bir

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

5
2018-01-10 05:54



Çözümünüz benim için çalıştı, oysa Sumeet'in ne kadar benzer olmasına rağmen. Ayrıca, ihtiyaç ile ilgili ipucu için teşekkürler resmi döndür. Kayıt için benzer bir hata yaptım NoMethodError (undefined method 'destroy!' for "":String). - user664833


Lando2319'un cevabı benim için çalışmıyordu.

Ben RMagick kullanıyorum.

ImageMagick'in aşağıdakileri kullanarak doğru yönlendirmeyi (ve görüntüleyicinin çifte dönüşünü önlemek için EXIF ​​döndürme verilerini sıfırlamak) gerçekleştirmeyi başardım:

def fix_exif_rotation # put this before any other process in the Carrierwave uploader

manipulate! do |img|
  img.tap(&:auto_orient!)
end

Çözümüm ve Lando's arasındaki fark patlama (!). Benim durumumda kesinlikle gerekliydi.


1
2018-04-12 12:53