欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2021年11月18日 16:10:58   作者:記住我Gxy  
當(dāng)兩個(gè)圖像合并的時(shí)候,以簡(jiǎn)單的使用gdi+,當(dāng)需要將許多bitmap合并時(shí)就會(huì)造成寬度過大,那么怎么實(shí)現(xiàn)C#合并BitMap圖像,本文就詳細(xì)的介紹一下

當(dāng)只需要兩個(gè)圖像合并的時(shí)候,可以簡(jiǎn)單的使用gdi+,把兩個(gè)圖像畫到一個(gè)畫布上面實(shí)現(xiàn)合并bitmap.

當(dāng)需要將許多bitmap合并時(shí),由于bitmap類限制,長(zhǎng)度或?qū)挾忍髸r(shí)會(huì)報(bào)異常,前面這種方法就行不通了。

由于bitmapp屬于位圖格式,了解圖像格式后,發(fā)現(xiàn),bitmap文件的第3-8位存儲(chǔ)了文件大小信息,第19-22位存儲(chǔ)了高度信息,第23-26位存儲(chǔ)了寬度信息。文件頭后面都是像素的argb,并無(wú)其它信息。于是,試想一下,如果把第二張圖像的像素argb放到第一張后面,并修改第一張的文件頭信息,是不是就可以實(shí)現(xiàn)文件合并了呢。事實(shí)證明:yes。

//設(shè)置文件頭里面文件大小信息

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

設(shè)置文件頭里面文件長(zhǎng)度和寬度信息

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

合并多個(gè)bitmap文件,并生成一個(gè)最終文件

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

到此這篇關(guān)于C#合并BitMap圖像生成超大bitmap的文章就介紹到這了,更多相關(guān)C#合并BitMap內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#實(shí)體類轉(zhuǎn)換的兩種方式小結(jié)

    C#實(shí)體類轉(zhuǎn)換的兩種方式小結(jié)

    這篇文章主要介紹了C#實(shí)體類轉(zhuǎn)換的兩種方式小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • C# IFF圖形結(jié)構(gòu)解析代碼

    C# IFF圖形結(jié)構(gòu)解析代碼

    這個(gè)結(jié)構(gòu)有點(diǎn)像RIFF文件。。是分段的。但要注意ANNO這個(gè)描述字段 必須是使用2個(gè)字節(jié) 否則ACDSEE無(wú)法識(shí)別。
    2010-03-03
  • C#中委托的基本概念介紹

    C#中委托的基本概念介紹

    這篇文章主要介紹了C#中委托的基本概念介紹,本文講解了委托的使用、委托類型和委托實(shí)例、委托的合并和刪除、委托是不易變的、委托調(diào)用列表、GetInvocationList等內(nèi)容,需要的朋友可以參考下
    2015-02-02
  • c#開發(fā)cad預(yù)覽圖塊步驟詳解

    c#開發(fā)cad預(yù)覽圖塊步驟詳解

    在本篇文章里小編給大家分享了關(guān)于c#開發(fā)cad預(yù)覽圖塊步驟和相關(guān)知識(shí)點(diǎn),需要的朋友們學(xué)習(xí)下。
    2019-02-02
  • Winform窗體如何改變語(yǔ)言類型

    Winform窗體如何改變語(yǔ)言類型

    這篇文章主要介紹了Winform窗體如何改變語(yǔ)言類型,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-11-11
  • c#實(shí)現(xiàn)幾種數(shù)據(jù)庫(kù)的大數(shù)據(jù)批量插入

    c#實(shí)現(xiàn)幾種數(shù)據(jù)庫(kù)的大數(shù)據(jù)批量插入

    這篇文章主要介紹了c#實(shí)現(xiàn)幾種數(shù)據(jù)庫(kù)的大數(shù)據(jù)批量插入,主要包括SqlServer、Oracle、SQLite和MySQL,有興趣的可以了解一下。
    2017-01-01
  • C#連接Mysql實(shí)現(xiàn)增刪改查的操作

    C#連接Mysql實(shí)現(xiàn)增刪改查的操作

    在IT行業(yè)中,數(shù)據(jù)庫(kù)連接是應(yīng)用程序開發(fā)中的重要環(huán)節(jié),尤其是在使用C#進(jìn)行Windows或者Web應(yīng)用開發(fā)時(shí),經(jīng)常需要與各種數(shù)據(jù)庫(kù)進(jìn)行交互,其中就包括廣泛使用的MySQL,本篇將詳細(xì)講解如何使用C#語(yǔ)言來(lái)連接MySQL數(shù)據(jù)庫(kù),以實(shí)現(xiàn)數(shù)據(jù)的讀取、寫入和其他操作
    2024-09-09
  • 解答“60k”大佬的19道C#面試題(上)

    解答“60k”大佬的19道C#面試題(上)

    這篇文章主要解答了“60k”大佬的19道C#面試題中的10道,文中的面試題比較小眾,作者給了不錯(cuò)的答案,相信對(duì)你以后的面試有所幫助,感興趣就來(lái)了解下
    2020-06-06
  • C#更改tabControl選項(xiàng)卡顏色的方法

    C#更改tabControl選項(xiàng)卡顏色的方法

    這篇文章主要介紹了C#更改tabControl選項(xiàng)卡顏色的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了C#更改tabControl選項(xiàng)卡顏色的的具體步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-03-03
  • 基于WPF實(shí)現(xiàn)用戶頭像選擇器的示例代碼

    基于WPF實(shí)現(xiàn)用戶頭像選擇器的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何基于WPF實(shí)現(xiàn)用戶頭像選擇器,文中的示例代碼簡(jiǎn)潔易懂,對(duì)我們學(xué)習(xí)WPF有一定幫助,感興趣的可以了解一下
    2022-07-07

最新評(píng)論