C#加速Bitmap存图
如果希望大幅提高图像保存速度,特别是在处理非常大的图像时,可以尝试以下更直接、更高效的方法:
1. 避免使用 Bitmap 类的 Save 方法
Bitmap.Save 方法的速度受限于 GDI+ 库的操作,尤其是对于非常大的图像,它可能会经历内存分配、像素格式转换等多重开销。我们可以通过直接操作图像数据流来绕过这些问题。
2. 直接将图像数据写入文件(原始像素数据)
对于大型图像,您可以直接将图像的像素数据转换为 BMP 格式的二进制流,并快速写入文件。BMP 格式是一个非常简单的无压缩格式,因此您可以手动构造 BMP 文件头和像素数据流。
下面是一个使用 原始图像数据流 写入RGB-BMP 文件的例子:
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Runtime.InteropServices;class Program
{static void Main(){// 创建一个较大的 Bitmap 对象(例如 5000x5000)Bitmap bitmap = new Bitmap(5000, 5000);// 在这里填充图像,模拟数据using (Graphics g = Graphics.FromImage(bitmap)){g.Clear(Color.Blue); // 蓝色背景}// 保存为 BMP 格式SaveBitmapAsBmpFast(bitmap, "output.bmp");}static void SaveBitmapAsBmpFast(Bitmap bitmap, string filePath){// 锁定位图数据Rectangle rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);BitmapData bitmapData = bitmap.LockBits(rect, ImageLockMode.ReadOnly, bitmap.PixelFormat);// 创建文件流using (FileStream fs = new FileStream(filePath, FileMode.Create)){// 计算图像文件大小int rowSize = bitmapData.Stride;int dataSize = rowSize * bitmap.Height;// BMP 文件头byte[] fileHeader = new byte[14] {0x42, 0x4D, // 'BM'标识符0, 0, 0, 0, // 文件大小(稍后设置)0, 0, // 保留字段0, 0, // 保留字段0x36, 0x00, 0x00, 0x00 // 位图数据的偏移量};fs.Write(fileHeader, 0, fileHeader.Length);