|
使用 GDI+ 库根据图像的有效像素来裁切图片,即把图片上下左右空白全部切除掉
使用 GDI+ 库来处理图像裁剪。GDI+ 是 Windows 平台上用于图形处理的一个强大库,可以方便地处理图像,包括裁剪、缩放等操作。
以下是一个使用 GDI+ 库根据图像的有效像素裁剪图片的示例代码。此代码将去除图像上下左右的空白区域。
### 1. 包含必要的头文件
确保在你的源文件中包含 GDI+ 的头文件,并链接相应的库:
- ```cpp
- #include <windows.h>
- #include <gdiplus.h>
- #include <iostream>
- #pragma comment(lib, "gdiplus.lib")
- using namespace Gdiplus;
- ```
复制代码
### 2. 初始化 GDI+
在 `main` 函数中初始化 GDI+:
- ```cpp
- int main() {
- GdiplusStartupInput gdiplusStartupInput;
- ULONG_PTR gdiplusToken;
- GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
-
- // 你的代码逻辑在这里
- GdiplusShutdown(gdiplusToken);
- return 0;
- }
- ```
复制代码
### 3. 裁剪图像的函数
以下是一个裁剪图像的示例函数:
- ```cpp
- void CropImage(const WCHAR* inputFilePath, const WCHAR* outputFilePath) {
- // 加载图像
- Image image(inputFilePath);
- if (image.GetLastStatus() != Ok) {
- std::wcerr << L"无法加载图像: " << inputFilePath << std::endl;
- return;
- }
- int width = image.GetWidth();
- int height = image.GetHeight();
- // 查找有效像素的边界
- int left = width, right = 0, top = height, bottom = 0;
- for (int y = 0; y < height; ++y) {
- for (int x = 0; x < width; ++x) {
- Color color;
- image.GetPixel(x, y, &color);
- // 假设白色为背景色,判断有效像素
- if (color.GetR() != 255 || color.GetG() != 255 || color.GetB() != 255) {
- if (x < left) left = x;
- if (x > right) right = x;
- if (y < top) top = y;
- if (y > bottom) bottom = y;
- }
- }
- }
- // 计算裁剪后的宽度和高度
- int newWidth = right - left + 1;
- int newHeight = bottom - top + 1;
- // 创建裁剪后的图像
- Bitmap croppedImage(newWidth, newHeight);
- Graphics g(&croppedImage);
- g.DrawImage(&image, 0, 0, left, top, newWidth, newHeight, UnitPixel);
- // 保存裁剪后的图像
- CLSID clsid;
- CLSIDFromString(L"{557C3B4D-1A2E-4C3D-BB2E-5C8A4B1A6D1D}", &clsid); // JPEG
- croppedImage.Save(outputFilePath, &clsid, NULL);
- }
- ```
复制代码
### 4. 在 `main` 函数中调用裁剪函数
- ```cpp
- int main() {
- GdiplusStartupInput gdiplusStartupInput;
- ULONG_PTR gdiplusToken;
- GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
- const WCHAR* inputFilePath = L"input.jpg"; // 输入图像路径
- const WCHAR* outputFilePath = L"output.jpg"; // 输出裁剪后图像路径
- CropImage(inputFilePath, outputFilePath);
- GdiplusShutdown(gdiplusToken);
- return 0;
- }
- ```
复制代码
### 完整代码
以下是完整的代码示例:
- ```cpp
- #include <windows.h>
- #include <gdiplus.h>
- #include <iostream>
- #pragma comment(lib, "gdiplus.lib")
- using namespace Gdiplus;
- void CropImage(const WCHAR* inputFilePath, const WCHAR* outputFilePath) {
- // 加载图像
- Image image(inputFilePath);
- if (image.GetLastStatus() != Ok) {
- std::wcerr << L"无法加载图像: " << inputFilePath << std::endl;
- return;
- }
- int width = image.GetWidth();
- int height = image.GetHeight();
- // 查找有效像素的边界
- int left = width, right = 0, top = height, bottom = 0;
- for (int y = 0; y < height; ++y) {
- for (int x = 0; x < width; ++x) {
- Color color;
- image.GetPixel(x, y, &color);
- // 假设白色为背景色,判断有效像素
- if (color.GetR() != 255 || color.GetG() != 255 || color.GetB() != 255) {
- if (x < left) left = x;
- if (x > right) right = x;
- if (y < top) top = y;
- if (y > bottom) bottom = y;
- }
- }
- }
- // 计算裁剪后的宽度和高度
- int newWidth = right - left + 1;
- int newHeight = bottom - top + 1;
- // 创建裁剪后的图像
- Bitmap croppedImage(newWidth, newHeight);
- Graphics g(&croppedImage);
- g.DrawImage(&image, 0, 0, left, top, newWidth, newHeight, UnitPixel);
- // 保存裁剪后的图像
- CLSID clsid;
- CLSIDFromString(L"{557C3B4D-1A2E-4C3D-BB2E-5C8A4B1A6D1D}", &clsid); // JPEG
- croppedImage.Save(outputFilePath, &clsid, NULL);
- }
- int main() {
- GdiplusStartupInput gdiplusStartupInput;
- ULONG_PTR gdiplusToken;
- GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
- const WCHAR* inputFilePath = L"input.jpg"; // 输入图像路径
- const WCHAR* outputFilePath = L"output.jpg"; // 输出裁剪后图像路径
- CropImage(inputFilePath, outputFilePath);
- GdiplusShutdown(gdiplusToken);
- return 0;
- }
- ```
复制代码
### 注意事项
1. **背景色判断**:当前代码假设白色为背景色,可以根据实际情况调整判断条件。
2. **图像格式**:确保输入和输出的图像格式支持 GDI+。
3. **错误处理**:在实际应用中,建议添加更详细的错误处理逻辑。
通过以上代码,你可以实现根据图像的有效像素裁剪图片的功能。
|
|