实例:
关于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 方法