Bitmap.LockBits(Rectangle rect,ImageLockMode flags,PixelFormat format);
在做图片裁切时,需要一小块一小块局部裁切。但是在处理这一小块像素的时候,会出现黑点麻点,甚至像素错位。
这是因为Bitmap为RBG三分量格式时,排列像素有一个像素对齐的处理。
使用如下:
int width = src_img.Width / 10;
int height = src_img.Height / 20;
int stride = width * 3; while(stride % 4 != 0){ stride++;}// 每行像素不是4的倍数,则要补齐
int bytes = stride * height;
for (int i = 0; i < 20; i++)
{
for (int j = 0; j < 10; j++)
{
Rectangle rect = new Rectangle(j * width, i * height, width, height);
BitmapData data_cell = new BitmapData();
IntPtr pointer = Marshal.AllocHGlobal(bytes); //申请一块内存
byte[] rgbValues = new byte[bytes];
data_cell.Scan0 = pointer;// 这里给裁切的像素块指定内存地址和Stride,是因为LockBits方法的特性,大家可自行百度
data_cell.Stride = stride;
ImageLockMode flags=ImageLockMode.ReadOnly| ImageLockMode.UserInputBuffer;
src_img.LockBits(rect,flags, src_img.PixelFormat, data_cell);
Marshal.FreeHGlobal(pointer);
src_img.UnlockBits(data_cell);
}
}