Класс CXImage
Автор: Davide
Pizzolato
Краткое описание
CxImage это C++ класс для работы с
изображениями BMP, JPEG, GIF, PNG, TIFF, MNG, и ICO. Класс
позволяет загружать, сохранять, отображать, а так
же производить преобразование от одного типа к
другому, причём делает это довольно просто и
быстро.
Почему бы не использовать доступные
библиотеки?
Существует множество хороших библиотек (OpenIL,
FreeImage, ...), которые обладают достаточными
возможностями. Однако при использовании этих
библиотек можно столкнуться с определёнными
трудностями, связанными в основном с
платформенной независимостью этих библиотек и,
как следствие - множество часто ненужных
объявлений для компилятора.
Это библиотека MFC?
Нет. В целом это обычная библиотека
предназначена для windows (из-за некоторых
специфических конструкторов и функций
закрашивания), но ядро библиотека платформенно
независимо.
Библиотека довольно большая?
Я конечно извиняюсь, но каждая библиотека JPG, PNG
и TIFF добавляет к конечному приложению около 100KB.
Для CxImage это меньше 50KB. Поэтому по необходимости
включайте в приложение только те форматы,
которые действительно необходимы.
История создания и копирайты.
Начав с класса CxDib , который включал в
себя только DIB-ы, я добавил несколько функций для
чтения изображений из файла. В сети был найден MFC
класс CImage . CImage поддерживает BMP, GIF,
PNG и JPG, однако имеет некоторые небольшие баги,
поэтому было решено объеденить CxDib со
структурой CImage для получения нового
класса CxImage . Так же были обновлены
библиотеки JPG, PNG и ZLIB.
При помощи CxImage очень просто добавлять
новые типы изображений, поэтому я добавил
библиотеку TIFF и минимальную поддержку для ICON -ок.
В заключении я добавил некоторые конструкторы
для получения изображения из глобальных HANDLE -ов
(буфер обмена windows) и объектов (ресурсы windows).
- CImage это: (c)1995-1998, Alejandro Aguilar Sierra <asierra@servidor.unam.mx>
- библиотека IJG JPEG это: (c)1994-1998, Thomas G. Lane.
- LibPNG версия 1.0.12 это: (c)1998-2001 Glenn Randers-Pehrson
- LibTIFF это: (c)1988-1997 Sam Leffler, (c)1991-1997 Silicon Graphics, Inc.
- FreeImage 2.4.0 : Разработка и внедрение Floris van den Berg
(flvdberg@wxs.nl)
Более детальные авторские права находятся в
заголовочных файлах каждой библиотеки.
Как компилировать библиотеку
Перед компилированием демонстрационного
приложения необходимо скомпилировать все
библиотеки. В целом операция довольно проста:
откройте CxImgLib.dsw, выберите меню "Build/Batch
Build..." и кликните кнопку "Build".
Для компиляции потребуется несколько минут (промежуточные
файлы занимают 60MB!). Когда всё будет сделано,
запустите демонстрационное приложение.
Демонстрационное приложение показывает как:
- Открыть, сохранить и отобразить изображение.
- Отобразить ресурс битмап.
- Помещать и извлекать картинки через буфер
обмена (clipboard)
- Получать информацию о пикселях
- Преобразовывать изображения
Операции и члены класса CxImage
Поддерживаемые форматы файлов
В начале основного заголовочного файла ximage.h
Вы найдёте объявления разрешённых и запрещённых
форматов:
#define CXIMAGE_SUPPORT_BMP 1
#define CXIMAGE_SUPPORT_GIF 0
#define CXIMAGE_SUPPORT_JPG 1
#define CXIMAGE_SUPPORT_PNG 1
#define CXIMAGE_SUPPORT_MNG 0
#define CXIMAGE_SUPPORT_ICO 1
#define CXIMAGE_SUPPORT_TIF 1
Если Вы измените данные выражения, то не
забудьте перекомпилировать библиотеку.
Конструкторы
CxImage() |
- Создаёт пустое изображение. |
CxImage(DWORD dwWidth, DWORD dwHeight, WORD wBpp) |
- Создаёт изображение с заданными
параметрами ширины, высоты и бит на точку |
CxImage(const CxImage *isrc) |
- Создаёт изображение с теми же
характеристиками из исходного изображения. Биты
исходного изображения не копируются в новое
изображение. |
CxImage(HBITMAP hbmp) |
- Содаёт изображение из объекта bitmap. |
CxImage(HANDLE hMem) |
- Создаёт изображение из глобального
дескриптора. |
CxImage(const char * filename, DWORD imagetype=0) |
- Создаёт изображение из файла |
Инициализация
void* Create(DWORD dwWidth, DWORD
dwHeight, WORD wBpp) |
- Инициализирует или заново создаёт
изображение. Возвращает указатель на внутренний
объект hDib |
void Clear(BYTE bval=0) |
- Устанавливает биты изображения в
определённое значение. |
void Copy(CxImage *src) |
- Делает копию изображения из
существующего. |
Основные операции
HANDLE CopyToHandle(HANDLE hMem) |
- Копирует изображение в глобальный
дескриптор |
void Transfer(CxImage *from) |
- Преобразовывает изображение из
существующего исходного изображения. Исходное
становится пустым. |
bool IsValid() |
- Проверяет - правильно ли была
инициализирована картинка. |
bool IsInside(long x, long y) |
- Проверяет - попадают ли координаты
внутрь изображения. |
bool SaveFile(const char * filename, DWORD
imagetype=0) |
- Сохраняет изображение на диск в
указанном формате |
bool ReadFile(const char * filename, DWORD
imagetype=0) |
- Читает с диска изображение указанного
формата |
bool Flip() |
- Поворачивает изображение сверху вниз |
bool Mirror() |
- Делает заркальное отражение
изображения |
bool Negative() |
- Инвертирует цвета изображения |
Операции рисования
long Draw(HDC pDC, long xoffset, long yoffset) |
- Рисует изображение на указанном
контексте устройства |
long Stretch(HDC pDC,long xoffset,long yoffset,long xsize,long ysize) |
- Растягивает изображение |
long Tile(HDC pDC, RECT *rc) |
- Вписывает изображение в указанный
прямоугольник |
Операции с палитрой
Данные функции не работают с изображениями RGB, и
в данном случает всегда возвращают 0.
DWORD GetPaletteSize() |
- Возвращает размерность палитры в
байтах |
RGBQUAD* GetPalette() |
- Возвращает указатель на первый индекс
палитры |
RGBQUAD GetPaletteIndex(BYTE idx)
bool GetRGB(int i, BYTE*
r, BYTE* g, BYTE* b) |
- Возвращает цвет указанного индекса |
BYTE GetNearestIndex(RGBQUAD c) |
- Возвращает лучший индекс палитры,
который соответствует указанному цвету |
void SetPalette(DWORD n, BYTE *r,
BYTE *g, BYTE *b)
void SetPalette(RGBQUAD* pPal,DWORD nColors=256)
void SetPalette(rgb_color_struct *rgb,DWORD
nColors=256) |
- Устанавливает ячейки палитры |
void SetPaletteIndex(BYTE idx, BYTE
r, BYTE g, BYTE b)
void SetPaletteIndex(BYTE idx, RGBQUAD c)
void SetPaletteIndex(BYTE idx, COLORREF cr) |
- Возвращает цвет укзанного индекса
палитры |
void SetGrayPalette() |
- Обращается к шкале яркости палитры |
void BlendPalette(COLORREF cr,long perc) |
- Установка цвета палитры |
RGBQUAD HSLtoRGB(COLORREF cHSLColor)
RGBQUAD RGB2RGBQUAD(COLORREF cr)
COLORREF RGBQUAD2RGB (RGBQUAD c)
RGBQUAD RGBtoHSL(RGBQUAD lRGBColor)
RGBQUAD HSLtoRGB(RGBQUAD lHSLColor) |
- Утилиты преобразования цветов. |
Операции с пикселями
BYTE GetPixelIndex(long x,long y) |
- Возвращает индекс пикселя (0 для
изображений RGB) |
RGBQUAD GetPixelColor(long x,long y) |
- Возвращает цвет пикселя. |
void SetPixelIndex(long x,long y,BYTE i) |
- Устанавливает индекс пикселя, только
для индексированных изображений |
void SetPixelColor(long x,long y,RGBQUAD c)
void SetPixelColor(long
x,long y,COLORREF cr) |
- Устанавливает цвет пикселя. |
Аттрибуты
long GetSize() |
- Возвращает размер в байтах внутреннего
объекта hDib |
BYTE* GetBits() |
- Возвращает указатель на биты
изображения (ИСПОЛЬЗОВАТЬ ОСТОРОЖНО) |
DWORD GetHeight() |
|
DWORD GetWidth() |
|
DWORD GetEffWidth() |
- Возвращает значение DWORD выровненной
ширины изображения |
DWORD GetNumColors() |
|
BYTE GetColorType() |
- Возвращает: 1=Палитра, 2=RGB, 4=Alpha |
WORD GetBpp() |
- Возвращает: 1, 4, 8, 24. |
DWORD GetFileType() |
- Возвращает расширение файла,
связанного с изображением |
LPSTR GetFilename() |
- Возвращает имя файла, связанного с
изображением |
LPSTR GetLastError() |
- Возвращает последнюю возникшую ошибку. |
В процессе создания
- Прозрачность
- Прямоугольное и регионное выделение.
- Слои и фреймы.
- Фильтры изображения
|