Сохранение 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");
}
}
}
}
}