6

アップロードされた画像の異なるバージョンを条件付きで作成する必要があります。Carrierwave がこの機能をサポートしていることは知っています。しかし、私の要件は少しトリッキーです。

アップロードされた画像ごとに、2 つのバージョンを作成する必要があり、条件に基づいて元の画像をスケーリングする必要があります。

以下のコードは、私がやろうとしていることをよりよく理解するのに役立ちます:

version :leftright, :if => :image?  do
  process :resize_to_fill => [667*2, 778*2] ,:if => :is_retina_resolution?
  process :resize_to_fill => [667, 778]  ,:if => !:is_retina_resolution?
end

version :updown, :if => :image?  do
  process :resize_to_fill => [1024*2, 487*2] ,:if => :is_retina_resolution?
  process :resize_to_fill => [1024, 487]  ,:if => !:is_retina_resolution?
end

#resize the original image
process :resize_to_fill => [1024*2, 768*2] ,:if => :is_retina_resolution?
process :resize_to_fill => [1024, 768]  ,:if => !:is_retina_resolution?

def is_retina_resolution?(new_file)
  image = MiniMagick::Image.open(new_file.file)
  true if image[:height] >= 1536 and image[:width] >= 2048
end

どうやらこれは機能していません。Carrierwave は次のエラーをスローします。

Errno::ENOENT - No such file or directory - #<ActionDispatch::Http::UploadedFile:0xe41d508>

そして、別のバリエーションを試しました:

version :leftright, :if => :image?  do
  if :is_retina_resolution?
    process :resize_to_fill => [667*2, 778*2]
  else
    process :resize_to_fill => [667, 778]
  end
end

version :updown, :if => :image?  do
  if :is_retina_resolution?
    process :resize_to_fill => [1024*2, 487*2]
  else
    process :resize_to_fill => [1024, 487]
  end
end

def is_retina_resolution?(new_file)
  image = MiniMagick::Image.open(new_file)
  true if image[:height] >= 1536 and image[:width] >= 2048
end

これはエラーをスローしません。retina sizeただし、常に(1番目の条件)で画像を生成します

そこで、もう 1 つのバリエーションを試しました。

version :leftright, :if => :image? && :is_retina_resolution  do
  process :resize_to_fill => [667*2, 778*2] 
end

version :leftright, :if => :image? && !:is_retina_resolution  do
  process :resize_to_fill => [667, 778] 
end

version :updown, :if => :image? && :is_retina_resolution  do
  process :resize_to_fill => [1024*2, 487*2]    
end

version :updown, :if => :image? && !:is_retina_resolution  do
  process :resize_to_fill => [1024, 487] 
end

これはエラーをスローせず、バージョンも作成しません。

誰かが私を助けることができますか?

アップデート:

@DMKE の提案に基づいて、この変更を行いました。今では正常に動作します。

version :leftright, :if => :image?  do
  process :resize_to_fill => [667*2, 778*2] ,:if => :is_retina_resolution?
  process :resize_to_fill => [667, 778]  ,:if => :is_not_retina_resolution?
end

version :updown, :if => :image?  do
  process :resize_to_fill => [1024*2, 487*2] ,:if => :is_retina_resolution?
  process :resize_to_fill => [1024, 487]  ,:if => :is_not_retina_resolution?    
end

#resize the original image
process :resize_to_fill => [1024*2, 768*2] ,:if => :image_and_retina?
process :resize_to_fill => [1024, 768]  ,:if => :image_and_not_retina?
process :if => :not_image?

def image_and_retina?(img)
  is_img = image? img
  return false unless is_img
  return is_retina_resolution?(img)
end

def image_and_not_retina?(img)
  is_img = image? img
  return false unless is_img
  return !is_retina_resolution?(img)
end

# returns true if image file
def image?(new_file)
  self.file.content_type.include? 'image'
end

def not_image?(new_file)
  !self.file.content_type.include? 'image'
end

def is_retina_resolution?(new_file)
  image = MiniMagick::Image.open(self.file.file)
  true if image[:height] >= 1536 and image[:width] >= 2048
end

def is_not_retina_resolution?(new_file)
  image = MiniMagick::Image.open(self.file.file)
  true if image[:height] < 1536 and image[:width] < 2048
end
4

1 に答える 1

8

構文エラーではありませんが、このコードには意味上の欠陥があります。

version :updown, :if => :image? && !:is_retina_resolution  do
  # ...
end

ここでは、:image? && !:is_retina_resolution 常にfalse と評価される ( !:fooIRb ターミナルで試す) ため、:updownバージョンは作成されません。同じ説明が続きますprocess foo: [sx,sy], if: !:bar?

CarrierWave はオプションをサポートしていないため:unless(私の知る限り)、目標を達成する唯一の方法は、CarrierWave::Uploader::Baseサブクラスでいくつかのメソッドを定義することです。

process resize_to_fill: [667*2, 778*2], if: :image_and_retina?
process resize_to_fill: [667, 778],     if: :image_and_not_retina?

def image_and_retina?(img)
  image?(img) && is_retina_resolution(img)
end

def image_and_not_retina?(img)
  image?(img) && !is_retina_resolution(img)
end
于 2013-05-20T18:09:28.980 に答える