内存法一般来说是c#三种图像操作方法中最快速的,不过要操纵内存指针,有出错的可能。
一般流程就是锁定图像——指针处理——解锁图像。
下面贴一个自己整理的操作函数。
注意,只在ARGB图像上通过。
C# Code
private
void Points(Bitmap bmp)
{ Rectangle lockRect = new Rectangle( 0, 0, bmp.Width, bmp.Height); //要锁定的范围,一般来说是整幅图片 BitmapData imgData = bmp.LockBits(lockRect, ImageLockMode.ReadOnly, bmp.PixelFormat); //锁定源图像 //ImageLockMode分为ReadOnly、WriteOnly和ReadWrite,对应只读、只写和读写 int rowOffset = imgData.Stride - bmp.Width * 4; //每一行的偏移量。因为要处理的是ARGB图像,所以*4 unsafe //因为需要操作指针,所以放在Unsafe中,记得打开允许“不安全代码” { byte *imgPtr = ( byte *)imgData.Scan0.ToPointer(); //指向锁定区域的第一个像素 for ( int i = 0; i < bmp.Width; ++i) { for ( int j = 0; j < bmp.Height; ++j) { imgPtr[ 0] = 255; //蓝,,给像素赋予特定颜色 imgPtr[ 1] = 255; //绿 imgPtr[ 2] = 255; //红 imgPtr[ 3] = 255; //Alpha imgPtr += 4; // 偏移一个像素 } imgPtr += rowOffset; // 偏移到下一行 } } bmp.UnlockBits(imgData); //解锁源图像 } |