最近、SOに関するスレッドがほとんどありませんでした(以下)。一般的な提案の1つは、ポインターを使用しないことでした。
.NETでは、関数パラメーターとしてポインターを使用することと、「ref」キーワードを使用することの間に違いはありますか?
最近、ビットマップ画像の白い背景を透明に変換する必要がありました。私は試してみましたが、思いついた最適な実装は以下のとおりです。
public unsafe Bitmap MakeWhiteAreaTransparent(Bitmap source)
{
Bitmap bitmap = new Bitmap(source.Width, source.Height, PixelFormat.Format32bppArgb);
BitmapData bitmapdata = source.LockBits(new Rectangle(0, 0, source.Width, source.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
BitmapData data2 = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
int* numPtr = (int*)bitmapdata.Scan0;
int* numPtr2 = numPtr + (bitmapdata.Width * bitmapdata.Height);
int* numPtr3 = (int*)data2.Scan0;
int num = Color.FromArgb(1, Color.White).ToArgb();
while (numPtr < numPtr2)
{
numPtr++;
Color color = Color.FromArgb(numPtr[0]);
if (((color.R < 200) || (color.G < 200)) || (color.B < 200))
{
numPtr3[0] = color.ToArgb();
}
else
{
numPtr3[0] = num;
}
numPtr3++;
}
source.UnlockBits(bitmapdata);
bitmap.UnlockBits(data2);
return bitmap;
}
私はポインターを訴えるのが正しいのか、それともバイト配列とSystem.Runtime.InteropServices.Marshal.Copyを使用するべきであり、ポインターをいじくり回すのではないのか疑問に思っていました。