グラフィックスオブジェクトに何かを描画するように指示すると、何が起こるのかをよりよく理解したいと思っています。より具体的にはどのようにGDI +画像のピクセルの色を設定します。GDI +はバイト配列のイメージでどのように機能しますか?
ソースコードを検索しましたが、明らかにまだリリースされていません(実際には、https://referencesource.microsoft.comの回答を検索した後、.dllが実際の図面を処理することが判明しました)。
この全体のポイントは、描画するときにピクセルの色を変更する独自の方法を定義できるようにすることです。
私はこのコードの正しい軌道に乗っていますかどうかわからないです:
ここpublic unsafe Bitmap enlargeImg(Bitmap source, int newWidth, int newHeight)
{
int resMod = (int)Math.Min(newWidth/source.Width, newHeight/source.Height);
Bitmap res = new Bitmap(source.Width * resMod, source.Height * resMod, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
Graphics larGfx = Graphics.FromImage(res);
SolidBrush br;
int pxsz = 4;//for 32 bits per pixel
System.Drawing.Imaging.BitmapData btd = source.LockBits(
new Rectangle(0, 0, source.Width, source.Height),
System.Drawing.Imaging.ImageLockMode.ReadOnly, source.PixelFormat);
for (int r = 0; r < source.Height; r++)
{
byte* bfrw = (byte*)btd.Scan0 + r * btd.Stride;
for (int c = 0; c < source.Width; c++)
{
byte B = bfrw[c * pxsz + 0];
byte G = bfrw[c * pxsz + 1];
byte R = bfrw[c * pxsz + 2];
byte A = bfrw[c * pxsz + 3];
br = new SolidBrush(Color.FromArgb(A, R, G, B));
larGfx.FillRectangle(br, c * resMod, r * resMod, resMod, resMod);
}
}
source.UnlockBits(btd);
return res;
}
私は、画像をスキャンし、各画素が大きくなっている新しい画像を描画してみてください。しかし、これは単に画像のサイズをGraphics.DrawImage
とするよりもはるかに遅いです。はい、私はSetPixel
を試しましたが、それは軽い年の遅いです。
私は2Dゲームエンジンのためにこれをやっているので(ゲームサイクルがあるので)、できるだけ速くする必要があります。
GDI +はどのようにイメージのバイト配列で動作しますか?
これを試してください:https://github.com/LuizZak/FastBitmap – Trey
できるだけ速くする必要がある場合は、おそらくGDI/.netが最悪の組み合わせかもしれません。 – Aron
@Aron私は知らない、私は多くの悪い方法を考えることができます。 – Abion47