まず、この特定の問題に関する既存のStackOverflowの回答を読みました。それらの答えからのコンセンサスは、パーミッションや既存のファイルなどのようです...私はそれらの問題をすべて取り除いたのです。Bitmap.Save中にGDI +で一般的なエラーが発生しました
基本的に、次のようにここで流れがある:
アプリは、24ビットのPNGファイルを受け取り、ビットマップオブジェクト、bmpOriginalにそれを読み出します。
アプリは私は「画像/ JPEG」MIMEタイプを持つものを見つけるまで(ImageCodecInfo.GetImageEncodersをループから得られたJPGエンコーダ()を使用して、メモリストリームにbmpOriginalを保存する。
アプリA作成ステップ2のメモリストリームから新しいビットマップbmpOptimizedを取り出し、ピクチャボックスに表示します。これまでのところ、すべてが意図どおりに動作し、新しいビットマップにJPG圧縮アーティファクトが表示されることがあります。
後でコードフローでボタンをクリックすると、Bitmap.Save()を使用してbmpOptimizedを新しいファイルに保存する必要がありますthod。
これを実行すると、「GDI +で一般的なエラーが発生しました」というエラーがスローされます。
フォルダが書き込み可能であり、ファイルが存在しないことを確認するために再度チェックしました。実際、アプリケーションは実際には適切な場所にファイルを作成しますが、空(0バイト)です。
{[ImageFormat:b96b3caf-0728-11d3-9d7b-0000f81ef32e]}奇数見えた
唯一の他のものはbmpOriginalとbmpOptimized両方が同じRawFormat値を有することであった
を... bmpOriginalはPNGに由来し、bmpOptimizedはエンコードされたJPEGに由来します。
EDIT: コードは次のようになります。
bmpOptimized.Save("bar.jpg");
...エラーが発生した場所それはだ:ユーザーが、ステップ4のためのボタンをクリックしたときに
public Bitmap bmpOriginal;
public Bitmap bmpOptimized;
...
// Step 1
bmpOriginal = new Bitmap("foo.png");
// Step 2
using(MemoryStream ms = new MemoryStream())
{
ImageCodecInfo _jpgEncoder = _getEncoder("image/jpeg");
EncoderParameters _encoderParams = new EncoderParameters(1);
_encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, 70L);
bmpOriginal.Save(ms, _jpgEncoder, _encoderParams);
// Step 3
bmpOptimized = new Bitmap(ms);
}
そして後で。
この編集はフローの単純化されたバージョンで単純に追加されていることに注意してください。ソースコードが不足しているため、この質問は明らかに下降しています。コメントをした一人が正解を返しました。私は、最適化されたビットマップを保存するまでMemoryStreamを保持する必要がありました。
「bmpOptimized」イメージが目的の場所に保存されるまで 'memory stream'が' dropped'されていないかどうか確認してください。また、この[リンク](https:// stackoverflow。com/questions/44592550 /解決できない - 汎用エラー - エラーが発生しました--GIF-in-web-apiで保存されました) –
これはほぼ確実に問題です。私はビットマップオブジェクトを作成した後にメモリストリームを保存していませんでした。私は今日検証します - ありがとう! – jhilgeman
@BalagurunathanMarimuthu - そうだった。私の元のコードはusing()ブロック内にMemoryStreamを持っていたので、後でクリアされていました。一度私はメモリストリームを保存し、それは正常に働いた!あなたは答えとしてあなたのコメントを追加することができます、私は答えとしてそれをマークアップしupvoteことができますか? – jhilgeman