- •Отображение графической информации с использованием HttpHandler
- •Отображение графической информации с использованием дополнительной страницы
- •Возможности преобразований графических файлов при их отображении на сайте
- •Вывод рисунков на Web сайт
- •Возможности преобразования форматов графических файлов с использованием класса Bitmap
- •Возможности сжатия и трансформации графических файлов, преобразованных в формат jpg
- •Сжатие формата jpg
- •Трансформация файла формата jpg
- •Возможности сжатия графических файлов изменением числа бит на пиксель и их трансформации
- •Использование метода DrawImage для работы с графическими файлами
- •Трансформация и прозрачность изображений
- •Имитация прозрачного фона и вывод рисунков с прозрачным фоном
Возможности преобразования форматов графических файлов с использованием класса 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();
}