公交车上荫蒂添的好舒服的电影-公用玩物(np双xing总受)-公用小荡货芊芊-公与妇仑乱hd-攻把受做哭边走边肉楼梯play-古装一级淫片a免费播放口

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C#如何實(shí)現(xiàn)Image無損轉(zhuǎn)Icon

admin
2025年5月9日 15:5 本文熱度 115
前言

本文描述如何使用C# 實(shí)現(xiàn)圖像轉(zhuǎn)圖標(biāo)。正常情況下我們會(huì)直接使用Icon類的Icon.FromHandle(image.GetHicon())方法進(jìn)行圖像轉(zhuǎn)Icon圖標(biāo),但是眾所周知的是這個(gè)方法的缺點(diǎn)是轉(zhuǎn)換的圖標(biāo)會(huì)模糊、與原圖不一致。那么如何獲取高清的圖標(biāo)呢?

我們可以使用自定義填寫數(shù)據(jù)的方式實(shí)現(xiàn),如下圖藍(lán)色區(qū)域?yàn)镮con文件的頭部信息,通過查看圖像的頭部信息,我們只需要按位填入對(duì)應(yīng)的數(shù)值并填入原圖byte[]類型數(shù)據(jù)即可創(chuàng)建Icon圖像。

頭部數(shù)據(jù)對(duì)照:

預(yù)      留:地址00-01)(設(shè)置0)

類      型:地址02-03(1=ICO)

圖片數(shù)量:地址04-05(默認(rèn)1)

圖像寬高:地址06-07(圖標(biāo)大小16、32...)

顏色數(shù)量:地址08(如果>=8bpp 設(shè)置0  ) 

預(yù)      留:地址09(設(shè)置0)

顏色平面:(地址10-11)(默認(rèn)1)

數(shù)據(jù)大小:(地址14-17)(圖像數(shù)據(jù)長(zhǎng)度)

