Ubuntu环境下CxImage使用技巧
在Ubuntu中使用CxImage前,需先安装编译所需的依赖库及CxImage本身。打开终端,执行以下命令:
# 更新软件包列表
sudo apt update
# 安装编译工具(gcc/g++、make等)及依赖库(libpng、libjpeg、libtiff)
sudo apt install build-essential libpng-dev libjpeg-dev libtiff-dev
# 安装CxImage开发包(包含头文件与静态/动态库)
sudo apt install libcximage-dev
这一步确保后续编译与链接时不会因缺少依赖报错。
若官方仓库的libcximage-dev版本不符合需求,可从源码编译安装:
# 克隆CxImage GitHub仓库
git clone https://github.com/antaresware/cximage.git
cd cximage
# 创建构建目录并进入
mkdir build && cd build
# 使用CMake生成Makefile(自动检测系统环境与依赖)
cmake ..
# 编译源码
make
# 安装到系统目录(/usr/local/include、/usr/local/lib)
sudo make install
编译完成后,CxImage的头文件会存放在/usr/local/include,库文件在/usr/local/lib。
在C++项目中,通过#include <cximage.h>引入头文件,使用CxImage类实现图像的加载与保存:
#include <cximage.h>
#include <iostream>
int main() {
CxImage image;
// 加载图像(支持BMP、PNG、JPEG、GIF等格式)
if (!image.Load("input.jpg")) {
std::cerr << "Failed to load image!" << std::endl;
return -1;
}
// 保存为其他格式(如PNG)
if (!image.Save("output.png")) {
std::cerr << "Failed to save image!" << std::endl;
return -1;
}
return 0;
}
编译时需链接CxImage库:g++ your_program.cpp -o your_program -lcximage。
CxImage本身不提供GUI功能,需借助GTK+或Qt显示图像。以GTK+为例:
#include <gtk/gtk.h>
#include <cximage.h>
int main(int argc, char *argv[]) {
GtkWidget *window, *image_widget;
CxImage cx_image;
// 初始化GTK
gtk_init(&argc, &argv);
// 加载图像
if (!cx_image.Load("input.jpg")) {
std::cerr << "Failed to load image!" << std::endl;
return -1;
}
// 将CxImage数据转换为GTK Pixbuf
GdkPixbuf *pixbuf = gdk_pixbuf_new_from_data(
(const guchar*)cx_image.GetBits(),
GDK_COLORSPACE_RGB,
FALSE, // 无alpha通道
8, // 每通道8位
cx_image.GetWidth(),
cx_image.GetHeight(),
cx_image.GetStride(),
NULL, // 无销毁回调
NULL // 无用户数据
);
// 创建图像部件
image_widget = gtk_image_new_from_pixbuf(pixbuf);
// 创建窗口并添加部件
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_container_add(GTK_CONTAINER(window), image_widget);
gtk_widget_show_all(window);
// 主循环
gtk_main();
return 0;
}
编译时需链接GTK+库:g++ gtk_demo.cpp -o gtk_demo pkg-config --cflags --libs gtk±3.0 -lcximage。
CxImage提供丰富的图像处理功能,以下是常用操作的示例:
使用Resample方法调整图像尺寸(支持多种插值算法,如CXIMAGE_FILTER_BILINEAR):
CxImage image;
image.Load("input.jpg");
// 缩小到原尺寸的50%
image.Resample(image.GetWidth() / 2, image.GetHeight() / 2, CXIMAGE_FILTER_BILINEAR);
image.Save("scaled.jpg");
使用Rotate方法旋转图像(角度为90°的倍数时效率最高,任意角度需用Rotate180/Rotate90组合或RotateFloat):
CxImage image;
image.Load("input.jpg");
// 顺时针旋转90°
image.Rotate90();
image.Save("rotated.jpg");
通过Crop方法截取图像的一部分(指定左上角坐标与宽高):
CxImage image;
image.Load("input.jpg");
// 裁剪(x=100, y=100, width=200, height=200)
image.Crop(100, 100, 300, 300);
image.Save("cropped.jpg");
使用Convert方法转换颜色空间(如BGR转RGB、灰度化):
CxImage image;
image.Load("input.jpg");
// 转换为灰度图像
image.GrayScale();
image.Save("grayscale.jpg");
使用DrawString方法在图像上绘制文字(需设置字体与颜色):
CxImage image;
image.Load("input.jpg");
// 设置文字属性(字体、大小、颜色)
image.SetFont("Arial", 20, CXFONT_WEIGHT_BOLD);
image.SetTextColor(RGB(255, 0, 0)); // 红色文字
// 在图像上绘制文字(x=50, y=50)
image.DrawString("Hello, CxImage!", 50, 50, 0, 0);
image.Save("text_image.jpg");
undefined reference错误,需检查是否安装了libcximage-dev或手动编译时链接了所有依赖库(如-lpng -ljpeg -ltiff)。Release()释放资源(若使用智能指针可避免内存泄漏)。