0

撮影した大量の画像をループ処理し、焦点距離とカメラ モデルを読み取り、焦点距離と合計のグラフを表示するスクリプトがあります (次のレンズの購入を決定するのに役立ちますが、それ以外にもポイント)。

これは、10 MB 未満の JPG 画像ではまったく問題なく機能しますが、20 MB に近い RAW ファイル (Canon の CR2 形式など) に到達するとすぐに、「メモリ不足」エラーが発生します。

Powershell のメモリ制限を増やすか、ファイル全体を読み込まずにファイルのメタデータを読み取る方法はありますか?

これは私が現在使用しているものです:

# load image by statically calling a method from .NET
$image = [System.Drawing.Imaging.Metafile]::FromFile($file.FullName)

# try to get the ExIf data (silently fail if the data can't be found)
# http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html
try
{
  # get the Focal Length from the Metadata code 37386
  $focalLength = $image.GetPropertyItem(37386).Value[0]
  # get model data from the Metadata code 272
  $modelByte = $image.GetPropertyItem(272)
  # convert the model data to a String from a Byte Array
  $imageModel = $Encode.GetString($modelByte.Value)
  # unload image
  $image.Dispose()
}
catch
{
  #do nothing with the catch
}

ここでソリューションを使用してみました: http://goo.gl/WY7Rgしかし、CR2 ファイルはどのプロパティでも空白を返すだけです...

どんな助けでも大歓迎です!

4

2 に答える 2

5

問題は、エラーが発生したときに画像オブジェクトが破棄されないことです。エラーが発生すると、実行は try ブロックを終了します。つまり、Dispose呼び出しは実行されず、メモリは返されません。

これを修正するには、try/catch の最後に$image.Dispose()あるブロック内に呼び出しを配置する必要があります。finallyこのような

try
{
  /* ... */
}
catch
{
  #do nothing with the catch
}
finally
{
  # ensure image is always unloaded by placing this code in a finally block
  $image.Dispose()
}
于 2012-11-22T17:14:33.633 に答える
0

このモジュールを使用して、画像の EXIF データを取得します。.CR2 でテストしたことはありませんが、約 15MB の .CRW でテストしました。

それを試して、私に知らせてください。

于 2012-07-11T04:31:42.417 に答える