を使用してロードしImage
、画像を調べて画像に関する情報を取得しています。ただし、これを行う過程で、画像の一部が消えるという奇妙な動作に気付きました。多くのデバッグの後、私は最終的にこれが廃棄されていることが原因であることがわかりました。byte[]
MemoryStream
ProperyItems
PropertyItems
MemoryStream
MemoryStream ms0 = new MemoryStream(imageBytes);
Image img0 = Image.FromStream(ms0);
Console.Out.WriteLine("Without using, Image propertyIDs: ");
foreach (int itemId in img0.PropertyIdList)
Console.Out.Write(itemId + ", ");
Console.Out.Write("\n");
Image img1 = null;
using (MemoryStream ms1 = new MemoryStream(imageBytes))
{
img1 = Image.FromStream(ms1);
}
Console.Out.WriteLine("Outside using, Image propertyIDs: ");
foreach (int itemId in img1.PropertyIdList)
Console.Out.Write(itemId + ", ");
Console.Out.Write("\n");
出力:
Without using, Image propertyIDs:
254, 256, 257, 258, 259, 262, 269, 273, 274, 277, 278, 279, 282, 283, 284, 296,
Outside using, Image propertyIDs:
254, 256, 257, 258, 259, 262, 274, 277, 278, 284, 296,
したがって、少なくとも一部の はPropertyItems
の内容に直接裏打ちされているようでMemoryStream
あり、解決策はそれを破棄しないことですか、それとも間違っていますか?
この問題をデバッグする過程で、ブロック内のPropertyIdList
(または画像に関連するもの) にアクセスすると、 が破棄された後に が消えないことに気付きました。PropertyItems
using
PropertyItems
MemoryStream
Image img2 = null;
using (MemoryStream ms2 = new MemoryStream(imageBytes))
{
img2 = Image.FromStream(ms2);
int[] tmp = img2.PropertyIdList;
}
Console.Out.WriteLine("Outside using with PropertyIdList access, Image propertyIDs: ");
foreach (int itemId in img2.PropertyIdList)
Console.Out.Write(itemId + ", ");
Console.Out.Write("\n");
出力:
Outside using with PropertyIdList access, Image propertyIDs:
254, 256, 257, 258, 259, 262, 269, 273, 274, 277, 278, 279, 282, 283, 284, 296,
Image
クラスのソースを調べたところ、プロパティがデータのローカル コピーを保持PropertyIdList
していないように見えます。PropertyItems
PropertyItems
MemoryStream