數(shù)據(jù)偏移:(地址18-21)(設(shè)置22,即圖像數(shù)據(jù)起始位


兩種轉(zhuǎn)換方式效果比較:

    如下圖,左圖為自定義實(shí)現(xiàn)轉(zhuǎn)換,右圖為直接使用Icon轉(zhuǎn)換。



運(yùn)行效果



代碼:自定義方式

 public void ConvertToIcon(string imagePath, string outputPath, byte size = 128)

 {

     using (Image srcImage = Image.FromFile(imagePath))

     {

         

         // 創(chuàng)建內(nèi)存流保存ICO數(shù)據(jù)

         using (MemoryStream stream = new MemoryStream())

         {

             // 寫入時(shí)ICO文件頭:輸入小端序,低位在前;

             // 輸出時(shí)大端序,高位在前。

             // 1、保留字

             stream.Write(new byte[] { 0, 0 }, 0, 2);

             // 2、類型(1=ICO)

             stream.Write(new byte[] { 1, 0 }, 0, 2);

             // 3、圖像數(shù)量

             stream.Write(new byte[] { 1, 0 }, 0, 2);

             // 4、數(shù)據(jù)偏移

             int dataOffset = 6 + 16;

             using (Image newImg = new Bitmap(srcImage, new Size(size, size)))

             {

                 //5、創(chuàng)建圖像數(shù)據(jù)數(shù)組(byte[])、獲取圖像數(shù)據(jù) 

                 byte[] imgData = null;

                 using (MemoryStream imageStream = new MemoryStream())

                 {

                     newImg.Save(imageStream, ImageFormat.Png);

                     imgData = imageStream.ToArray();

                 }

                 //6、 設(shè)置圖標(biāo) 寬、高

                 stream.Write(new byte[] { size, size }, 0, 2);

                 //7、 設(shè)置顏色數(shù)(0=真彩色)、保留字

                 stream.Write(new byte[] { 0, 0 }, 0, 2);

                 //8、 設(shè)置顏色平面

                 stream.Write(new byte[] { 1, 0 }, 0, 2);

                 //9、 設(shè)置每像素位數(shù)

                 stream.Write(new byte[] { 32, 0 }, 0, 2);

                 //10、設(shè)置圖像數(shù)據(jù)大小

                 stream.Write(BitConverter.GetBytes(imgData.Length), 0, 4);

                 //11、設(shè)置數(shù)據(jù)偏移

                 stream.Write(BitConverter.GetBytes(dataOffset), 0, 4);

                 //12、寫入圖像數(shù)據(jù)

                 stream.Write(imgData, 0, imgData.Length);

                 stream.Flush();

                 //保存圖標(biāo)

                 File.WriteAllBytes(outputPath, stream.ToArray());

             }

         }

     }

 }

代碼:Icon直轉(zhuǎn)方式

public Icon ConvertToIcon(string source, string target, int size = 128)

{

   using (Image sourceImage = Image.FromFile(source))

   {

       using (Bitmap newImage = new Bitmap(sourceImage, size, size))

       {

           using (FileStream stream = new FileStream(target, FileMode.Create))

           {

               Icon icon = Icon.FromHandle(newImage.GetHicon());

               icon.Save(stream);

               return icon;

           }

       }

   }

}

代碼:窗體UI

public partial class MainForm : Form

{

   private string sourcePath = null;

   private Image sourceImage;

   private Image targetImage;

   public MainForm()

   {

       InitializeComponent();

   }

   private void btn_SelectedImage_Click(object sender, EventArgs e)

   {

       OpenFileDialog openFile = new OpenFileDialog();

       openFile.InitialDirectory = Application.StartupPath;

       openFile.Filter = "(圖像文件)|*.png;*.jpg;*.jpeg;*.bmp";

       if (openFile.ShowDialog() == DialogResult.OK)

       {

           sourcePath = openFile.FileName;

           sourceImage = Image.FromFile(sourcePath);

           picx_SourceImage.Image = sourceImage;

       }

   }

   private void btn_ConvertImage_Click(object sender, EventArgs e)

   {

       ConvertToIcon(sourcePath, "output1.ico", (byte)128);

       picx_TargetImage.Image = Image.FromFile("output1.ico");

       ConvertToIcon(sourcePath, "output2.ico", 128);

       picx_TargetImage2.Image = Image.FromFile("output2.ico");

   }

}

總結(jié)
本文描述了如何無損實(shí)現(xiàn)圖像轉(zhuǎn)icon。主要是直接使用Icon類進(jìn)行圖像轉(zhuǎn)換圖標(biāo)會(huì)與原圖又不一致。在網(wǎng)上查找了一些方法實(shí)現(xiàn)了Icon無損轉(zhuǎn)換功能。方便后面實(shí)現(xiàn)圖標(biāo)轉(zhuǎn)換,其實(shí)網(wǎng)上有蠻多的在線圖標(biāo)轉(zhuǎn)換工具站,嫌麻煩的也可以直接在網(wǎng)上找,這里主要是順便學(xué)習(xí)一下如何自己編程實(shí)現(xiàn)。


閱讀原文:https://mp.weixin.qq.com/s/NUUXJRlpim3dqSS8XcZ5Zg


該文章在 2025/5/9 15:05:46 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲(chǔ)管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 91麻豆国产福利品精 | 91国偷自产一区二区三区 | 福利精品第一导航 | 变态黄色网站在线观看 | 国产精品毛片久久久久 | 精品国产一区二区三区国产馆杂枝 | 国产成人a亚 | 国自产拍偷拍精品啪啪一区二 | 国产精品制服丝袜亚洲欧美 | 国产无套内射又大又猛又粗 | 精品人妻无码视频网站 | 国产av熟女一 | 国产亚洲国语精品自产拍在线 | a无码综合a国产av中文 | 18禁美女裸身无遮挡免费网站 | 91人妻一区二区三区久久 | 国产精品广西柳州莫菁泽译网 | 国产午夜无码精 | 91国在线啪精品一区 | 国产精品无码免费专区午夜 | 91福利在线精品国产 | 国产精品免费av片 | 国产亚洲日韩欧美另类第八 | 成年无码av片大全在线播放 | 97人人模人人| 国产精品无码无套在线 | 18禁黄网站禁止免费观看 | 国产欧美日韩综合一区在线观看 | 国产成人调教 | 国产福利网站 | 国产亚洲精久久久久久无码色戒 | 91精品国产免费青青碰在线观 | 国产一区日韩二区欧美三区 | 国产精品一一在线 | 91麻豆精品国产自产在线观看一 | 国产毛片av一区二区三区 | 18禁裸男晨勃露j毛免费观看 | 国产欧美日韩专区发布 | 丰满的人妻hd高清日本 | 国产精品一线二线三线品牌 | 91系列在线观看免费 |