一、准备工作
在开始使用libgdiplus进行图像处理前,需要先进行一些准备工作。
首先,需要安装libgdiplus库。在Linux系统中,可以使用以下命令进行安装:
sudo apt-get install libgdiplus
在Windows系统中,需要下载对应的二进制文件并进行安装。
其次,还需要在代码中引入头文件,可以使用以下代码进行引入:
#include <gdiplus.h> #pragma comment (lib,"Gdiplus.lib") using namespace Gdiplus;
二、图像加载
在使用libgdiplus进行图像处理之前,需要先将图像加载到内存中。
可以使用以下代码进行图像的加载:
Bitmap* bmp = new Bitmap(L"path/to/image.jpg");
其中,路径可以是相对路径或绝对路径。
三、图像处理
在图像加载完成后,可以进行各种图像处理操作。
四、图像保存
处理完成后,可以将图像保存到磁盘中。
可以使用以下代码进行图像保存:
bmp->Save(L"path/to/save.jpg", &clsid, NULL);
其中,路径可以是相对路径或绝对路径。clsid是压缩格式的GUID,可以使用以下代码进行初始化:
CLSID clsid; GetEncoderClsid(L"image/jpeg", &clsid);
GetEncoderClsid函数可以使用以下代码进行定义:
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid) { UINT num = 0; // number of image encoders UINT size = 0; // size of the image encoder array in bytes ImageCodecInfo* pImageCodecInfo = NULL; GetImageEncodersSize(&num, &size); if(size == 0) return -1; pImageCodecInfo = (ImageCodecInfo*)(malloc(size)); if(pImageCodecInfo == NULL) return -1; GetImageEncoders(num, size, pImageCodecInfo); for(UINT j = 0; j < num; ++j) { if(wcscmp(pImageCodecInfo[j].MimeType, format) == 0) { *pClsid = pImageCodecInfo[j].Clsid; free(pImageCodecInfo); return j; } } free(pImageCodecInfo); return -1; }
五、功能示例
下面是一个使用libgdiplus进行图像处理的示例代码,包括图像旋转、缩放、裁剪和保存:
#include <iostream> #include <gdiplus.h> #pragma comment (lib,"Gdiplus.lib") using namespace Gdiplus; int GetEncoderClsid(const WCHAR* format, CLSID* pClsid) { UINT num = 0; // number of image encoders UINT size = 0; // size of the image encoder array in bytes ImageCodecInfo* pImageCodecInfo = NULL; GetImageEncodersSize(&num, &size); if(size == 0) return -1; pImageCodecInfo = (ImageCodecInfo*)(malloc(size)); if(pImageCodecInfo == NULL) return -1; GetImageEncoders(num, size, pImageCodecInfo); for(UINT j = 0; j < num; ++j) { if(wcscmp(pImageCodecInfo[j].MimeType, format) == 0) { *pClsid = pImageCodecInfo[j].Clsid; free(pImageCodecInfo); return j; } } free(pImageCodecInfo); return -1; } int main() { GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); Bitmap* bmp = new Bitmap(L"test.jpg"); int width = bmp->GetWidth(); int height = bmp->GetHeight(); // rotate RotateFlipType rotateFlipType = Rotate180FlipXY; bmp->RotateFlip(rotateFlipType); // resize int newWidth = width / 2; int newHeight = height / 2; Bitmap* bmpResize = new Bitmap(bmp, newWidth, newHeight); // crop int cropX = newWidth / 2; int cropY = newHeight / 2; int cropWidth = newWidth / 2; int cropHeight = newHeight / 2; Bitmap* bmpCrop = bmpResize->Clone(cropX, cropY, cropWidth, cropHeight, PixelFormatDontCare); // save CLSID clsid; GetEncoderClsid(L"image/jpeg", &clsid); bmpCrop->Save(L"output.jpg", &clsid, NULL); delete bmp; delete bmpResize; delete bmpCrop; GdiplusShutdown(gdiplusToken); return 0; }