我编写了这个函数的一个版本,它采用灰度位图作为掩码和源位图,并输出一个应用了掩码的位图,SetPixel
但GetPixel
它非常慢,所以我尝试使用 BitmapData 和指针算法编写一个,但我得到了访问冲突,我不知道为什么。
我AccessViolationException
在写入结果位图中的像素时得到一个 - 我认为这是由不正确的索引引起的,但我看不出我哪里出错了。
public static Bitmap ApplyAlphaMask2(Bitmap source, Bitmap mask)
{
if (source.Size != mask.Size)
{
throw new NotImplementedException("Applying a mask of a different size to the source image is not yet implemented");
}
Bitmap result = new Bitmap(source.Width, source.Height);
unsafe
{
BitmapData source_data = source.LockBits(new Rectangle(0, 0, source.Width, source.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
BitmapData mask_data = mask.LockBits(new Rectangle(0, 0, mask.Width, mask.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
BitmapData result_data = result.LockBits(new Rectangle(0, 0, result.Width, result.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
for(int column = 0; column < source.Height; column++)
{
Int32* source_column_ptr = (Int32*)source_data.Scan0 + (column * Math.Abs(source_data.Stride));
Int32* mask_column_ptr = (Int32*)mask_data.Scan0 + (column * Math.Abs(mask_data.Stride));
Int32* result_column_ptr = (Int32*)result_data.Scan0 + (column * Math.Abs(mask_data.Stride));
for (int row = 0; row < source.Width; row++)
{
Color source_color = Color.FromArgb(source_column_ptr[row]);
Color mask_color = Color.FromArgb(mask_column_ptr[row]);
Int32* result_pixel_ptr = &result_column_ptr[row];
Color result_color = Color.FromArgb((int)(255.0f * mask_color.GetBrightness()), source_color);
*result_pixel_ptr = result_color.ToArgb(); //Access violation!
}
}
source.UnlockBits(source_data);
mask.UnlockBits(mask_data);
result.UnlockBits(result_data);
}
return result;
}
任何帮助,将不胜感激。
编辑:这并不总是发生在同一列上,尽管该行似乎总是为 0