首页主机资讯cximage在centos环境下的应用案例

cximage在centos环境下的应用案例

时间2026-01-18 00:32:03发布访客分类主机资讯浏览502
导读:在 CentOS 上使用 CXImage 的典型场景与落地示例 一、常见应用场景 批量格式转换与压缩:将目录中的 JPG/PNG/TIFF 等统一转换为 WebP/PNG,并按质量或尺寸压缩,用于前端静态资源或节省存储。 图像标准化预处理...

在 CentOS 上使用 CXImage 的典型场景与落地示例

一、常见应用场景

  • 批量格式转换与压缩:将目录中的 JPG/PNG/TIFF 等统一转换为 WebP/PNG,并按质量或尺寸压缩,用于前端静态资源或节省存储。
  • 图像标准化预处理:对采集或上传的图片执行 缩放、裁剪、旋转、灰度化 等,作为机器学习、OCR、内容审核的前置处理。
  • 服务端缩略图生成:为相册、商品图、文档预览生成多规格缩略图,提升页面加载速度与 CDN 命中率。
  • 轻量级桌面工具:结合 Qt 快速实现跨平台图像查看器/批处理小工具,满足内部运维或业务人员的日常处理需求。

二、环境准备与安装要点

  • 系统建议:CentOS 7/8/9,已安装 gcc、g++、make、cmake 等基础工具。
  • 获取源码:可从 GitHub 克隆 CXImage 源码(如 DavidePizzolato/CxImagecximage/cximage),进入源码目录后创建 build 目录执行 cmake … & & make,如需全局安装执行 sudo make install(默认安装到 /usr/local)。
  • 路径与链接:安装后头文件通常在 /usr/local/include,库文件在 /usr/local/lib。如自定义安装前缀,需在编译与链接阶段显式指定;运行前可通过环境变量或配置 /etc/ld.so.conf 确保运行时可解析库文件。

三、案例一 批量图像格式转换与压缩

  • 目标:将指定目录下的 JPG/PNG 批量转换为 PNG,并统一缩放至最大宽度 1280 像素(保持纵横比),用于节省体积与统一规格。
  • 实现思路:用 C++ 遍历目录,借助 CXImageLoad/Save/Resample 完成转换与缩放;编译时链接 -lcximage
  • 示例核心代码(process_dir.cpp):
#include "ximage.h"
#include <
    iostream>
    
#include <
    filesystem>
    
namespace fs = std::filesystem;


int main(int argc, char* argv[]) {

    if (argc != 3) {
    
        std::cerr <
    <
     "用法: " <
    <
     argv[0] <
    <
     " <
    输入目录>
     <
    输出目录>
    \n";
    
        return 1;

    }
    
    std::string in_dir = argv[1], out_dir = argv[2];
    
    if (!fs::exists(out_dir)) fs::create_directory(out_dir);
    

    for (const auto&
 entry : fs::directory_iterator(in_dir)) {
    
        if (!entry.is_regular_file()) continue;
    
        std::string ext = entry.path().extension();
    
        std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower);
    
        if (ext != ".jpg" &
    &
     ext != ".jpeg" &
    &
     ext != ".png") continue;
    

        CxImage image;
    
        std::string in_path = entry.path().string();
    
        std::string out_path = out_dir + "/" + entry.path().stem().string() + ".png";


        if (!image.Load(in_path.c_str(), CXIMAGE_FORMAT_UNKNOWN)) {
    
            std::cerr <
    <
     "加载失败: " <
    <
     in_path <
    <
     "\n";
    
            continue;

        }
    
        // 缩放至最大宽度1280,保持纵横比
        if (image.GetWidth() >
 1280) {
    
            int h = static_cast<
    int>
    (image.GetHeight() * 1280.0 / image.GetWidth());
    
            image.Resample(1280, h);

        }

        if (!image.Save(out_path.c_str(), CXIMAGE_FORMAT_PNG)) {
    
            std::cerr <
    <
     "保存失败: " <
    <
     out_path <
    <
     "\n";
    
            continue;

        }
    
        std::cout <
    <
     "已转换: " <
    <
     in_path <
    <
     " ->
     " <
    <
     out_path <
    <
     "\n";

    }
    
    return 0;

}
    
  • 编译与运行:
