0

我们正在使用 CarrierWave 在我正在处理的项目中上传文件。一个新的要求是解决上传 DICOM 文件的需要。除了大量其他数据之外, DICOM文件还包含一个(或多个)图像。使用Ruby DICOM gem,我可以轻松地从文件中提取图像。当我尝试使用 CarrierWave 上传它们时,我的问题就出现了。

我希望能够从上传的文件中提取 JPEG,并存储该文件而不是原始 DICOM 文件。我尝试创建一个version这样的上传文件:

version :jpeg, :if => :is_dicom? do
  process :create_jpeg
end

def is_dicom?(file)
  IO.binread(file.to_file, 4, OFFSET) == 'DICM'
end

def create_jpeg
  Rails.logger.debug "self is class #{self.class}"
  dcm = DICOM::DObject.read(file.path)
  image = dcm.image.normalize
end

我的create_jpeg方法基于我发现的另一种create_thumbnail方法,如果没有异常处理,该方法将简化为:

def create_thumbnail(width, height, gravity = 'Center')
  self.resize_to_fill(width, height, gravity)
end

我可以在调试控制台中看到 DICOM 已成功读取,但它实际上并没有保存将要提取的 JPEG。相反,我得到了我的原始 DICOM 和一个在文件名前面添加了“jpeg”的副本。如何告诉 CarrierWave 我要存储我提取的这个 JPEG,而不是存储我处理的原始文件?

4

2 回答 2

0

据我所知的版本,创建文件的不同版本以便稍后恢复。为防止这种情况,您必须使用 JPEG 覆盖文件。

如何image_dicom在模型中创建一个虚拟属性,提取 JPEG,然后将其分配给image附加的上传器?现在上传具有image_dicom属性名称的文件可以被解析但不会存储在数据库中。

您必须解析上传的文件,这是 Carrierwave 自动执行的操作,但我认为这不会是一个大问题。不确定它是如何在内部表示的,我知道它不是一个常规File对象,但不应该很难检测和提取原始数据和 JPEG。

编辑:显然,如果您需要解析 DICOM 文件和常规图像,这会变得有点复杂,因为您必须检测文件类型并采取相应措施。

于 2012-11-08T18:18:11.880 回答
0

除了手动提取之外,据我所知,您还可以使用该处理器而不使用版本。

这样,您可以在上传文件时操作文件本身,而无需创建版本。我从来没有这样做过,但它似乎就像这样做一样容易:

process :create_jpeg, :if => :is_dicom?

def is_dicom?(file)
  IO.binread(file.to_file, 4, OFFSET) == 'DICM'
end

def create_jpeg(image)
  directory = File.dirname(current_path)

  # not quite thread safe, generate something unique here
  tmpfile   = File.join(directory, "tmpfile")

  FileUtils.mv(current_path, tmpfile)

  dcm = DICOM::DObject.read(tmpfile)
  image = dcm.image.normalize.write(current_path)

  FileUtils.rm(tmpfile)
end

# replace the extension with jpg
def filename
  super.chomp(File.extname(super)) + '.jpg'
end

复制并改编自:http : //www.freezzo.com/2010/12/23/create-ffmpeg-processor-for-carrierwave-in-rails-3/ 和 Carrierwave 文档。

于 2012-11-08T18:28:20.383 回答