C#彩色图像转换灰度图像内存法优化版本

 通过传统的内存法,在计算灰度的for改为Parallel.For进行并发,比之前提升了0.5-1倍左右

源码如下:

public static Bitmap Gray_BitmapData(Bitmap bitmap)
        {
            int width = bitmap.Width;
            int height = bitmap.Height;
            // 在内存中以读写模式锁定Bitmap
            BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
            // 获取第一个像素的地址
            IntPtr ptr = bitmapData.Scan0;
            //图片像素点数组的长度,由于一个像素点占了3个字节,所以要乘上3
            int size = width * height * 3;
            //缓冲区数组
            byte[] srcArray = new byte[size];
            //把像素值复制到缓冲区
            Marshal.Copy(ptr, srcArray, 0, size);
            Parallel.For(0, width * height, (i, loopState) =>
            {
                byte color1 = (byte)((srcArray[i * 3] + srcArray[i * 3 + 1] + srcArray[i * 3 + 2]) / 3);
                // 计算灰度值并写入原位
                Marshal.WriteByte(ptr, i * 3, color1);
                Marshal.WriteByte(ptr, i * 3 + 1, color1);
                Marshal.WriteByte(ptr, i * 3 + 2, color1);

            });
            // 从内存中解锁
            bitmap.UnlockBits(bitmapData);
            return bitmap;
        }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值