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

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

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

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

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

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

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

類(lèi)      型:地址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())

         {

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

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

             // 1、保留字

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

             // 2、類(lèi)型(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、寫(xiě)入圖像數(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é)
本文描述了如何無(wú)損實(shí)現(xiàn)圖像轉(zhuǎn)icon。主要是直接使用Icon類(lèi)進(jìn)行圖像轉(zhuǎn)換圖標(biāo)會(huì)與原圖又不一致。在網(wǎng)上查找了一些方法實(shí)現(xiàn)了Icon無(wú)損轉(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ò)
關(guān)鍵字查詢(xún)
相關(guān)文章
正在查詢(xún)...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專(zhuān)業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類(lèi)企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶(hù)的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
日韩亚洲欧美中文字幕影音先 | 亚洲AV伊人久久青青一区 | 在线亚洲专区高清中文字幕 | 日韩精品青青久久久久久 | 五月天久久亚洲图片 | 亚洲AV福利永久看片 |