g++ process_dir.cpp -o process_dir -std=c++17 -lcximage -lstdc++
./process_dir ./input_images ./output_png
  • 说明:上述流程展示了 加载、格式转换、缩放、保存 的完整链路,适合做离线批处理任务或集成到后端服务中。

四、案例二 Qt 图像查看器的快速实现

  • 目标:用 Qt 做一个简单的图像查看器,借助 CXImage 加载常见格式并显示,演示在 CentOS 下的 GUI 集成方式。
  • 实现要点:Qt 负责窗口与控件,QLabel 显示图像;CXImage::Load 读取图像数据后转换为 QImage 显示。
  • 示例核心代码(main.cpp,省略 Qt 工程模板与信号槽细节):
#include <
    QApplication>
    
#include <
    QLabel>
    
#include <
    QVBoxLayout>
    
#include <
    QFileDialog>

#include "ximage.h"

class ImageViewer : public QWidget {

public:
    ImageViewer(QWidget *parent = nullptr) : QWidget(parent) {
    
        auto *layout = new QVBoxLayout(this);
    
        label = new QLabel(this);
    
        label->
    setAlignment(Qt::AlignCenter);
    
        layout->
    addWidget(label);
    
        setLayout(layout);

    }
    
    void loadImage(const QString &
path) {
    
        CxImage img;

        if (img.Load(path.toStdString().c_str())) {
    
            // 简单将首帧转为 QImage(示例未处理多帧/透明通道细节)
            QImage qimg(img.GetWidth(), img.GetHeight(), QImage::Format_RGB888);
    
            for (int y = 0;
     y <
     img.GetHeight();
 ++y) {
    
                for (int x = 0;
     x <
     img.GetWidth();
 ++x) {
    
                    RGBQUAD c;
    
                    img.GetPixelColor(x, y, &
    c, false);
    
                    qimg.setPixelColor(x, y, QColor(c.rgbRed, c.rgbGreen, c.rgbBlue));

                }

            }
    
            label->
    setPixmap(QPixmap::fromImage(qimg).scaled(
                label->
    size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));

        }
 else {
    
            label->
    setText("加载失败: " + path);

        }

    }
    
private:
    QLabel *label;

}
    ;


int main(int argc, char *argv[]) {
    
    QApplication app(argc, argv);
    
    ImageViewer viewer;
    
    QString file = QFileDialog::getOpenFileName(nullptr, "打开图片", "",
        "Images (*.png *.jpg *.jpeg *.bmp *.tif *.tiff)");
    
    if (!file.isEmpty()) viewer.loadImage(file);
    
    viewer.show();
    
    return app.exec();

}
    
  • 说明:该示例展示了 Qt + CXImage 的集成思路,适合快速定制内部工具;生产环境可进一步扩展为多标签、缩放工具、拖拽、线程加载等。

五、部署与排错要点

  • 库路径与缓存:安装到 /usr/local 后,若链接时报找不到库,可在 /etc/ld.so.conf.d/cximage.conf 中加入 /usr/local/lib 并执行 ldconfig;或在编译时使用 -L/usr/local/lib -lcximage 显式指定库路径。
  • 头文件与命名:常见头文件为 ximage.hcximage.h,编译时包含相应路径(如 -I/usr/local/include)。不同分支/版本命名可能略有差异,以实际安装为准。
  • 运行依赖:确保运行环境存在 libjpeg、libpng、libtiff、zlib 等编解码库,否则 CXImage 在加载对应格式时会失败;可通过系统包管理器安装相应 -devel 包并在构建时启用对应格式支持。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: cximage在centos环境下的应用案例
本文地址: https://pptw.com/jishu/783542.html
centos cximage与其它工具的比较 centos inotify如何进行应用场景分析

游客 回复需填写必要信息