1

GDI を使用して画面上に特定の解像度 (~ 40 DPI) のビットマップを描画し、各ピクセル間の間隔を再現できる必要があります。スペースはピクセル サイズの何分の 1 かですが、目には目立ちます。

Graphics クラスまたはビットマップを設定して、描画されたピクセル間に「空白」を挿入する方法はありますか? 複雑なコードを自分で作成する前に、どこかに欠けている設定がないことを確認したいと思います。

4

2 に答える 2

1

モニターの 40 dpi から最大 110 dpi まで画像を引き伸ばしたいようですが、ピクセルを拡張するのではなく、1 インチあたり 40 ピクセルだけを描画し、残りを白にします。

これを行うGDIについては何も知りません。また、整数スケーリングを行わない限り、見栄えが非常に悪くなります。つまり、元のビットマップのすべてのピクセルに対して正確に 1 つまたは 2 つの白いピクセルを使用すると、最終的なサイズのオプションが大幅に制限されます。サブピクセル レンダリング (ClearType など) を使用して少し調整できるかもしれませんが、それはさらに特殊な (そしてモニター固有の!) コードを作成する必要があります。現状では、新しいビットマップをピクセルごとに構築する必要があるでしょう。

ソース ビットマップの 3x3 倍のサイズの新しいビットマップを作成し、それを白く塗りつぶして (疑似コード)、かなり近づけることができます。

foreach(point p in oldBitmap)
{
    // draw a 2x2 box into every 3x3 box
    newbitmap.DrawBox(p.x * 3, p.y * 3, 2, 2, p.Color); 
}
DrawBitmap(target, newbitmap)

エッジの周りに素敵な白い境界線を作成するために、いくつかの単一ピクセル調整を追加することをお勧めします。

これでもピクセルの 5/9 が白のままで、非常に色あせた画像になります。

古いディスプレイか何かをエミュレートしようとしていますか?

于 2009-07-27T15:43:57.960 に答える
0

.Net のビットマップには、ピクセル間のスペースに関する論理的な概念がありません。これは自分で書かないといけないと思います。これを行うときは、必ず Bitmap の LockBits メソッドを使用してデータにアクセスしてください。SetPixel と GetPixel は信じられないほど遅いです。

更新: 今日はとても退屈なので、これを書きたいと思います。誰も良い答えを持っていない場合は、昼食後に答えます。

于 2009-07-27T15:51:25.870 に答える