如何解决在C#中修改像素的最快方法是什么
我想将位图中的指定像素更改为透明。 方法如下:
Bitmap bt = new Bitmap(Mybitmap);
System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0,Mybitmap.Width,Mybitmap.Height);
BitmapData bmpdata = bt.LockBits(rect,ImageLockMode.ReadWrite,bt.PixelFormat);
IntPtr ptr = bmpdata.Scan0;
int bytes = Math.Abs(bmpdata.Stride) * bt.Height;
byte[] rgbValues = new byte[bytes];
Marshal.Copy(ptr,rgbValues,bytes);
int len = rgbValues.Length;
for (int i = 0; i < len; i += 4)
{
//Some colors are already stored in this SpecificColor1ist,and pixels with the same color will be changed to transparent
foreach (var item in SpecificColor1ist)
{
if ((rgbValues[i]==item.B)&&(rgbValues[i+1] == item.G)&&(rgbValues[i+2] == item.R))
{
rgbValues[i + 3] = (byte)0;
}
}
}
System.Runtime.InteropServices.Marshal.Copy(rgbValues,ptr,bytes);
bt.UnlockBits(bmpdata);
return bt;
但是速度太慢。有什么办法可以使其更快?不安全的代码也是可以接受的。
解决方法
- 您有一个指向像素数据数组的指针,为什么不使用它
Scan0
(您需要将方法设置为不安全,并在项目的构建选项中对其进行适当设置) - 您可以确保像素格式为32位。
- 您可以与int一次性比较rbg值
- 使用HashSet进行快速查找
- 使用按位
&
清除apha通道
示例
var colorHash = SpecificColor1ist
.Select(x => x.ToArgb())
.ToHashSet();
...
var data = bt.LockBits(rect,ImageLockMode.ReadWrite,PixelFormat.Format32bppPArgb);
var length = (int*)data.Scan0 + Mybitmap.Height * Mybitmap.Width;
for (var p = (int*)data.Scan0; p < length; p++)
if(colorHash .Contains(*p))
*p = (*p & 0xFFFFFF) // i think sets the alpha to 0
...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。