Ответ 1
Единственная проблема с этим кодом заключается в том, что он поддерживает растровые изображения до 128x128.
Он дает пустой файл ico, если размер растрового изображения больше.
Я пытаюсь преобразовать растровое изображение в значок. Но есть некоторая ошибка, поскольку результирующий файл просто пуст.
private void btnCnvrtSave_Click(object sender, EventArgs e)
{
Bitmap bmp = new Bitmap(sourceFile); //sourceFile = openfiledialog.FileName;
IntPtr Hicon = bmp.GetHicon();
Icon myIcon = Icon.FromHandle(Hicon);
SaveFileDialog sfd = new SaveFileDialog();
sfd.Title = "Save Icon";
sfd.Filter = "Icon|*.ico";
sfd.ShowDialog();
FileStream fileStream = new FileStream(sfd.FileName, FileMode.OpenOrCreate);
myIcon.Save(fileStream);
fileStream.Flush();
fileStream.Close();
MessageBox.Show("Image is converted successfully!");
//Process.Start(sfd.FileName);
}
Я много пытался понять проблему, но не смог. Пожалуйста, скажите мне, где проблема.
Единственная проблема с этим кодом заключается в том, что он поддерживает растровые изображения до 128x128.
Он дает пустой файл ico, если размер растрового изображения больше.
Пожалуйста, используйте DestroyIcon после GetHicon, чтобы предотвратить утечку памяти
[DllImport("user32.dll", CharSet = CharSet.Auto)]
extern static bool DestroyIcon(IntPtr handle);
MSDN: https://msdn.microsoft.com/en-us/library/system.drawing.bitmap.gethicon%28v=vs.110%29.aspx
В этой статье описывается, как преобразовать растровое изображение в значок.
http://www.go4expert.com/forums/showthread.php?t=19250
Он очень похож на ваш:
using (Cbitmap = new Bitmap(sourceImage.Text))
{
Cbitmap.MakeTransparent(Color.White);
System.IntPtr icH = Cbitmap.GetHicon();
Icon ico = Icon.FromHandle(icH);
}
using (System.IO.FileStream f = new System.IO.FileStream(destinationFldr.Text + "\\image.ico", System.IO.FileMode.OpenOrCreate))
{
ico.Save(f);
}
Попробуйте.
EDITED: добавлены операторы using.
Кроме того, этот вопрос SO ссылается на как преобразовать изображение в значок, что может привести вас в правильном направлении.
Обратите внимание, однако, что код, который должен быть написан, должен быть изменен, чтобы избежать утечки дескриптора. Но решение также связано в этом вопросе.