我正在构建两个应用程序,一个客户端和一个服务器。我需要通过 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;
}
我尝试在客户端上转换后比较数据,并在收到数据并且它们匹配时在服务器上进行比较。所以,我对如何正确转换图像感到困惑。 我尝试使用图像比较工具,结果如下。
如何正确地将图像转换为 QByteArray,反之亦然?
也许你已经做对了?你怎么知道的? :)
摆脱 grpc,因为没有必要仅仅演示问题。从基础开始,然后从那里开始:
从文件加载 QImage,保存到文件,将文件与您正在使用的任何工具进行比较。一旦有效,
从文件加载 QImage,转储到 QByteArray,从中创建一个新的 QImage,保存到文件,进行比较。然后
从文件加载 QImage,放入 QByteArray,放入 Base-64 编码字符串,再放入 QByteArray,放入 QImage,保存到文件,进行比较。然后
将 QImage 加载到文件中,...,到 Base-64 编码的字符串中,然后通过 grpc 在进程中传输它,然后反转为 QImage,保存到文件,进行比较。然后
与 #4 相同,但将同一台计算机上运行的两个进程的 grpc 端点分开。
如果您这样做,您就会清楚地知道问题发生在哪里。