[C#] 將指定的圖檔轉換成表單的Icon顯示

  • 8166
  • 0
  • 2010-01-19

摘要:C# 將指定的圖檔轉換成表單的Icon顯示。

這邊介紹如何將指定的圖檔轉換成.ico格式

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
using System.IO;
 
namespace Test_ImageTransformeIcon
{
    public partial class Form1 : Form
    {
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void btn_OpenFile_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog oOpenFileDialog = new OpenFileDialog())
            {
                oOpenFileDialog.Filter = "(JPEG)jpg|*.jpg;*.jpeg|(BMP).bmp|*.bmp";
                if (oOpenFileDialog.ShowDialog() == DialogResult.OK)
                {
                    if (File.Exists(oOpenFileDialog.FileName))
                    {
                        txtPath.Text = oOpenFileDialog.FileName;
                        btnPaste.Enabled = true;
 
                    }
                }
            }
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            this.txtPath.ReadOnly = true;
            this.btnPaste.Enabled = false;
            this.btnConvert.Enabled = false;
        }
 
        private void btnPaste_Click(object sender, EventArgs e)
        {
            try
            {
                using (FileStream fs = File.OpenRead(txtPath.Text))
                {
 
 
                    // 將圖形檔的資料讀入一個 Byte 陣列中。
                    Byte[] myBinaryData = new Byte[(int)(fs.Length)];//先設定位元組陣列的長度
                    fs.Read(myBinaryData, 0, (int)(fs.Length));
 
                    // 根據 Byte 陣列來建立一個 MemoryStream 物件。
                    MemoryStream buffer = new MemoryStream(myBinaryData);
 
                    // 將 MemoryStream 物件的目前位置移至開頭處。
                    buffer.Position = 0;
 
 
 
                    // 將圖形檔的二進位資料讀入一個 Image 物件中。
                    picbox.BackgroundImage = Image.FromStream(buffer);
                    picbox.BackgroundImageLayout = ImageLayout.Center;
                    btnConvert.Enabled = true;
                }
            }
            catch
            {
                btnConvert.Enabled = false;
            }
        }
 
        private void btnConvert_Click(object sender, EventArgs e)
        {
            using (MemoryStream memoryStream = new MemoryStream())
            {
                //指定要轉換的圖檔給 Image 物件。
                Image oImage = picbox.BackgroundImage;
 
                //利用 MemoryStream 物件將 Image 儲存成指定的型式。
                oImage.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Png);
 
                //再轉給 Icon 物件。
                Icon myIcon = Icon.FromHandle(new Bitmap(memoryStream).GetHicon());
 
                this.Icon = myIcon;//設定表單Icon
                memoryStream.Close();
                memoryStream.Dispose();                
            }
        }
 
    }
}

 

<<後記>>

1.後來發現有更簡單的方法設定表單的 icon

//設定檔案路徑
   string sPath = System.IO.Path.Combine(Application.StartupPath, @"Images\favicon.ico");
            //判斷檔案是否存在
            if (File.Exists(sPath)) {
		//取得 Icon 物件
                Icon myIcon = Icon.FromHandle(new Bitmap(Image.FromFile(sPath)).GetHicon());
                if (myIcon != null) {
	            //設定表單 Icon
                    this.Icon = myIcon;
                }
            }

 

<<後記2>>

透過朋友告知,使用 <<後記1>> 的作法,直接讀取 ico 圖檔,會出現圖片失真的情形,

所以修正 code 。

if (string.IsNullOrEmpty(FilePath)) { throw new ArgumentNullException(); }
            Icon myIcon = null;
            if (File.Exists(FilePath)) {
                try {
                    //取得 Icon 物件                    
                    using(Icon oIcon = new Icon(FilePath)){
                        //建立副本
                        myIcon = (Icon)oIcon.Clone();
                    }
                }
                catch (Exception ex) {
                    AppFunc.HandleException2(ex, "遺失圖檔!");
                }
            }

 

三小俠  小弟獻醜,歡迎指教