2

私は本当に厄介な問題に直面しています..

.Net 2.0 C# WinForms プロジェクトがあります。ビットマップを描画領域に引き延ばそうとしていますが、何らかの理由で適切に引き伸ばされません。描画領域の右マージンと下マージンにアルファ チャネル グラデーションが表示されます。

この問題を特定するのにかなりの時間がかかりました。問題を再現するコードを数行作成します (以下のコード スニペットとスクリーンショットを参照)。

誰でもこの問題に光を当てることができますか?

前もって感謝します。

--

private void Form1_Paint( object sender, PaintEventArgs e )
{
    // Create a black bitmap resource sized 10x10
    Image resourceImg = new Bitmap( 10, 10 );
    Graphics g = Graphics.FromImage( resourceImg );
    g.FillRectangle( Brushes.Black, 0, 0, resourceImg.Width, resourceImg.Height );

    Rectangle drawingArea = new Rectangle( 0, 0, 200, 200 ); // Set the size of the drawing area
    e.Graphics.FillRectangle( Brushes.Aqua, drawingArea );   // Fill an aqua colored rectangle
    e.Graphics.DrawImage( resourceImg, drawingArea );        // Stretch the resource image

    // Expected result: The resource image should completely cover the aqua rectangle.
    // Actual Result:   The right and bottom edges become gradiently transparent (revealing the aqua rectangle under it)
}

DrawImageの問題

4

1 に答える 1

5

この動作は、GDI+ がエッジを処理する方法に関係しています。この場合、非常に小さな画像を大きな領域にスケーリングしており、エッジの処理方法を GDI+ に伝えていません。このクラスを使用しImageAttributesて WrapMode を適切に設定すると、この問題を回避できます。

例えば:

private void Form1_Paint(object sender, PaintEventArgs e)
{
    using (var resourceImg = new Bitmap(10, 10))
    {
        using (var g = Graphics.FromImage(resourceImg))
        {
            g.FillRectangle(Brushes.Black, 0, 0, 
                resourceImg.Width, resourceImg.Height);
        }

        var drawingArea = new Rectangle(0, 0, 200, 200);
        e.Graphics.FillRectangle(Brushes.Aqua, drawingArea);

        using (var attribs = new ImageAttributes())
        {
            attribs.SetWrapMode(WrapMode.TileFlipXY);
            e.Graphics.DrawImage(resourceImg, drawingArea, 
                    0, 0, resourceImg.Width, resourceImg.Height, 
                    GraphicsUnit.Pixel, attribs);
        }
    }    
}

上記のコードは、すべて黒の画像を生成する必要があります。ステートメントをコメントアウトするとattribs.SetWrapMode(WrapMode.TileFlipXY);、青色のグラデーションが表示されます。ラップ モードを設定すると、GDI+ にエッジで画像を反転するように指示しているため、画像を拡大縮小するときにエッジでフェード アウトしないように、より多くの黒をピックアップします。

于 2011-11-27T03:23:44.587 に答える