DOBON.NETプログラミング道掲示板

[ 最新記事及び返信フォームをトピックトップへ ]

■35604 / inTopicNo.1)  bitmapが保存できない
  
□投稿者/ K-1 一般人(1回)-(2024/05/03(Fri) 22:12:10)
  • アイコン環境/言語:[C#] 
    分類:[.NET] 

    画像ファイルに対し加工を行うコードを作っています。
    画像ファイルを読み込み、バイト配列に変換して、バイト配列に対して加工を行い、画像ファイルとして保存するために以下のようなコードを書きました。

    // 画像読み込み
    Bitmap bitmap = new Bitmap(@"D:\temp\moto.bmp");

    /// Bitmapをバイト配列にする
    MemoryStream mms = new MemoryStream();
    bitmap.Save(mms, ImageFormat.Bmp);
    byte[] inputdata = mms.ToArray();
    mms.Close();
    mms.Dispose();

    MemoryStream ms = new MemoryStream(inputdata);
    Bitmap output_bitmap = new Bitmap(ms);
    ms.Close();
    ms.Dispose();

    output_bitmap.Save(@"D:\temp\ato.bmp", ImageFormat.Bmp);

    変数inputdataにはBITMAPフォーマットそのままのバイナリが展開されているとこまで確認したので、BITMAP-BYTE変換は問題ないと思います。
    問題は最後の
    output_bitmap.Save(@"D:\temp\ato.bmp", ImageFormat.Bmp);

    System.Runtime.InteropServices.ExternalException: 'GDI+ で汎用エラーが発生しました。'
    というエラーが出てしまいます。
    "D:\temp\ato.bmp"には54バイトのファイルが生成されており、powershellで「format-hex .\a.bmp」とダンプをとってみると変数inputdataの先頭54バイトと同じものがはいってるぽいです。

    この「'GDI+ で汎用エラーが発生しました。'」の対処法はないでしょうか。
マルチポストを報告
違反を報告
引用返信 削除キー/
■35605 / inTopicNo.2)  Re[1]: bitmapが保存できない
□投稿者/ KOZ 一般人(36回)-(2024/05/04(Sat) 01:13:53)
  • アイコン2024/05/04(Sat) 01:18:08 編集(投稿者)

    No35604に返信(K-1さんの記事)
    > System.Runtime.InteropServices.ExternalException: 'GDI+ で汎用エラーが発生しました。'
    > というエラーが出てしまいます。

    Bitmap を作成するときに使った Stream オブジェクトは破棄しないでください。

    Bitmap output_bitmap = new Bitmap(ms);
    output_bitmap.Save(@"D:\temp\ato.bmp", ImageFormat.Bmp);
    ms.Dispose();

    この順番であればOKです。

    あと、Stream に関しては Close = Dispose ですので、どちらか一方を実行するだけで良いです。

    Stream の実装
    https://referencesource.microsoft.com/#mscorlib/system/io/stream.cs,dc4ffe046b847b84
違反を報告
引用返信 削除キー/
■35606 / inTopicNo.3)  Re[2]: bitmapが保存できない
□投稿者/ K-1 一般人(2回)-(2024/05/04(Sat) 08:58:28)
  • アイコンNo35605に返信(KOZさんの記事)
    > 2024/05/04(Sat) 01:18:08 編集(投稿者)

    うまくいきました!
    想定通りの画像が保存されていることも確認しました。
    ありがとうございます。
解決み!
違反を報告
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

Mode/  Pass/


- Child Tree -