返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#合并BitMap图像生成超大bitmap
  • 216
分享到

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

2024-04-02 19:04:59 216人浏览 安东尼
摘要

当只需要两个图像合并的时候,可以简单的使用gdi+,把两个图像画到一个画布上面实现合并bitmap. 当需要将许多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 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 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#合并BitMap内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C#合并BitMap图像生成超大bitmap

本文链接: https://lsjlt.com/news/157727.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C#合并BitMap图像生成超大bitmap
    当只需要两个图像合并的时候,可以简单的使用gdi+,把两个图像画到一个画布上面实现合并bitmap. 当需要将许多bitmap合并时,由于bitmap类限制,长度或宽度太大时会报异...
    99+
    2024-04-02
  • C#合并BitMap图像如何生成超大bitmap
    这篇文章主要介绍C#合并BitMap图像如何生成超大bitmap,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!当只需要两个图像合并的时候,可以简单的使用gdi+,把两个图像画到一个画布上面实现合并bitmap.当需要...
    99+
    2023-06-25
  • Android生成带圆角的Bitmap图片
    本文实例讲述了Android生成带圆角的Bitmap图片。分享给大家供大家参考。具体如下: 有时候我们在开发Android应用时,会遇到圆角图片的问题,那么,我们如何在Andr...
    99+
    2022-06-06
    bitmap Android
  • C# Bitmap图像处理加速的实现
    目录BitmapData类传统代码使用BitmapData的代码效率对比代码GPU加速生成Dll调用Dll耗时BitmapData类 BitmapData类专门用于位图处理,与Bit...
    99+
    2024-04-02
  • C#的Bitmap图像处理方法有哪些
    本篇内容介绍了“C#的Bitmap图像处理方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Bitmap类Bitmap对象封装了GDI...
    99+
    2023-06-25
  • C#中如何实现Bitmap图像处理加速
    这篇文章主要讲解了“C#中如何实现Bitmap图像处理加速”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#中如何实现Bitmap图像处理加速”吧!BitmapData类BitmapData...
    99+
    2023-06-25
  • android通过bitmap生成新图片关键性代码
    1、关键性代码 代码如下: //R.drawable.test为当前工程里的一张图片 Bitmap bitmap = BitmapFactory.decodeResource...
    99+
    2022-06-06
    图片 bitmap 关键 Android
  • C# Bitmap图像处理(含增强对比度的三种方法)
    目录Bitmap类BitmapData类参考:Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据...
    99+
    2024-04-02
  • matlab怎么导入数据并生成图像
    要在Matlab中导入数据并生成图像,你可以按照以下步骤进行操作:1. 导入数据:将数据保存在一个文件中,例如CSV或TXT格式。然...
    99+
    2023-09-13
    matlab
  • python opencv 找出图像中的最大轮廓并填充(生成mask)
    本文主要介绍了python opencv 找出图像中的最大轮廓并填充,分享给大家,具体如下: import cv2 import numpy as np from PIL imp...
    99+
    2024-04-02
  • C++ OpenCV如何生成蒙太奇图像
    这篇文章主要介绍“C++ OpenCV如何生成蒙太奇图像”,在日常操作中,相信很多人在C++ OpenCV如何生成蒙太奇图像问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++ ...
    99+
    2023-06-26
  • python使用openai生成图像的超详细教程
    OpenAI 是一个人工智能的工具包,包括神经网络、遗传算法和有限状态机等。使用python可以非常便捷的操作OpenAI的API。一下是OpenAI官网列举的功能DEMO 首先使...
    99+
    2023-03-19
    python怎么生成图像 openai教程 opencv生成图像
  • Python获取图片像素BGR值并生成纯色图
    目录前言依赖安装代码验证一下前言 最近工作有个需求,获取某张图片某个像素颜色,生成该颜色的纯色图片。所以写了一个工具,分享给大家,如果大家也有一样的场景,可以直接使用。 依赖安装 需...
    99+
    2024-04-02
  • Python如何获取图片像素BGR值并生成纯色图
    这篇“Python如何获取图片像素BGR值并生成纯色图”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python如何获取图片...
    99+
    2023-06-26
  • C++OpenCV生成蒙太奇图像的示例详解
    目录前言一、输入模板图像二、读取素材图像三、生成蒙太奇模板四、生成蒙太奇图像五、源码总结前言 本文将使用OpenCV C++ 生成蒙太奇图像。 一、输入模板图像 原图如图所示。我们...
    99+
    2024-04-02
  • php生成二维码合成文字、背景图并保存本地图片
    目录 1、实现效果,二维码二维码合成文字、背景图 2、下载并引入qrcode 3、创建static文件夹下载字体和背景图到这 4、创建test2.php,合成代码   1、实现效果,二维码二维码合成文字、背景图 2、下载并引入qr...
    99+
    2023-09-23
    php 开发语言
  • AI绘图实战(五):放大并修复老照片、马赛克照片、身份证件照 | Stable Diffusion成为设计师生产力工具
    S:你安装stable diffusion就是为了看小姐姐么? I :当然不是,当然是为了公司的发展谋出路~~ 预先学习: 安装及其问题解决参考:《Windows安装Stable Diff...
    99+
    2023-09-20
    stable diffusion 人工智能 ai 制图 深度学习
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作