2010-11-30 35 views
14

私は、GDI +を多用して画像を操作するアプリケーションを持っているという、本当に奇妙な問題を抱えています。私のアプリケーションは.net 2.0ではうまく動作しますが、.net 4.0ではgdi + "メモリ不足"エラーでクラッシュしているというユーザからのレポートを取得しています。今、私は、 "メモリ不足" gdi +エラーは、エラーの多くのためのキャッチですが、なぜそれがネットで動作していることを知っています。ネット4..net2.0と.net 4.0 gdi +の違いは?

私は "コンポジットビットマップを作成するために、互いに重ね合わされます。このコントロールは.net 2.0ではなく、.net 4ではうまく機能しました。

ファイルシステムから10メガピクセルのjpegをロードしたときに画像がズームして変換されると、

さらに詳細を述べると、メモリエラーのうち、」これを返します任意の回転と400%より大きな4の意味の行列の規模でg.draw。

Windows 7のボックスにXPのボックスおよびNOTで発生します。ここでの違い何ができるか?

任意の受験者...ここ

がキャッチされた例外からログインして私のスタックトレースの範囲である。

<Event> 
    <TimeStamp>11/30/10 11:02:43.706</TimeStamp> 
    <Source>APPro2</Source> 
    <EventType>Error</EventType> 
    <Message><![CDATA[##: OutOfMemoryException 
Message: 
Out of memory. 

Stack Trace: 
    at System.Drawing.Graphics.CheckErrorStatus(Int32 status) 
    at System.Drawing.Graphics.DrawImage(Image image, Rectangle destRect, Int32 srcX, Int32 srcY, Int32 srcWidth, Int32 srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttrs, DrawImageAbort callback, IntPtr callbackData) 
    at System.Drawing.Graphics.DrawImage(Image image, Rectangle destRect, Int32 srcX, Int32 srcY, Int32 srcWidth, Int32 srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttr) 
    at Colorvision.Graphics.Layers.Picture.DrawBig(Graphics g) in D:\Colorvision_Workspaces\Colorvision\Graphics\Layers\Picture.cs:line 321 
    at Colorvision.Graphics.LayerCollection.DrawBig(Graphics e) in D:\Colorvision_Workspaces\Colorvision\Graphics\LayerCollection.cs:line 690]]></Message> 
    <EventID>0</EventID> 
    </Event> 

はお時間をいただき、ありがとうございます。これは私の第一の質問はここにあると穏やかな。

0xA3のは、私は現時点でスタックトレースを持たないが、正確なg.drawコールは以下の通りです:

g.DrawImage(
    bmpBigPicture, 
    new Rectangle(
     destBigX, 
     destBigY, 
     (int)(destBigWidth*Scale), 
     (int)(destBigHeight*Scale)), 
    0, 
    0, 
    bmpBigPicture.Width, 
    bmpBigPicture.Height, 
    GraphicsUnit.Pixel, 
    imgAttribs 
); 

スケールは1秒4

+0

ようこそSO =)ちょうど確認するには...アプリケーションを** .net4 **をターゲットに設定してから再構築するとこの問題が発生しますか? – gideon

+0

万が一スタックトレースがありますか?そして 'g.draw'メソッドは何ですか? –

+0

はい、正しいです。それはXPのボックスでのみ発生するように見える、窓7ボックスは魅力のように動作します。 –

答えて

1

私は同様の問題に直面しました。私の場合、問題はLOHの断片化でした。おそらく、これは役に立ちます:Large Object Heap Fragmentation

基本的に新しい方法では、メモリの割り当て方法が分かります。場合によっては、大量のデータを処理することがなくなり、アプリケーションが失敗することがあります。長い時間プログラムを実行して大量のデータを処理すると、この問題が発生する可能性が高くなります。あなたは10メガピクセルのイメージを挙げました。もしあなたがそのようなファイルを使って多くの処理を行うなら、LOHの問題にはかなり簡単に当てはまります。

+0

この回答ありがとうございます。これは実際に起こっていたことです。私はしばらく前に分かりましたが、答えとしてマークするために回ったことはありません。遅れて申し訳ありません。 –

1

% 400用System.Drawing.Graphics.DrawImageを直接呼び出す場所"GdipDrawImageRectRectI"という名前のgdiplus関数です。どんな.NET Frameworkを使用しても、GDI +のバージョンは多くなく、呼び出される方法は同じです。おそらく、この投稿が役立つかもしれません:Latest version of GDI+ and support information

システムがX86またはX64の場合、GDI +も異なる場合があります。あなたは常に同じことを比較していることを確認したい。 おそらく、これを整理するために、プロセスにロードされているGDI + DLLを追跡できます。

関連する問題