0

我已经搜索了高和低有关能够使用 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 等的所有内容,但被难住了。

任何帮助将不胜感激。

提前致谢

4

1 回答 1

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,它为我指明了正确的方向。

于 2013-11-08T22:08:33.307 回答