1. ホーム

GDI+でジェネリックエラーが発生したのを解決する

2022-01-23 11:58:10

DNN Fckエディタに画像アップロード時のサイズ変更機能がなくて不便を感じているので、画像サイズを変更する機能を追加します。
DNNコアのUploadFile()のメソッドを変更したくないので、fckエディタのアップロードのページを変更するだけです。
変更後のワークフローは
1. 画像アップロードを選択し、DNN UploadFile()を呼び出して画像をアップロードする。
2. サーバーにアップロードされたファイルを読み込んで、一時的に保存する Image
3. GDI+ GetThumbnailImageを呼び出して、画像のサイズを変更し、元のファイルを上書きします。
店舗への3歩目で実行すると、必ずA generic error occurred in GDI+となる問題が発生します。
最終的に原因が判明したのは:
ソースビットへのアクセスを維持するために、GDI+はあらゆるソースファイルをロックし、アプリケーションにあらゆるソースストリームのライフを維持するよう強制します。  ビットマップ  または  画像  オブジェクトを作成します。
解決策は、インデックスまたは非インデックスの画像を作成することです。 Graphics.DrawImage()  を使用して、イメージを新しく作成されたビットマップオブジェクトにコピーし、新しいイメージのサイズを変更します。
サンプルコードです。

 1 ビットマップ bm1 = (Bitmap)Image.FromFile()。 "

doodaa.gif " <スパン );
 2 ビットマップ bm2 = <スパン 新しい  ビットマップ(bm1.Width,bm1.Height)。
 3 グラフィックス g <スパン = <スパン Graphics.FromImage(bm2)。
<スパン  4 g.DrawImageUnscaled(bm1, <スパン 0 , <スパン 0 );
 5 // bm2 には、インデックスを持たないバージョンの画像が含まれるようになりました。
<スパン  6 // 今度はXを描きます。
 7 g.DrawLine(blah - ブラー .) ;
<スパン  8 g.DrawLine(blah - ブラー .) ;
<スパン  9 // グラフィックを消す
<スパン 10 g.Dispose()を実行します。
<スパン 11 // を作成し、新しいgifを保存します。
<スパン 12 bm2.Save() " foobar.gif " , ImageFormat.Gif)。
<スパン 13


以下は、マイクロソフトのKBに記載されている問題点です。
http://support.microsoft.com/?id=814675