centos

cximage在centos环境下的应用案例

小樊
45
2025-12-29 13:15:43
栏目: 智能运维

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

一、常见应用场景

二、环境准备与安装要点

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

#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 图像查看器的快速实现

#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();
}

五、部署与排错要点

0
看了该问题的人还看了