当前位置: 首页 > news >正文

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

http://www.mrgr.cn/news/79449.html

相关文章:

  • [工具升级问题] 钉钉(linux版)升级带来的小麻烦
  • HCIA-Access V2.5_2_2网络通信基础_TCP/IP协议栈报文封装
  • LabVIEW偏心圆筒流变仪测控系统
  • OpenSSH和OpenSSL升级
  • 磁盘阵列服务器和普通服务器的区别
  • 线性时间排序算法:计数排序、桶排序与基数排序详解
  • Linux网络编程之---组播和广播
  • 【数字电路与逻辑设计】实验一 序列检测器
  • 阻塞队列详解
  • 文件IO——01
  • 高性能MySQL(第四版)读书笔记
  • 树莓派开发笔记
  • 第32天:安全开发-JavaEE应用Servlet路由技术JDBCMybatis数据库生命周期
  • OpenCV圆形标定板检测算法findCirclesGrid原理详解
  • day1:ansible
  • 【ManiSkill】ppo.py - notes
  • API设计指南:详解HTTP状态码错误解析、HTTP方法及参数命名规则
  • 【人工智能基础】知识导图
  • 档案学实物
  • 表的约束.
  • android studio 读写文件操作(应用场景三)
  • shell 6 if条件判断与for循环结构 (泷羽sec)
  • 14.数据容器-set集合
  • 前端面经每日一题day05
  • [C++]对象数组
  • 数据结构---单链表