qml相机保存不同分辨率的相同图像

qml Camera save same image with different resolutions

我正在使用 QML 的 Camera 组件和 Camera.imageCapture 来保存图像。

我想在用户单击 "Capture" 按钮时保存同一图像的多个分辨率。

我正在尝试 运行 的代码就像这样:

// 160x120
camera.imageCapture.resolution = Qt.size(160,120)
camera.imageCapture.captureToLocation("/location/")

// 320x340
camera.imageCapture.resolution = Qt.size(320,240)
camera.imageCapture.captureToLocation("/anotherLocation/")

camera.imageCapture.resolution = Qt.size(-1,-1) // set to default again

谢谢。

如果您将相机输入保存到 QImage,您可以保存并调整大小,然后使用 QImage 的 image.save() 和 image.scaled() 函数再次保存。 我以前使用过这些功能来调整图像大小并且效果很好。 但是我不知道如何将相机输入保存到 QImage,但我会调查并报告。

我知道这不是您问题的完整答案,但这是一个开始。希望对您有所帮助。

我是这样解决的:

  1. 在相机中以可用的最高分辨率保存图像:
Component.onCompleted: {
    camera.imageCapture.resolution = camera.imageCapture.supportedResolutions[camera.imageCapture.supportedResolutions.length-1]
}
  1. 将该文件的路径提供给 QImage 的构造函数。
  2. 然后缩放并保存:

完整代码:

imageresizer.cpp:

#include "imageresizer.h"
#include <QImage>
ImageResizer::ImageResizer(QObject *parent) : QObject(parent)
{}

void ImageResizer::resizeImage(int width, int height, QString file, QString savefile)
{
    QImage img(file);
    img = img.scaled(width, height);
    img.save(savefile);
}

imageresizer.h:

#ifndef IMAGERESIZER_H
#define IMAGERESIZER_H

#include <QObject>

class ImageResizer : public QObject
{
    Q_OBJECT
public:
    explicit ImageResizer(QObject *parent = nullptr);

signals:

public slots:
    void resizeImage(int width, int height, QString file, QString savefile);
};

#endif // IMAGERESIZER_H

不要忘记将其从 QML 提供:

int main(int argc, char *argv[])
{
    qmlRegisterType<ImageResizer>("project.imageresizer", 1, 0, "ImageResizer"); // Here

    QApplication app(argc, argv);
    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

main.qml:

import project.imageresizer 1.0
Window {
    id: mainWindow
    visible: true
    width: 1024
    height: 600
    title: ""

    ImageResizer {
        id: imageResizer
    }

    // Use it like:
    // imageResizer.resizeImage(100,100,imgPath,scaleImgPath)
}