日本xxxx18视频在线观看-日本xxxx1819-日本xxxwww在线观看-日本xxx-日本xx-日本www在线视频

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

C#如何實現Image無損轉Icon

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

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

我們可以使用自定義填寫數據的方式實現,如下圖藍色區域為Icon文件的頭部信息,通過查看圖像的頭部信息,我們只需要按位填入對應的數值并填入原圖byte[]類型數據即可創建Icon圖像。

頭部數據對照:

預      留:地址00-01)(設置0)

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

圖片數量:地址04-05(默認1)

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

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

預      留:地址09(設置0)

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

數據大小:(地址14-17)(圖像數據長度)

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


兩種轉換方式效果比較:

    如下圖,左圖為自定義實現轉換,右圖為直接使用Icon轉換。



運行效果



代碼:自定義方式

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

 {

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

     {

         

         // 創建內存流保存ICO數據

         using (MemoryStream stream = new MemoryStream())

         {

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

             // 輸出時大端序,高位在前。

             // 1、保留字

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

             // 2、類型(1=ICO)

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

             // 3、圖像數量

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

             // 4、數據偏移

             int dataOffset = 6 + 16;

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

             {

                 //5、創建圖像數據數組(byte[])、獲取圖像數據 

                 byte[] imgData = null;

                 using (MemoryStream imageStream = new MemoryStream())

                 {

                     newImg.Save(imageStream, ImageFormat.Png);

                     imgData = imageStream.ToArray();

                 }

                 //6、 設置圖標 寬、高

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

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

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

                 //8、 設置顏色平面

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

                 //9、 設置每像素位數

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

                 //10、設置圖像數據大小

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

                 //11、設置數據偏移

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

                 //12、寫入圖像數據

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

                 stream.Flush();

                 //保存圖標

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

             }

         }

     }

 }

代碼:Icon直轉方式

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

   }

}

總結
本文描述了如何無損實現圖像轉icon。主要是直接使用Icon類進行圖像轉換圖標會與原圖又不一致。在網上查找了一些方法實現了Icon無損轉換功能。方便后面實現圖標轉換,其實網上有蠻多的在線圖標轉換工具站,嫌麻煩的也可以直接在網上找,這里主要是順便學習一下如何自己編程實現。


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


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

主站蜘蛛池模板: 国产人妖视频一区在线观看 | 农村老妇女操穴图片 | 韩国日本中文字幕一区二 | 日韩中文字幕在线 | 国产性自爱拍偷在在线播放 | 99国产精品国产部9 国产青榴视频在线观看网站 | 国产精品国产福利国产秒拍 | 2025国产精品自在自线 | 日韩不卡手机视 | 国产不卡一区二区免费视频 | 日韩欧美亚洲中文字幕第一页 | 2025天堂视频精品 | 九色成人蝌蚪电影在线 | 国产女主播在线播放一区二区 | 日本免费人成视频在线观看 | 欧美亚洲日韩中文字幕每日更新 | 国产永久免费高清在线观看 | 欧美在线观看免费人成 | 日本欧美一区二区三区乱码 | 欧美国产日韩一区二区 | 欧美国产日韩观看 | 日本一区不卡在线观看 | 97午夜理论片在线影院 | 日本日本乱码伦视频在线 | 国产精品1000部在线观看 | 国产一区二区三区亚洲综合 | 成年人啦啦操软件 | 91影院首页 | 精品精品国产欧美在线观看 | 成人国产一区二区三区精 | 国色天香社区视频手机免费 | 国产美女脱的黄的全 | 日韩专区+ | 91影院免费在线 | 国产福利专区精品视频 | 日本免费一级二级三 | 国产精品卡1卡2卡3网站 | 日韩制服丝袜在线视 | 国产福利免费在线观看 | 国产一区二区三区在线观看 | 欧美日韩国产资源一区二区 |