C#合并BitMap图像如何生成超大bitmap
发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,这篇文章主要介绍C#合并BitMap图像如何生成超大bitmap,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!当只需要两个图像合并的时候,可以简单的使用gdi+,把两个图像画到
千家信息网最后更新 2025年02月03日C#合并BitMap图像如何生成超大bitmap
这篇文章主要介绍C#合并BitMap图像如何生成超大bitmap,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
当只需要两个图像合并的时候,可以简单的使用gdi+,把两个图像画到一个画布上面实现合并bitmap.
当需要将许多bitmap合并时,由于bitmap类限制,长度或宽度太大时会报异常,前面这种方法就行不通了。
由于bitmapp属于位图格式,了解图像格式后,发现,bitmap文件的第3-8位存储了文件大小信息,第19-22位存储了高度信息,第23-26位存储了宽度信息。文件头后面都是像素的argb,并无其它信息。于是,试想一下,如果把第二张图像的像素argb放到第一张后面,并修改第一张的文件头信息,是不是就可以实现文件合并了呢。事实证明:yes。
//设置文件头里面文件大小信息public void SetBitmapFileSizeInfo(string filePath) { FileInfo fileInfo = new FileInfo(filePath); long le = fileInfo.Length; string hexSize = le.ToString("X").PadLeft(8, '0'); int size1 = Convert.ToInt32(hexSize.Substring(0, 2), 16); int size2 = Convert.ToInt32(hexSize.Substring(2, 2), 16); int size3 = Convert.ToInt32(hexSize.Substring(4, 2), 16); int size4 = Convert.ToInt32(hexSize.Substring(6, 2), 16); byte[] sizeBytes = new byte[] { (byte)size4, (byte)size3, (byte)size2, (byte)size1 }; using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Write)) { using (BinaryWriter r = new BinaryWriter(fs)) { r.Seek(2, 0); r.Write(sizeBytes, 0, sizeBytes.Length); } } }
设置文件头里面文件长度和宽度信息
public void SetBitmapSizeInfo(string filePath,int width=0,int height=0) { if (height != 0) { string hexHeight = height.ToString("X").PadLeft(8, '0'); int h2 = Convert.ToInt32(hexHeight.Substring(0, 2), 16); int h3 = Convert.ToInt32(hexHeight.Substring(2, 2), 16); int h4 = Convert.ToInt32(hexHeight.Substring(4, 2), 16); int h5 = Convert.ToInt32(hexHeight.Substring(6, 2), 16); byte[] sizeHeight = new byte[] { (byte)h5, (byte)h4, (byte)h3, (byte)h2 }; using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite)) { using (BinaryWriter r = new BinaryWriter(fs)) { r.Seek(22, 0);//高度保存位置 r.Write(sizeHeight, 0, sizeHeight.Length); } } } if (width != 0) { string hexWidth = height.ToString("X").PadLeft(8, '0'); int w1 = Convert.ToInt32(hexWidth.Substring(0, 2), 16); int w2 = Convert.ToInt32(hexWidth.Substring(2, 2), 16); int w3 = Convert.ToInt32(hexWidth.Substring(4, 2), 16); int w4 = Convert.ToInt32(hexWidth.Substring(6, 2), 16); byte[] sizeWidth = new byte[] { (byte)w4, (byte)w3, (byte)w2, (byte)w1 }; using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite)) { using (BinaryWriter r = new BinaryWriter(fs)) { r.Seek(18, 0);//高度保存位置 r.Write(sizeWidth, 0, sizeWidth.Length); } } } }
合并多个bitmap文件,并生成一个最终文件
private void CreateBitMap(string tempPath,string imagePath) { string[] files = Directory.GetFiles(tempPath, "*.png"); Bitmap bmp; int height=0; for (int i = files.Length-1; i >0; i--) { string fileName = files[i]; bmp = new Bitmap(fileName); if (i == files.Length - 1) { bmp.Save(imagePath, ImageFormat.Bmp); height += bmp.Height; bmp.Dispose(); continue; } else { byte[] bytes = GetImageRasterBytes(bmp, PixelFormat.Format32bppRgb); using (FileStream fs = new FileStream(imagePath, FileMode.Open, FileAccess.Write)) { fs.Seek(fs.Length, 0); fs.Write(bytes, 0, bytes.Length); } height += bmp.Height; bmp.Dispose(); } } SetBitmapFileSizeInfo(imagePath); SetBitmapSizeInfo(imagePath, height: height); //MessageBox.Show("合并成功"); } private static byte[] GetImageRasterBytes(Bitmap bmp, PixelFormat format) { Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height); byte[] bits = null; try { // Lock the managed memory BitmapData bmpdata = bmp.LockBits(rect, ImageLockMode.ReadWrite, format); // Declare an array to hold the bytes of the bitmap. bits = new byte[bmpdata.Stride * bmpdata.Height]; // Copy the values into the array. System.Runtime.InteropServices.Marshal.Copy(bmpdata.Scan0, bits, 0, bits.Length); // Release managed memory bmp.UnlockBits(bmpdata); } catch { return null; } return bits; }
以上是"C#合并BitMap图像如何生成超大bitmap"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
文件
信息
图像
生成
宽度
高度
存储
C#
两个
位置
像素
内容
大小
格式
篇文章
长度
成功
事实
价值
位图
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
洛阳西美网络技术
360网络安全与国家
为危害网络安全提供帮助处罚
数据库搭建最近技术
密码泄漏数据库
服务器主机和机箱有什么区别
网站有服务器吗
服务器脆弱
全国参战军人数据库名单
为什么uk安装连接服务器失败
植物数据库中科院
互联网科技基金
香港服务器租用cera
天津文件服务器安全狗
根域名网络安全股票
四川app软件开发哪家便宜
淮北保险软件开发
数据库中捕获异常的程序
UL2900 网络安全
关闭445端口对服务器
大学网络安全课件
湖南惠普服务器维修费用
有关网络安全的比赛知识点
软件测试转岗为软件开发容易吗
数据库向后兼容补丁
数据库中捕获异常的程序
水利行业网络安全宣传展板
市可搜网络技术有限公司
php打开数据库名语句
软件开发系统需求整理