2

別の画像の上に透かしを入れようとしています。これは私のコードです:

var imgPhoto = Image.FromFile(filePath);
var grPhoto = Graphics.FromImage(imgPhoto);

var point = new Point(imgPhoto.Width - imgWatermark.Width, imgPhoto.Height - imgWatermark.Height);

var brWatermark = new TextureBrush(imgWatermark, new Rectangle(point.X, point.Y, imgWatermark.Width, imgWatermark.Height));

grPhoto.FillRectangle(brWatermark, new Rectangle(point, imgWatermark.Size));
imgPhoto.Save(outputFolder + @"\" + filename);

ただし、1つの問題が発生しますが、TextureBrushはメモリ不足の例外をスローします。私は周りを検索しましたが、本当に良い解決策を見つけることができませんでした。私が見る限り、TextureBrushがその仕事をしようとする前に何も処分されていません。

4

4 に答える 4

3

境界領域のサイズを確認します。あなたの場合、これはnew Rectangle(point.X, point.Y, imgWatermark.Width, imgWatermark.Height) になります。同じ「メモリ不足」の問題がありました。その理由は、バインドされた領域がテクスチャ サイズよりも大きかったためです。

于 2012-11-27T05:14:42.573 に答える
0

できるだけ早く適切に廃棄できるように、IDisposableリソースをステートメントでラップする必要があります。また、メモリに収まるサイズよりも大きいファイルusingに対して実行できることを期待しないでください。Image.FromFile

于 2012-06-19T09:39:08.837 に答える
0

のファイルfilePathがかなり大きいことは間違いありません。

OutOfMemoryException通常、.NET ヒープの断片化がある場合に発生するため、ランタイムで使用可能なメモリ ブロックよりも大きなファイルをロードしようとしている可能性があります。

画像ファイルを圧縮するか、許容できる場合はトリミングしてサイズを小さくしてください。

編集 MS ペイントや Paint.NET などのイメージ エディタでファイルを開いてみてください。その後、再度保存してください。

それでもうまくいかない場合は、これを試してください(基本的に、長方形の境界が透かし画像の内側にあることを確認してください): http://www.owenpellegrin.com/blog/net/out-of-memory-errors-with-gdi-texturebrush /

于 2012-06-19T09:40:05.380 に答える