15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Класс CXImage

Автор: Davide Pizzolato

Sample Image - sample.gif

Краткое описание

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 Вы найдёте объявления разрешённых и запрещённых форматов:
// CxImage supported formats
#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() - Возвращает последнюю возникшую ошибку.

В процессе создания

  • Прозрачность
  • Прямоугольное и регионное выделение.
  • Слои и фреймы.
  • Фильтры изображения