接手一個接口的小項目, 通過http請求調用傳入一個圖片url,程序下載圖片,處理圖片,通過接口返回一張圖片:
用到了opencv和QtHttpServer。本次介紹http響應一張圖片過程、opencv的Mat和圖片互轉:
http響應一張圖片過程:
此處responder實例是QtHttpServer路由中的 QHttpServerResponder &&responder 參數
1. 設置響應狀態碼(200、 404 、302 、400、500.....)
例如,響應成功狀態碼(200):
responder.writeStatusLine(QHttpServerResponder::StatusCode::Ok);
2. 設置響應頭
Accept-Ranges: bytes
Content-Type: image/png
Content-Length: 圖片大小
responder.writeHeader("Accept-Ranges", "bytes"); responder.writeHeader("Content-Type", "image/png"); responder.writeHeader("Content-Length", QString::number(*len).toUtf8());
len:響應體數據長度
3. 響應體:
圖片原始二進制數據
responder.writeBody(outData, *len);
outData為char* 類型指針,len為數據長度,要和上邊響應頭中Content-Length長度一致,因為瀏覽器要根據Content-Length讀取圖片數據。
例如,返回返回一張本地圖片:
QHttpServer httpServer; httpServer.route("/imgHandler", [](const QHttpServerRequest &request,QHttpServerResponder &&responder){ responder.writeStatusLine(QHttpServerResponder::StatusCode::Ok); responder.writeHeader("Accept-Ranges", "bytes"); responder.writeHeader("Content-Type", "image/png");
//讀取本地文件 ifstream stream("/home/100002.png", ios::out | ios::binary); int len = 0; char *data = NULL; if(stream.is_open()) { stream.seekg(0, std::ios::end); len = stream.tellg(); stream.seekg(0, std::ios::beg); data = new char[len]; stream.read(data, len); }
//寫響應頭,數據長度,和方法體數據長度一致 responder.writeHeader("Content-Length", QString::number(len).toUtf8()); responder.writeBody(data, len); });