|
分類:[C#]
下記コードにて、重いJPG(30MB)をループで数十枚処理しようとするとメモリ不足が出てしまいます。
5枚ぐらいは正常処理されます。ご助力願います。
この関数はJPGイメージに任意の緯度経度のEXIF情報を追加するものです。
ms.Dispose();をreturnの前に追加すると呼び出し側でエラーになってしまいます。
どのようにすれば軽くなりますでしょうか?
static Image Geotag(Image original, double lat, double lng)
{
// These constants come from the CIPA DC-008 standard for EXIF 2.3
const short ExifTypeByte = 1;
const short ExifTypeAscii = 2;
const short ExifTypeRational = 5;
const int ExifTagGPSVersionID = 0x0000;
const int ExifTagGPSLatitudeRef = 0x0001;
const int ExifTagGPSLatitude = 0x0002;
const int ExifTagGPSLongitudeRef = 0x0003;
const int ExifTagGPSLongitude = 0x0004;
char latHemisphere = 'N';
if (lat < 0)
{
latHemisphere = 'S';
lat = -lat;
}
char lngHemisphere = 'E';
if (lng < 0)
{
lngHemisphere = 'W';
lng = -lng;
}
MemoryStream ms = new MemoryStream();
original.Save(ms, ImageFormat.Jpeg);
ms.Seek(0, SeekOrigin.Begin);
Image img = Image.FromStream(ms);
AddProperty(img, ExifTagGPSVersionID, ExifTypeByte, new byte[] { 2, 3, 0, 0 });
AddProperty(img, ExifTagGPSLatitudeRef, ExifTypeAscii, new byte[] { (byte)latHemisphere, 0 });
AddProperty(img, ExifTagGPSLatitude, ExifTypeRational, ConvertToRationalTriplet(lat));
AddProperty(img, ExifTagGPSLongitudeRef, ExifTypeAscii, new byte[] { (byte)lngHemisphere, 0 });
AddProperty(img, ExifTagGPSLongitude, ExifTypeRational, ConvertToRationalTriplet(lng));
return img;
}
|