Yoksel: 20071112ГрафическиеФорматыМатьИх ...
SourceForge.net Logo

Home Page | Изменения / НовыеКомментарии / Справка / Помочь проекту | Вход:  Пароль:  

Блог Графические форматы, мать их


Итак, Excel поддерживает ряд графических форматов (для внедренных изображений). А именно: BMP (в Excel зовутся DIB'ами), JPEG, PNG, EMF, WMF. Есть еще некоторые экзотические, но мы их не рассматриваем.


JPEG и PNG проблем не вызывают. А вот с остальными наступает геморрой.

BMP

Во-первых, Excel хранит DIB-изображения без заголовка BITMAPFILEHEADER. А Моксель наоборот – без этого заголовка их не кушает. Если скормить ему mxl-файл в рисунком, сохраненном четко в том виде, в котором он был получен из Excel, то при загрузке ошибки не возникнет, но рисунок отображаться не будет. И наоборот, если записать в xls-файл рисунок с заголовком, то Excel при загрузке скажет матом нехорошие слова и не будет отображать такой рисунок. Пришлось влезать в детали структуры BMP и приколупывать BITMAPFILEHEADER к рисункам из Excel при загрузке файла и отколупывать его при записи в xls-файл. В результате могут быть некоторые проблемы с отображением некоторых рисунков из-за моего возможного неправильного понимания формата.


Вообще, BMP, как оказалось, устроен довольно любопытно. Так что какая-никакая, а польза от колупания получилась :).

EMF, WMF

Во-вторых, аналогичная ботва возникает с заголовками WMF-файлов. Т.е. Excel их не хранит, а Моксель как раз наоборот. Выкручиваемся аналогично. И тут же наступаем на другие грабли. Моксель очень вольно обращается с заголовком WMF-файла. Ему скармливают совершенно корректный с точки зрения формата WMF, а он превращает его в черт знает что. Во-первых, он не считает контрольную сумму заголовка. Во-вторых, он не сохраняет данные о размере изображения. Сумма рассчитывается легко. Размеры рассчитываем исходя из высоты строк и ширины столбцов, на которых расположен рисунок. Казалось бы, все хорошо. Но тут наступаем на другие грабли.


Для работы с изображениями используется библиотека Cx Image?. А она WMF/EMF при загрузке конвертирует в обычный битмап. Ну устроена она так: некий общий внутренний формат изображения и сбоку пристроенные конверторы. В принципе, логично. Однако, в нашем случае это вызывает проблемы. Во-первых, легонькие EMF/WMF'ы при конвертировании превращаются в довольно увесистые BMP. Во-вторых, теряется хорошие фичи EMF/WMF: прозрачный фон и хорошее масштабирование изображения при изменении размеров.


В данном случае пришлось выкручиваться использованием стандартных функций Windows для работы с метафайлами, а от Cx Image? пришлось отказаться. В результате был получен, наконец, приемлемый результат :)


 
Файлов нет. [Показать файлы/форму]
Комментариев нет. [Показать комментарии/форму]