0

私が取り組んでいるプロジェクトでは、ファイルのアップロードに CarrierWave を使用しています。DICOM ファイルをアップロードする必要性に対応する新しい要件が導入されました。DICOMファイルには、他の多くのデータに加えて、1 つまたは複数の画像が含まれています。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」が追加されたコピーを取得します。抽出したこの JPEG を保存し、処理した元のファイルを保存したくないことを CarrierWave に伝えるにはどうすればよいですか?

4

2 に答える 2

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 に答える
0

私が知っている限りでは、後で復元するために別のバージョンのファイルを作成してください。これを防ぐには、ファイルを JPEG で上書きする必要があります。

モデルに仮想属性を作成し、JPEG を抽出して、それを添付のアップローダimage_dicomに割り当ててみませんか? image属性名を持つファイルのアップロードはimage_dicom解析できますが、データベースには保存されません。

アップロードされたファイルを解析する必要がありますが、これは Carrierwave が自動的に行うものですが、それが大きな問題になるとは思いません。それが内部でどのように表現されているかはわかりませんが、通常のFileオブジェクトではないことはわかっていますが、生データと JPEG を検出して抽出するのは難しくありません。

編集:明らかに、DICOMファイルと通常の画像を解析する必要がある場合、ファイルの種類を検出してそれに応じて行動する必要があるため、これはもう少し複雑になります。

于 2012-11-08T18:18:11.880 に答える