0

我有一个脚本,它循环播放我拍摄的大量图像并读取焦距和相机模型,显示焦距和总焦距图表(这对于帮助确定下一次购买镜头很有帮助,但除此之外点)。

这对于 10 MB 以下的 JPG 图像非常有效,但是一旦遇到接近 20 MB 的 RAW 文件(如佳能的 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调用永远不会执行并且内存永远不会返回。

要解决此问题,您必须将$image.Dispose()调用放在finallytry/catch 末尾的块中。像这样

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 上测试过它,但在 .CRW 上测试过大约 15MB。

试试看,让我知道。

于 2012-07-11T04:31:42.417 回答