午夜视频在线观看区二区-午夜视频在线观看视频-午夜视频在线观看视频在线观看-午夜视频在线观看完整高清在线-午夜视频在线观看网站-午夜视频在线观看亚洲天堂

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

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

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

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

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

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

預(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ù)長度)

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


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

    如下圖,左圖為自定義實現(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())

         {

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

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

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


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


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

主站蜘蛛池模板: 91麻豆视频免费在线观看 | 国产在线无码精品麻豆不卡 | 国产v片在线播放免费观看大全 | 国产精品黑色 | 成人影视大全在线看入口无码 | 国产宅男小视频手机在线观看 | av天堂午夜精品一区二区三区 | 国产极品性色一区二区三区 | 91久久极品黑色自慰喷出白 | 国产日韩成人内射视频 | 国产黄色a级| 99久久久无码国产精品性 | 91精品国产福利在线观看富婆 | av无码免费 | 精品无码自拍视频在线观看 | 激情欧美成人久久综合 | 97人妻无码免费专区 | 99久久精品国产麻豆 | a片日韩美女视频免费 | 91不卡精品国产乱码 | 高潮抽搐潮喷毛片在线播放 | 国产97久久国产 | 爆乳邻居肉欲中文字幕樱花动 | av无码精品人妻色欲 | 国产精品无需播放器在线观看 | 国产高清在线观看av片 | 高清无码一级片在线观看 | 国产91剧情| 国产高清一区二区三区免费视频 | 国产激情91 | 911在线国产在线播放 | 国产高清在线观看av片麻豆 | 国产精品一区二区免费 | 国产麻豆a一级毛片爽爽影院 | 高清无码专区av | 国产爆乳福利在线观看 | 成人午夜福利视频 | 国产丰满老熟妇乱xxx1区 | 91精品国产综合久久香蕉爱欲 | 国产日韩欧美东南亚在线 | av午夜久久蜜 |