2

このビットマップを幅 2 ピクセルとして描画しようとすると、幅 1 ピクセル、高さ 256 ピクセルの BitMap を作成しました。

public void DrawImage(Image image,RectangleF rect)

各ビットマップ列の間に白い細いストライプがあるため、ビットマップは正しく描画されません。以下の簡単なコードを参照してください

private void Form1_Paint(object sender, PaintEventArgs e)
{
    Graphics gr = e.Graphics;

    Bitmap bitmap = new Bitmap(1, 256);
    for (int y = 0; y < 256; y++)
    {
        bitmap.SetPixel(0, y, Color.Red);
    }

    RectangleF rectf = new RectangleF();
    for (int x = 0; x < 500; x++)
    {
        float factor = 2;
        rectf.X = x*factor;
        rectf.Y = 0;
        rectf.Width = fact;
        rectf.Height = 500;
        // should draw bitmap as 2 pixels wide but draws it with white slim stripes in between each bitmap colomn
        gr.DrawImage(bitmap, rectf);
    }           
}
4

3 に答える 3

2

これはGraphics.InterpolationModeの副作用であり、ビットマップスケーリングでは、ビットマップの端のピクセルが不足するとアーティファクトが生成されます。また、幅が1ピクセルしかないビットマップでは、ピクセルが不足することがたくさんあります。NearestNeighborに設定し、PixelOffsetModeをNoneに設定すると、より良い結果を得ることができます。ただし、これでもアーティファクトが生成されますが、外観による内部丸め誤差が発生します。よくわかりませんが、「事実」の値を推測する必要がありました。

小さなビットマップのスケーリングは避けてください。

于 2011-07-19T09:28:41.220 に答える
1
for (int x = 0; x < 500; x++)
{
    float factor = 2;
    rectf.X = x*factor;
    rectf.Y = 0;
    rectf.Width = fact;
    rectf.Height = 500;
    // should draw bitmap as 2 pixels wide
    // but draws it with white slim stripes in between
    // each bitmap colomn
    gr.DrawImage(bitmap, rectf);
}

これはあなたのスニペットです。そしてあなたはそれを主張しshould draw bitmap as 2 pixels wideます。申し訳ありませんが、これはとても間違っています。その理由を説明します。このループがどのように機能するか見てみましょう。

  • x=0

  • 左上の x coord をゼロに設定しています。rectf.X = x*factor;

  • gr.DrawImage(ビットマップ、rectf); 0 に等しい x 座標から始まる四角形に 1 ピクセル幅のビットマップを描画しています。

  • ループが終了し、x が 1 になります。

  • 左上の x 座標が 2 になりました。

  • 長方形上に 1 ピクセル幅のビットマップを描画し、2 に等しい x 座標から開始します (ビットマップ @ x = 1 が表示されないため) 。

続行する必要がありますか、それとも白い縞模様がなぜ、どこから来るのかは明らかですか?

それを修正するには、このスニペットを使用してください

for (int x = 0; x < 500; x++)
{
    float factor = 2;
    rectf.X = x * factor; // x coord loops only through even numbers, thus there are white stripes
    rectf.Y = 0;
    rectf.Width = factor;
    rectf.Height = 500;
    // should draw bitmap as 2 pixels wide
    // but draws it with white slim stripes in between
    // each bitmap colomn
    gr.DrawImage(bitmap, rectf);
    rectf.X = x * factor + 1; // now x coord also loops through odd numbers, and combined with even coords there will be no white stripes.
    gr.DrawImage(bitmap, rectf);    
}

PS 何を達成しようとしていますか? Graphics.FillRectangle()メソッドについて聞いたことがありますか?

于 2011-07-19T08:58:46.317 に答える
0

bitmap.SetPixel(1,y,Color.Red) はそれを行うべきであり、rectf.X は rectf.Width を拡張すべきではありません。

于 2011-07-19T08:15:21.590 に答える