Carrierwave,ImageMagick:平铺,存储和调用图像的图块

时间:2013-11-07 09:20:38

标签: ios ruby-on-rails imagemagick carrierwave

我已经搜索了高低,以获得更多有关能够使用Carrierwave处理上传文件的信息,将其分成16个图块。我知道我可以从命令行使用ImageMagick并使用以下内容拆分文件:

convert imagename: -crop 4x4@ +repage +adjoin imagename_%d.gif

例如。这非常适合平铺并将文件从rose_0.gif保存到rose_15.gif。

我找不到任何使用RMagick执行相同功能的东西,但偶然发现以下代码使用Ruby on Rails等执行相同的功能:

def split_images
  #'image' is a ImageMagick Object
  width  = image.cols/number_cols
  height = image.rows/nubmer_rows
  images = []
  0.upto(number_rows-1) do |x|
    0.upto(number_cols-1) do |y|
      images << image.crop( Magick::NorthWestGravity, x*width, y*height, width, height, true)
    end
  end
end

我正在尝试从iOS应用程序上传图像,并让Carrierwave通过在Carrierwave中编写一个版本:例程来处理图像处理。

是否可以这样做?如果是这样,文件将如何保存?而且,更重要的是,我如何在视图中“调用”或引用文件?有人可以指点我正确的方向吗?或者建议另一种方法?

我知道我可能会编写16个不同的版本:命令,但这看起来有点傻。

我真的觉得我已经阅读了CarrierWave和ImageMagick等所有内容,但是很难过。

感谢任何帮助。

提前致谢

1 个答案:

答案 0 :(得分:0)

我相信我已经使用以下方法解决了这个问题并提供了答案,以防万一其他人想要做同样的事情:

# encoding: utf-8

class PhotoUploader < CarrierWave::Uploader::Base

  # Include RMagick or MiniMagick support:
  include CarrierWave::RMagick
  # include CarrierWave::MiniMagick

  process :resize_to_limit => [640, 1136]
  process :convert => 'png'

  NUMBER_OF_COLS = 4
  NUMBER_OF_ROWS = 4

  # Choose what kind of storage to use for this uploader:
  storage :file
  # 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

  version :small do
    process :resize_to_limit => [100, 100]
  end

  0.upto(NUMBER_OF_ROWS-1) do |x|
    0.upto(NUMBER_OF_COLS-1) do |y|
      name = "image#{x}#{y}"
      version(name) {
        process :name => [x,y,160,284]
      }
    end
  end

  def name(x,y,width,height)
    manipulate!(:format => 'png') do |img|
      img.crop(Magick::NorthWestGravity, x*width, y*height, width, height, true)
    end
  end

  # Add a white list of extensions which are allowed to be uploaded.
  # For images you might use something like this:
  def extension_white_list
    %w(jpg jpeg gif png)
  end

end

我仍然不满意必须在代码中硬编码宽度和高度的尺寸,但无法让@geometry的东西工作以传递给我实际的图像宽度和高度,但它确实此刻的工作。如果有人有任何改进,我将不胜感激。

感谢Ryan Bates在ImageMagick上的Railscast,它指出了我正确的方向。