2009-04-03 5 views
0

私は安全でないコンテキストでビットマップを使用しようとしています。たとえば、プログラムが最初に実行され、2回目に失敗するなどの不安定さが見られます。コードは次のとおりです。安全でないコンテキストでのビットマップ編集 - 不安定性を避けるには?

private static void RenderBitmap(Graphics g) 
{ 
    const int width = 150, height = 150; 
    using (Bitmap bmp = new Bitmap(width, height, 
    System.Drawing.Imaging.PixelFormat.Format24bppRgb)) 
    { 
    Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height); 
    System.Drawing.Imaging.BitmapData bmpData = 
     bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, 
     bmp.PixelFormat); 
    NativeMethods.RenderText(Graphics.FromImage(bmp).GetHdc(), bmpData.Scan0, 
     "This works only first time round", "Segoe", 10, 
     new RGBA(255, 0, 0, 255), width, height); 
    bmp.UnlockBits(bmpData); 
    g.DrawImage(bmp, new Rectangle(width, height, width, -height)); 
    } 
} 

これがどのように機能していないかを見ると、いくつか質問があります。ネイティブのRenderTextメソッドがビットマップメモリ​​を直接操作していれば、私が安全で正しいことをしていますか? HDCをビットマップから正しく取得する方法はありますか、または描画方法から渡されたパラメータgを使用する必要がありますか?

私は取得していますエラーは、このです:。

System.AccessViolationExceptionは=は「 を読み取りまたは書き込み保護されているメモリをしようとしました。これは、多くの場合、他のメモリ が破損していることを示し ある 未処理のメッセージでした。 "

+0

エラーは何ですか? –

答えて

1

これは愚かな質問かもしれませんが、p/invokeを使用する代わりに.NETに付属するTextRendererクラスを使用しないのはなぜですか?

TextRenderer::DrawText Method (IDeviceContext, String, Font, Point, Color) 

http://msdn.microsoft.com/en-us/library/4ftkekek.aspx

+0

独自のテキストレンダリングアルゴリズムを使用したいと思います。 –

3

-Oisin NativeMethods.RenderRext方法は、安全には、ビットマップの走査線がどのように広い知らないとして、ビットマップデータと連携し、それならばすることはできませんメモリに逆さまに格納されているかどうかを示します。この現象は、メソッドがビットマップの外側のメモリに書き込んで、アプリケーションで必要なものを上書きしていることを示しています。

BitmapData.Strideプロパティには、メソッドでデータを処理する必要があるという情報があります。これは、走査線の幅をバイト単位で含み、負の場合は、ビットマップがメモリに逆さまに格納されていることを意味します。単純にScan0は第1の走査線のアドレスであり、Scan0 + Strideは第2の走査線のアドレスである。

+0

私はストライドを取得するために次の式を使用しています:(width * 3 + 3)/ 4 * 4 - これは間違っていますか? –

+1

それはあなたにストライドの絶対値を与えます、あなたはそれが否定的であるべきかどうかまだ分かりません。 – Guffa

1

まあ、多くの苦痛と苦しみの後、私は解決策を見つけました。埋められるメモリバッファを渡す代わりに、私はデバイスコンテキスト(HDC)を渡してレンダリングされました。これまで働いていたようだ!

すべての方に感謝します。

関連する問題