Сохранение 24 бит.ico в файл - Работает с отладчиком, а не без

Я испытываю неизвестную проблему при попытке сохранить реальное 24bpp ICO в файл.

Я использую IconEx.dll, которую я нашел здесь: Vb icon thingy project

Я переписал оригинальный код VB, который вы можете увидеть там, на C# (следующий).

Моя проблема странная. При запуске версии Debug/Release с использованием F5 ИЛИ присоединения отладчика к.exe вручную (добавив вначале sleep(), чтобы я мог легко подключить отладчик), все идет хорошо!

Когда я просто запускаю.exe (Release или Debug), пустой временный (черный) .ico пишет успешно, но окончательный ICO просто поврежден... Возможно, вы видите какую-то общую проблему? я пробовал много вещей, чтобы исправить это сейчас 4 дня... даже помещая sleep() везде, чтобы замедлить процесс, может быть, и т. д.

Обе иконки (правильная или поврежденная) имеют одинаковый размер не менее 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 ответ

Решение

Этому посвящен мой обеденный перерыв, попробуйте ниже в консольном приложении, вам нужно будет добавить соответствующие ссылки. Отлично работал в любом режиме (отладка, выпуск, командная строка и т. Д.).

Исходный код здесь

Program.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");
                }
            }
        }
    }
}
Другие вопросы по тегам