C#利用lockbits方法快速对Bitmap进行读写

实例:

关于Bitmap处理的方法展示

使用SetPixel的方法
private void BitmapSetGradient(ref Bitmap bitmap)
        {
            int nx, ny;
            double r, g, b;
            nx = bitmap.Width;
            ny = bitmap.Height;
            for (int i = 0; i < nx; i++)
                for (int j = 0; j < ny; j++)
                {
                    r = (double)i / (double)(nx);
                    g = (double)j/ (double)(ny);
                    b = 0.5;
                    int ir = (int)(255.99 * r);
                    int ig = (int)(255.99 * g);
                    int ib = (int)(255.99 * b);
                    bitmap.SetPixel(i, ny - j - 1, Color.FromArgb(ir, ig, ib));
                }
        }
使用读取内存(lockbits)的方法
 		/// <summary>
        ///  利用内存去对Bitmap进行快速操作
        /// </summary>
        /// <param name="bitmap">操作的bitmap对象</param>
        private void FastBitmapSetGradient(ref Bitmap bitmap)
        {

            int nx, ny;// 图像长宽
            double r, g, b;
            nx = bitmap.Width;
            ny = bitmap.Height;

            // 锁定位图
            Rectangle rect = new Rectangle(0, 0, nx, ny);
            System.Drawing.Imaging.BitmapData bmpData =
                bitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
                bitmap.PixelFormat);

            // 获取首行地址
            IntPtr ptr = bmpData.Scan0;

            // 定义数组保存位图
            int bytes = nx * ny * 4;
            byte[] rgbValues = new byte[bytes];

            // 进行渐变式像素生成
            for (int i = 0; i < nx; i++)
                for (int j = 0; j < ny; j++)
                {
                    r = (double)i / (double)(nx);
                    g = (double)j / (double)(ny);
                    b = 0.5;
                    int ir = (int)(255.99 * r);
                    int ig = (int)(255.99 * g);
                    int ib = (int)(255.99 * b);

                    rgbValues[(ny-j-1)*4*nx+i*4] = (byte)ib;
                    rgbValues[(ny-j-1)*4*nx+i*4 + 1] = (byte)ig;
                    rgbValues[(ny-j-1)*4*nx+i*4 + 2] = (byte)ir;
                    rgbValues[(ny - j - 1) * 4 * nx + i * 4 + 3] = (byte)(255);
                }

            // 把RGB值拷回位图
            System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);

            // 解锁
            bitmap.UnlockBits(bmpData);
        }

对比图

对比图

上方的图片设置的都是1080p,生成时间在生成图片的正下方,可以看出使用内存操作的速度远胜于直接SetPixel方法,就是代码稍微多了些,不过在处理高分辨率图片的时候用操作内存会大大减少消耗的时间

LockBits(Rectangle, ImageLockMode, PixelFormat)

public System.Drawing.Imaging.BitmapData LockBits (System.Drawing.Rectangle rect, System.Drawing.Imaging.ImageLockMode flags, System.Drawing.Imaging.PixelFormat format);

参数
rect
Rectangle
一个 Rectangle 结构,指定要锁定的 Bitmap 部分。
flags
ImageLockMode
一个 ImageLockMode 枚举,指定 Bitmap 的访问级别(读/写)。
format
PixelFormat
一个 PixelFormat 枚举,指定此 Bitmap 的数据格式。
返回
BitmapData
包含有关此锁定操作信息的 BitmapData。

LockBits(Rectangle, ImageLockMode, PixelFormat, BitmapData)

public System.Drawing.Imaging.BitmapData LockBits (System.Drawing.Rectangle rect, System.Drawing.Imaging.ImageLockMode flags, System.Drawing.Imaging.PixelFormat format, System.Drawing.Imaging.BitmapData bitmapData);

参数
rect
Rectangle
一个矩形结构,指定要锁定的 Bitmap 部分。
flags
ImageLockMode
某个 ImageLockMode 值,指定 Bitmap 的访问级别(读/写)。
format
PixelFormat
某个 PixelFormat 值,指定 Bitmap 的数据格式。
bitmapData
BitmapData
包含锁定操作信息的 BitmapData。
返回
BitmapData
包含锁定操作信息的 BitmapData。

使用了lockbits后还要记得配合unlockbits使用

总结

在对像素值设置的时候bmp图像的PixelFormat是32位ARGB,意味着你不仅对R,G,B赋值,还得对透明通道赋值,其次,在做的时候记得赋值的顺序是按照R,G,B,A依次对byte数组赋值。

根据此篇文章所感:C#中使用lockbits方法处理图像(译文)
官方API查询:Bitmap.LockBits 方法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值