2015-12-03 3 views
2

Я немного смущен относительно того, как C# сохраняет растровые изображения. В настоящее время я использую этот оператор для сохранения растрового изображения (практически) любого расширения (.ico, .dds и т. Д.).Сохранить растровое изображение в любом формате

Bitmap.Save(FileName); 

Это действительно работает для любого расширения, которое я выбираю, но у меня возникают сомнения в его сохранении в правильном формате. Причина сказала сомнение в том, что я нашел другую статью здесь, How to save Bitmap as icon?, который делает так, как:

// Create a Bitmap object from an image file. 
Bitmap bmp = new Bitmap(sFn); 

// Get an Hicon for myBitmap. 
IntPtr Hicon = bmp.GetHicon(); 

// Create a new icon from the handle. 
Icon newIcon = Icon.FromHandle(Hicon); 

//Write Icon to File Stream 
System.IO.FileStream fs = new System.IO.FileStream(destFileName, System.IO.FileMode.OpenOrCreate); 
newIcon.Save(fs); 

который, очевидно, способ отличается. Итак, два вопроса:

  1. Как может/работает первый подход, если второй является «правильным» способом?
  2. Должен ли я настраивать свойства сохранения для каждого отдельного расширения, которое я хочу поддержать, или это первый метод, достаточный для любого расширения?
+0

Вы не указали формат изображения в вызове Save(). Таким образом, он сохраняется как PNG. Без неправильного расширения имени файла, без сомнения. Это не запускает слишком много программ, они смотрят в файл, чтобы узнать реальный формат изображения, их заголовок определяет реальный формат. PNG - очень хороший формат и тот, который вы должны одобрить. Нет никакого способа сохранить файл .ico или .dds, gdiplus не имеет кодеров для таких форматов. ImageFormat.Icon определен, но не реализован. –

+0

Так что .ico. Я думаю, что .ico - это просто .png (или другой тип, насколько мне известно) с расширением .ico. И для поддержки таких файлов, как .dds (для которых у GDI + нет кодеров), я должен реализовать собственный кодер. Это имеет больше смысла. Спасибо за ответ! –

ответ

0

Правильный путь должен был бы использовать оригинальный Bitmap.Save(Filename), но вам не хватает переменной ImageFormat, которая будет в основном, делают actualy преобразование из образа obejct Ot указанного формата.

В настоящее время способ, которым вы его используете, приводит к созданию файла с именем «somefile.somextension», но не содержит фактического содержимого объекта значка, например.

Лучше всего было бы использовать:

Bitmap.Save(String, ImageFormat) 

, например, сохранить ICO-файл:

Bitmap.Save(String, System.Drawing.Imaging.ImageFormat.Icon) 

Надежда это помогает, удачи.

+0

Просто попробуйте код, который вы порекомендуете первым. Довольно легко видеть, что ваш фрагмент никогда не может работать. –

+0

У меня это работает. использовали его несколько раз, прежде чем проверять документацию. https://msdn.microsoft.com/en-us/library/system.drawing.imaging.imageformat(v=vs.110).aspx – Noxymon

+0

Если вы попытаетесь использовать файл в качестве значка, это не сработает. Я сделал простой тест, пытаясь установить значок папки Windows, и сказал, что он не содержит файлов значков. –

Смежные вопросы