2015-12-23 4 views
1

Я испытываю неизвестную проблему при попытке сохранить реальный 24bpp ico в файл.Сохранение 24 бит .ico в файл - Работает с отладчиком, НЕ без

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

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

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

Когда я просто запускаю .exe (Release или Debug), пустой временный (черный) .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(); 
+0

Так как эксперимент - попробуйте запустить ехе с административными привилегиями ... – developer82

+0

Вы уверены, что IcondeviceImage.IconImage = новый Bitmap (BMP); верно? Должно ли это быть pathToFinaleIco, и они сохраняются где-то еще в качестве конечной иконки? Если вы нарушаете проблему пополам (создавая растровое изображение, а затем создавая значок), может быть проще отладить каждую часть - даже подумайте о реорганизации их в два метода. –

+0

@ developer82: Выполнение как администратора не изменило проблему. Мюррей: bmp является правильным, так как он принимает снимок, который я хочу в качестве значка, чтобы «ввести его» в ico. Первая часть скрипта, создающего пустой файл ico, работает исправно, только второй не удается, повреждая файл .ico. – user3916429

ответ

1

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

Source Code here

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"); 
       } 
      } 
     } 
    } 
} 
+0

Благодарим за помощь! Итак, 'final.ico' в порядке, черным фоном. И 'deviceImage.ico' испорчен ... к сожалению. – user3916429

+0

.Net 4.0 на моем компьютере (Windows 7 x64). Похоже, это может быть проблемой с вашей машиной. Что вы используете для просмотра значков? Кроме того, вы использовали свою версию IconEx или ту, что в моей загрузке. И, наконец, вы попробовали с образцом исходного изображения. Ваша проблема может заключаться в преобразовании в 24 бит bmp, а не в генерации значков. Удачи! –

+0

Итак, я смог загрузить ваш проект (im в Visual Studio 2010). Мой проект использовал .Net 3.5. и im на Vista. (да, ну). Но ваш проект работал. Я имею в виду, что Икона не повреждена. Поэтому я попробую что-нибудь сделать между вашим проектом и моим, например, изменить структуру (последнее, что я попробую) и т. Д. Еще раз спасибо. – user3916429