代码之家  ›  专栏  ›  技术社区  ›  user3916429

将24位.ico保存到文件-与调试器配合使用,而不是没有

  •  1
  • user3916429  · 技术社区  · 9 年前

    我在尝试将真正的24bpp图标保存到文件时遇到未知问题。

    我正在使用IconEx。我在这里找到的dll: Vb icon thingy project

    我将您可以看到的原始VB代码改写为C#(下面一个)。

    我的问题很奇怪。当使用F5运行调试/发布版本或手动将调试器附加到.exe(在开始时添加sleep(),以便我能够轻松附加调试器)时,一切都正常!

    当我刚刚运行.exe(释放或调试)时,空的临时(黑色).ico成功写入,但最后的ico只是损坏了。。。 你看到什么常见的问题了吗?4天来,我一直在尝试很多方法来解决这个问题……甚至到处睡觉()来减缓这个过程,等等

    两个图标(正确的一个或损坏的一个)的大小至少为9.43Ko

    非常感谢。

    //create a temporary icon from a Bmp
    
                Bitmap nwbmp = new Bitmap(48, 48, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
                IntPtr pntr = nwbmp.GetHicon();
                Icon nwico = Icon.FromHandle(pntr);
                DestroyIcon(pntr);
                using (System.IO.Stream st = new System.IO.FileStream(pathToFinaleIco, FileMode.Create)) {
                    System.IO.BinaryWriter wr = new System.IO.BinaryWriter(st);
                    nwico.Save(st);
                    wr.Close();
                }
                nwbmp.Dispose();
    
    
                //create the final icon by writing in the temp one and then saving to hdd overwritting to it
                Bitmap bmp = new Bitmap("path.to.file.bmp", new Size(48, 48)); //<== takes the bmp i want the ico to looks like
                IconEx Iconex = new IconEx(pathToFinaleIco);  //<=== load the temp ico file ill overwrite to be final one
                Iconex.Items.RemoveAt(0);
                IconDeviceImage IcondeviceImage = new IconDeviceImage(new Size(48, 48), ColorDepth.Depth32Bit);
                IcondeviceImage.IconImage = new Bitmap(bmp);
                Iconex.Items.Add(IcondeviceImage);
                Iconex.Save(pathToFinaleIco);
                //end
                bmp.Dispose();
    
    1 回复  |  直到 9 年前
        1
  •  1
  •   Murray Foxcroft    9 年前

    在我的午休时间,请在控制台应用程序中尝试以下操作,您需要添加适当的参考。在任何模式下(调试、发布、命令提示符等)都能很好地工作。

    Source Code here

    程序.cs

        using System;
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.IO;
    using System.Windows.Forms;
    
    namespace BmpMadness
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (Image bmp = Image.FromFile("target.bmp"))
                using (Bitmap newBmp = new Bitmap(bmp, new Size(48, 48)))
                using (Bitmap newFormatBmp = newBmp.Clone(new Rectangle(0, 0, newBmp.Width, newBmp.Height), PixelFormat.Format24bppRgb))
                {
    
                    // DestroyIcon(pntr);   - dont need it. 
                    using (System.IO.Stream st = new System.IO.FileStream("final.ico", FileMode.Create))
                    {
                        IntPtr pntr = newFormatBmp.GetHicon();
                        Icon nwico = Icon.FromHandle(pntr);
                        System.IO.BinaryWriter wr = new System.IO.BinaryWriter(st);
                        nwico.Save(st);
                    }
    
                    //create the final icon by writing in the temp one and then saving to hdd overwritting to it
                    using (var Iconex = new IconEx("final.ico"))
                    {
                        Iconex.Items.RemoveAt(0);
                        IconDeviceImage IcondeviceImage = new IconDeviceImage(new Size(48, 48), ColorDepth.Depth32Bit);
                        IcondeviceImage.IconImage = new Bitmap(bmp);
                        Iconex.Items.Add(IcondeviceImage);
                        Iconex.Save("deviceImage.ico");
                    }
                }
            }
        }
    }
    
    推荐文章
    Tom  ·  将ICO转换为BMP
    9 年前