C# 合并BitMap图像,生成超大bitmap

使用c#,合并多个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 h1 = Convert.ToInt32(hexHeight.Substring(0, 2), 16);
int h2 = Convert.ToInt32(hexHeight.Substring(2, 2), 16);
int h3 = Convert.ToInt32(hexHeight.Substring(4, 2), 16);
int h4 = Convert.ToInt32(hexHeight.Substring(6, 2), 16);
byte[] sizeHeight = new byte[] { (byte)h4, (byte)h3, (byte)h2, (byte)h1 };
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 memoryBitmapData 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 memorybmp.UnlockBits(bmpdata);}
catch{
return null;}
return bits;}

完成喽。

如果喜欢,点个赞呗~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重磅来袭,2018 年 6 月编程语言排行榜

TIOBE 编程语言社区最新发布了 2018 年 6 月排行榜,和 5 月榜单相比,前九名没有任何变化,依然是 Java、C、C、Python、C#、Visual Basic .NET、PHP、JavaScript、SQL。5月份第十名的Ruby在这个月下降了一名,而R则上升一名&#xf…

mysql bench linux_MySQL Study之--Linux下安装MySQL workbench工具

系统环境:操作系统: RedHat EL6.4(64)WorkBench: mysql-workbench-community-6.0.9MySQL Workbench是一款专为MySQL设计的ER/数据库建模工具。它是著名的数据库设计工具DBDesigner4的继任者。你可以用MySQL Workbench设计和创建新的数据库图示…

近两个月工作日志

从3月18日到今日,接近两个月的时间,一直在做的一件事,就是为 xx公司开发库存管理系统。最近终于开发完毕,想着坐下来好好总结总结。 XX公司专业生产蕾丝产品,有15年的历史,因业务提升的关系,急需…

.NET6发布了Preview2,这点超越过去10年!

从ASP.NET的性能诟病,到.NET Core的性能持续改进,在每一个.NET Core版本都能看到性能优化提升的介绍。.NET Core3.1在各种性能排行中霸榜,.NET5再度提升了性能,前些天发布的.NET Preview2,通过PGO (Profile…

人工智能预测2018年世界杯 | 德国人打破历史将在俄罗斯上取得最后的胜利?

2018年俄罗斯世界杯近在眼前,比赛将于6月14日~7月15日在俄罗斯的各地举行。但世界杯还没开始,人们已经出现了各种各样的“比赛结果预测”。其中不乏有一些专业人士以及原足球选手,也有许多“生物”对此预测。前几年,章鱼哥保罗就准…

Q+开放的互联网:腾讯QQ “亮剑” 开放平台

(图一) 近日,人民日报的腾讯广告(图一),在网民心中引起不小的波动。看着图中憨厚的小企鹅,后面是数以万计的应用软件,给人一种大将领兵征战沙场的感觉。图片左下角是 “Q开放的互联网…

php查询mysql乱码_php 查询mysql乱码怎么办

php查询mysql乱码的解决办法:1、修改PHP页面语言本身的编码类型;2、将MySQL字符集更改为“UTF8”;3、使用ultraplus中的编码转换功能进行转换。php读取mysql中文数据出现乱码的解决方法1.PHP页面语言本身的编码类型不合适,这时候&…

猝不及防,Google成功“造人”令人胆寒!人类迎来史上最惨失业潮…

01猝不及防!这次,Google“造人”了!5月8号,谷歌召开一年一度的Google I/O大会。谷歌CEO劈柴直接祭出了这次大会的王牌AI,这个智能过人的Al让人看完不禁倒吸一口凉气……相比Apple Siri和Microsoft Cortana只能机械式对…

雷军这个程序员!真的牛逼!

阅读本文大概需要3分钟。这两天忙着给CEO汇报工作以及跟进几个新产品的进展,忙到连新闻都没时间看。今天终于轻松了点,早上起来刷了刷知乎,看见一个让我惊呆了的消息:雷军要造车了!雷军宣称亲自带队,初期就…

poj2545

题意:给出三个质数,求这素因子只有这三个质数的数中第k大的。 分析:用一个数列,第一位是1。用三个指针指向三个prime要乘的被乘数,最开始都指向1。每次取乘积最小的加入数组,并把指针后移。加入时要判断是否…

mysql rpm 安装后修改路径_mysql rpm包安装后修改数据目录

mysql rpm包安装后修改数据目录发布时间:2020-06-14 23:24:25来源:51CTO阅读:1160作者:梦在这里mysql rpm包安装后修改数据目录1.停止mysql数据服务/etc/init.d/mysqld stop2.为创建的数据目录指定权限chmod -R 777 /home/mysql/d…

微软发布 Windows 10 预览版 Build 21343:此电脑和回收站等启用全新图标

微软已向开发频道(Dev)的 Windows 预览体验成员发布了 Windows 10 Insider Preview Build 21343 更新。内置应用和文件夹启用全新图标从去年开始,微软就不断为 Windows 10 内置应用重新设计图标。在 Windows 10 版本 20H2 更新中,…

什么样的程序员会让人讨厌

我有一个朋友,就是一个程序员,找他做事的时候,最让人讨厌了。00不愿意帮我修电脑。我说电脑坏了,想让他看看,他先是叫我检查插头,然后叫我重启,重启好之后,他冷淡的说:以…

XenServer XAPI简介

什么是XAPI,或者说XAPI在XenServer中有什么作用? XAPI(或者XenAPI)是XenServer中的一组管理接口的统称,是XenServer管理的核心,由一系列的toolstack组成。 XAPI主要提供XenCenter以及pool中各主机通信的接口…

leetcode刷题可以用python吗_LeetCode刷题——第四天(python)

每天选壁纸做封面这个环节是我最喜欢的,今天的题目是比较经典又十分简单的一道题。第四天——第四题(回文数)请看题:判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例1:输入: 121输出: true示例2&…

金州勇士队,硅谷黑科技打造的NBA奇迹!

【导读:2018NBA决赛表明,创业如同打球,应该学习勇士,团队作战打“群架”,单打独斗像骑士,纵有“小皇帝”,也难免被横扫】NBA是中国人民最喜欢观看和讨论的美国体育联赛。在NBA诸强中&#xff0c…

C# 调用动态链接库读取二代身份证信息

概述一般来说winform应用程序解决这个问题起来时很容易的,web应用程序就麻烦一点了。你必要有联机型居民身份证阅读器一个。实现方式1、新建一个winform控件项目ReadCardControl,添加一个主类ReadIDCardprivate bool ReadIDCard(){try{BLL.API.SynIDCar…

lighttpd mysql_lighttpd+mysql+php

博客已经搬家,请访问如下地址:http://www.czhphp.com一:安装mysql安装:unzip mysql-5.1.33.zipcd mysql-5.1.33.zip./configure –prefix/usr/local/mysql –enable-assembler –with-extra-charsetscomplex –enable-thread-safe…

ibatis学习笔记

http://code.google.com/p/mybatisnet/ 官网

入坑机器学习?送你一篇麻省博士的学习心得

[导读] 随着人工智能技术的火热,越来越多的年轻学者正准备投身其中,开启自己的研究之路。和所有其他学科一样,人工智能领域的新人总会遇到各种各样的难题,其中不仅有研究上的,也有生活方面的。MIT EECS 在读博士、前 V…