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

RotateFlip を使用してエラー発生

環境/言語:[XP/C# / .NET 2003]
分類:[.NET]

はじめまして ieie と申します。

c# でグラフィック周辺の処理を作ってまして、解決できない問題に
突き当たり悩んでおります。



DrawParts( Graphics g, int nX, int nY , Rectangle rect, 
            RotateFlipType flip_type, Bitmap bitmap_src )
{
    Bitmap    bitmap_tmp;
    using ( bitmap_tmp =  bitmap_src.Clone(rect, bitmap_src.PixelFormat ) )
    {
        bitmap_tmp.RotateFlip( flip_type );

        g.DrawImage( bitmap_tmp,nX, nY );
    }
}

以上のような、ある領域のビットマップを切り取り、回転をさせて
ある場所に表示するという処理を作成したのですが、

bitmap_tmp.RotateFlip 

の箇所で
    'System.Runtime.InteropServices.ExternalException' のハンドル
    されていない例外が system.drawing.dll で発生しました。
    
    追加情報 : GDI+ で一般的なエラーが発生しました。
というエラーが発生しまして解決方法が判らず途方に暮れています。。。

clone せずに、bitmap_src を RotateFlip した場合には問題が
起きない事は確認しています。
どなたか同じ原因で悩んだ方いらっしゃいますか?
試してみましたが、確認できませんでした。再現できるようなコード(及び方法)を記してください。(使用している画像がどのようなものかなども合わせてお伝えください。)
2006/02/27(Mon) 11:13:19 編集(投稿者)

はじめまして> 管理人さん

RotateFlip と私のコードの相性が悪いのかと思い他の方法
Graphics.RotateTransform でも試してみたのですが同様の
現象が起きてしました。

悪戦苦闘の末、釈然としない方法で解決に至ったので、
報告させていただきます。

はじめに質問させていただいたコード内の bitmap_src の
作成方法を少し変えてみました。

今までは、
bitmap_src = new Bitmap( m_FileName );

としていたのですが
以下のように変えてみたところ問題がなくなりました。

using ( bitmap_tmp = new Bitmap( m_FileName ) )
{
    bitmap_src = new Bitmap( bitmap_tmp.Width, bitmap_tmp.Height );
    using ( Graphics g = Graphics.FromImage( bitmap_src ) )
    {
        g.DrawImage( bitmap_tmp, 0, 0 );
    }
}

きっと多分インデックス付のビットマップをフリップしたり
回転したりするのが良くないのかなと思ったりするのですが。。。

> きっと多分インデックス付のビットマップをフリップしたり
> 回転したりするのが良くないのかなと思ったりするのですが。。。

私もその辺があやしいと思っていたのですが、Cloneしなければ問題がないということで、?になってしまいました。そのあたりどうなっているのか、ちょっと謎ですね。
いろいろとお付き合いいただきありがとうございます。

>私もその辺があやしいと思っていたのですが、Cloneしなければ問題がないということで、?になってしまいました。そのあたりどうなっているのか、ちょっと謎ですね。

不勉強で常識的なことだったら申し訳ないのですが、インデックスビットマップって
フリップしたり回転したりって出来ないものなのでしょうか?
私もCloneでうまくいかなかったことがあります。

AllocHGlobalで確保した領域にDIBを作成し,DIBからBitmapを
作成,そのBitmapのCloneを作成後,元のBitmapを破棄,確保した
メモリをFreeHGlobalしようとしたらエラーになりました。

私の理解ではBitmap.Cloneは俗に言うディープコピーであり,
新しいメモリが確保され,Bitmapがコピーされてその参照が
返されると思っていたので,Cloneを作成すれば元のBitmapは
もういらないと考えたのですが...

その時は

Bitmap_clone = new Bitmap(Bitmap_src, Bitmap_src.Size)

のようにしたらうまくいったと思います。

(Bitmap.cloneと上のコードは結果だけみると等価だと思う
のですが,不思議です。)

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