如何正确地将图像转换为QByteArray,反之亦然?

问题描述 投票:0回答:1

我正在构建两个应用程序,一个客户端和一个服务器。我需要通过 RPC 将图像发送到服务器应用程序并将其转换回 QImage。

当我进行转换时,我注意到图像不匹配,我需要它们 100% 匹配。

这是我尝试过的:

[客户]

void ServerConnection::MakeRequest(QImage& imageData, const uint8_t imageId) {

        // Reset each time received images
        receivedImages_.clear();

        // Remove the limits on sizes
        grpc::ChannelArguments ch_args;
        ch_args.SetMaxReceiveMessageSize(-1); 
        ch_args.SetMaxSendMessageSize(-1);
        channel_ = grpc::CreateCustomChannel(ip_ + ":" + std::to_string(port_), grpc::InsecureChannelCredentials(), ch_args);
        // Create a stub to manage the connection
        stub_ = ImageService::NewStub(channel_);

        // Create a request message
        ImageRequest request;
        request.set_image_id(std::to_string(imageId));

        // Convert QImage to QByteArray with JPG format
        QByteArray byteArray;
        QBuffer buffer(&byteArray);
        buffer.open(QIODevice::WriteOnly);

        if (!imageData.isNull() && imageData.save(&buffer, "JPG")) {
            // Set the image data in the request
            request.set_image_data(byteArray.toBase64().toStdString());

            // Create a response message
            ImageResponse response;

            // Create a new context for this RPC
            grpc::ClientContext context;

            // Call the RPC method
            grpc::Status status = stub_->ProcessImage(&context, request, &response);

            // Handle the response
            if (status.ok()) {
                // Handle response
                std::cout << "Received set ID: " << response.set_id() << std::endl;
                for (const auto& image_data : response.image_data()) {
                    // Convert QByteArray to QImage
                    QByteArray byteArray = QByteArray::fromBase64(QString::fromStdString(image_data).toUtf8());
                    QImage image = QImage::fromData(byteArray, "JPG");
                    receivedImages_.push_back(image);
                }
            } else {
                // Handle error
                std::cerr << "Error: " << status.error_message() << std::endl;
            }
        } else {
            // Handle error saving QImage
            std::cerr << "Error: Failed to save QImage to QByteArray" << std::endl;
        }
    }

[服务器]

grpc::Status ProcessImage(grpc::ServerContext* context, const ImageRequest* request, ImageResponse* response) override {
        QByteArray imageData = QByteArray::fromBase64(request->image_data().c_str());
        // Check if image data is valid
        if (imageData.isNull()) {
            return grpc::Status::CANCELLED;
        } else {
            std::cout << "Image data is valid" << std::endl;
        }

        // Convert QImage to cv::Mat
        QImage image;
        image.loadFromData(reinterpret_cast<const uchar*>(imageData.constData()), imageData.size());

        // ..........
    
        return grpc::Status::OK;
    }

我尝试在客户端上转换后比较数据,并在收到数据并且它们匹配时在服务器上进行比较。所以,我对如何正确转换图像感到困惑。 我尝试使用图像比较工具,结果如下。 Results

c++ grpc qt6 qimage qbytearray
1个回答
0
投票

如何正确地将图像转换为 QByteArray,反之亦然?

也许你已经做对了?你怎么知道的? :)

摆脱 grpc,因为没有必要仅仅演示问题。从基础开始,然后从那里开始:

  1. 从文件加载 QImage,保存到文件,将文件与您正在使用的任何工具进行比较。一旦有效,

  2. 从文件加载 QImage,转储到 QByteArray,从中创建一个新的 QImage,保存到文件,进行比较。然后

  3. 从文件加载 QImage,放入 QByteArray,放入 Base-64 编码字符串,再放入 QByteArray,放入 QImage,保存到文件,进行比较。然后

  4. 将 QImage 加载到文件中,...,到 Base-64 编码的字符串中,然后通过 grpc 在进程中传输它,然后反转为 QImage,保存到文件,进行比较。然后

  5. 与 #4 相同,但将同一台计算机上运行的两个进程的 grpc 端点分开。

如果您这样做,您就会清楚地知道问题发生在哪里。

© www.soinside.com 2019 - 2024. All rights reserved.