Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБ4 ЛабграфWEB_.doc
Скачиваний:
7
Добавлен:
14.05.2015
Размер:
415.23 Кб
Скачать

Возможности преобразования форматов графических файлов с использованием класса Bitmap

В предыдущем параграфе загружали файлы большинства известных графических форматов в класс Bitmap. Причем на странице мы их отображали уже в другом формате (Png). Это говорит о том, что класс может быть использован и для непосредственного преобразования форматов файлов.

(Вместо физических путей во всех примерах, приводимых далее, можно использовать относительный путь, используя Server.MapPath() )

Возможность преобразования демонстрирует следующий код (в нашем проекте его можно поместить как в файл Default.aspx.cs, так и в MakeGraph.aspx.cs):

//Загружаем в любом из форматов jpeg, bmp, ico, gif, wmf, png, emf, gif, tiff

Bitmap bitmap = new Bitmap(sFileName);

MemoryStream memorystream = new MemoryStream();

//mageFormat.Gif - в каком формате хотим получить файл

bitmap.Save(memorystream, ImageFormat.Gif);

//Куда сохранить результат

FileStream filestream = new FileStream(@"Путь\имя_файла.gif", FileMode.OpenOrCreate,

FileAccess.ReadWrite, FileShare.ReadWrite);

filestream.Write(memorystream.GetBuffer(), 0, (int)memorystream.Length);

//Сохраняем

filestream.Flush();

//Освобождаем сохраненный файл для других

filestream.Close();

bitmap.Dispose();

//==============================

//Или проще

Bitmap bitmap = new Bitmap(sFileName);

FileStream filestream = new FileStream(@"Путь\имя_файла.tiff", FileMode.OpenOrCreate,

FileAccess.ReadWrite, FileShare.ReadWrite);

bitmap.Save(filestream, ImageFormat.Tiff);

filestream.Flush();

filestream.Close();

bitmap.Dispose();

Таблица 1 Возможности преобразований форматов c использованием класса Bitmap и метода Save

 

*.bmp

*.jpeg

*.gif

*.png

*.wmf/*.emf

*.tiff

*.ico

*.bmp

+

+

+

+

-

+

-

*.jpeg

+

+

+

+

-

+

-

*.gif

+

+

+

+

-

+

-

*.png

+

+

+

+

-

+

-

*.wmf/*.emf

+

+

+

+

-

+

-

*.tiff

+

+

+

+

-

+

-

*.ico

+

+

+

+

-

+

-

Из таблицы видно, что можно легко конвертировать WMF, EMF или ICO к другим форматам, но не наоборот. Microsoft Windows Metafile Format (WMF) используется для хранения векторных и растровых изображений и графических данных. WMF - это базовый 16-битный формат. Формат EMF является 32-битной дополненной переработкой формата WMF. EMF расширил функциональное назначение WMF, включая цветную палитру и полную поддержку для всех 32-битовых команд GDI.

В сети можно встретить простой код, для преобразования форматов, в том числе (по утверждению авторов), подходящего для конвертации в wmf и emf:

System.Drawing.Image image = System.Drawing.Image.FromFile(sFileName);

image.Save(@"Путь\имя_файла.emf", ImageFormat.Emf);

Но, к сожалению, хотя данный код и формирует файл с расширением emf, однако содержимое файла окажется в формате png и, например, такой Viewer как Irvan View, тут же предложит Вам сменить расширение имени файла на png.

Причины этому - GDI + компоненты или, так называемые кодеки (encoders). NET имеет встроенные в кодирующие и декодирующие устройства кодеки, которые поддерживают чтение и запись bmp, gif, jpeg, png, tiff файлов и дополнительные встроенные кодеки, поддерживающие чтение файлов типа wmf, emf и ico. Для преобразования файлов в формат emf (wmf) можно воспользоваться кодом (использовать класс Metafile), приведенным ниже. Но и он дает не векторный файл, а только файл, сравнимый по размеру с векторным (по существу - тот же png файл):

Bitmap bitmap = new Bitmap(sFileName);

Graphics graphics = Graphics.FromHwnd(IntPtr.Zero);

//Получаем контекст устройства

IntPtr graphicshandle = graphics.GetHdc();

Metafile metafile = new Metafile(@"Путь\имя_файла.emf",graphicshandle);

//Освобождаем контекст

graphics.ReleaseHdc(graphicshandle);

graphics.Dispose();

//Загружаем пустой метафайл

graphics = Graphics.FromImage(metafile);

graphics.DrawImage(metafile, 0, 0);

//Рисуем картинку на graphics

//Можно писать, рисовать, вставлять комментарии и т.д. и т.п.

graphics.DrawImage(bitmap, 0, 0);

metafile.Dispose();

graphics.Dispose();

bitmap.Dispose();

И последнее замечание данного параграфа - для преобразования файлов всех форматов в *.ico файлы подходит следующий код (однако, не забывайте о размерах иконок):

Bitmap bitmap = new Bitmap(sFileName);

IntPtr iconhandle = bitmap.GetHicon();

Icon icon = Icon.FromHandle(iconhandle);

using (FileStream filestream = new FileStream(@"Путь\имя_файла.ico",

FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite))

{

icon.Save(filestream);

filestream.Flush();

filestream.Close();

}