C# LockBits ImageLockMode.UserInputBuffer 裁切图片出现黑点 麻点 之解决办法



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);
    }
}


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值