Сохранение растрового изображения в любом формате

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

Bitmap.Save(FileName);

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

// 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. Нужно ли мне настраивать свойства сохранения для каждого отдельного расширения, которое я хочу поддерживать, или первого метода достаточно для любого расширения?

person Community    schedule 03.12.2015    source источник
comment
Вы не указали формат изображения в вызове Save(). Поэтому он сохраняется как PNG. Без сомнения, с неправильным расширением имени файла. Это не сбивает с толку слишком много программ, они смотрят в файл, чтобы узнать реальный формат изображения, их заголовок идентифицирует реальный формат. PNG — очень хороший формат, который вам следует предпочесть. Невозможно сохранить файл .ico или .dds, у gdiplus нет кодировщиков для таких форматов. ImageFormat.Icon определен, но не реализован.   -  person Hans Passant    schedule 03.12.2015
comment
Так что на самом деле, .ico, который я считаю .ico, — это просто .png (или другой тип, насколько я знаю) с расширением .ico. И для поддержки таких файлов, как .dds (для которых GDI+ не имеет кодировщиков), мне нужно реализовать свой собственный кодировщик. Это имеет больше смысла. Спасибо за ответ!   -  person    schedule 03.12.2015


Ответы (1)


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

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

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

Bitmap.Save(String, ImageFormat)

например, чтобы сохранить файл .ico:

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

Надеюсь это поможет. Удачи.

person Noxymon    schedule 03.12.2015
comment
Просто сначала попробуйте код, который вы рекомендуете сами. Довольно легко увидеть, что ваш фрагмент никогда не может работать. - person Hans Passant; 03.12.2015
comment
У меня есть, работает. использовали его несколько раз, прежде чем проверить документацию. msdn.microsoft.com /en-us/библиотека/ - person Noxymon; 03.12.2015
comment
Если вы попытаетесь использовать файл в качестве значка, это не сработает. Я провел простой тест, попытавшись установить для него значок папки Windows, и он сказал, что он не содержит файлов значков. - person ; 03.12.2015
comment
Это может быть связано с тем, что разные версии Windows поддерживают разное соотношение пикселей для файлов .ico. - person Noxymon; 03.12.2015