簡體   English   中英

如何在不失透明度的情況下將圖像轉換為圖標?

[英]How to convert an image to an icon without losing transparency?

我有PNG圖像,我需要在顯示之前將其轉換為圖標。

這就是我做的方式:

public Icon ImageToIcon(Image imgTest)
{
    Bitmap bitmap = new Bitmap(imgTest);
    Icon icoTest;

    IntPtr iPtr = bitmap.GetHicon();
    icoTest = (Icon) Icon.FromHandle(iPtr).Clone();

    return icoTest;
}

這樣做后我失去了透明度,alpha透明圖像沒有按預期呈現....這可以解決嗎?

不,還有很多東西。 圖標具有相當精細的內部結構,經過優化,可在20世紀80年代的硬件上合理運行。 圖標圖像有三個位圖,一個用於圖標,一個單色位圖指示圖像的哪些部分是透明的,另一個單色位圖指示哪些部分是反轉的。 生成那些單色位圖非常痛苦,.NET不支持它們。 Bitmap.GetHicon()也沒有嘗試它。 您需要一個庫來為您完成工作。

Vista給了一些緩解,它開始支持包含PNG圖像的圖標。 您可以使用自己的代碼生成它。 像這樣:

    public static Icon IconFromImage(Image img) {
        var ms = new System.IO.MemoryStream();
        var bw = new System.IO.BinaryWriter(ms);
        // Header
        bw.Write((short)0);   // 0 : reserved
        bw.Write((short)1);   // 2 : 1=ico, 2=cur
        bw.Write((short)1);   // 4 : number of images
        // Image directory
        var w = img.Width;
        if (w >= 256) w = 0;
        bw.Write((byte)w);    // 0 : width of image
        var h = img.Height;
        if (h >= 256) h = 0;
        bw.Write((byte)h);    // 1 : height of image
        bw.Write((byte)0);    // 2 : number of colors in palette
        bw.Write((byte)0);    // 3 : reserved
        bw.Write((short)0);   // 4 : number of color planes
        bw.Write((short)0);   // 6 : bits per pixel
        var sizeHere = ms.Position;
        bw.Write((int)0);     // 8 : image size
        var start = (int)ms.Position + 4;
        bw.Write(start);      // 12: offset of image data
        // Image data
        img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
        var imageSize = (int)ms.Position - start;
        ms.Seek(sizeHere, System.IO.SeekOrigin.Begin);
        bw.Write(imageSize);
        ms.Seek(0, System.IO.SeekOrigin.Begin);

        // And load it
        return new Icon(ms);
    }

在.NET 4.5和Windows 8.1上測試過。 注意在邊緣有透明度的PNG圖像上你會看到“條紋”的可能性。 只有當圖像以眾所周知的背景顏色顯示時才能正常工作。 根據設計,圖標永遠不會依賴。 專用的圖標編輯器永遠是獲得好看圖標的唯一真正好方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM