From c3fbe9d0bab4d9be2f9f586a3b351cb9b33d0c45 Mon Sep 17 00:00:00 2001 From: luoliangyi <87842688@qq.com> Date: Mon, 11 Jul 2022 16:40:21 +0800 Subject: [PATCH] =?UTF-8?q?websdk=E5=A2=9E=E5=8A=A0=E6=89=8B=E5=8A=A8?= =?UTF-8?q?=E8=A3=81=E5=89=AA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/webservice/新版websdk接口说明.doc | Bin 321587 -> 337417 bytes modules/imgfmt/HGGif.cpp | 9 ++- sdk/webservice/ManagerV2.cpp | 47 ++++++++++++++ sdk/webservice/ManagerV2.h | 3 + sdk/webservice/WSUser.cpp | 86 ++++++++++++++++++++++++++ sdk/webservice/WSUser.h | 1 + test/webservice/demo.html | 42 +++++++++++++ 7 files changed, 186 insertions(+), 2 deletions(-) diff --git a/doc/webservice/新版websdk接口说明.doc b/doc/webservice/新版websdk接口说明.doc index de62a8125b9d3004ec41d94f5899249a28930924..e7783df0cfd9681fe0474b99f4489b201d57588d 100644 GIT binary patch delta 30431 zcmajn4>)b-o#^rXXT>-wA|j$HqGCi;jHppn+1U{h5ph&hR8&PpMMYIqMZ{4NQDa0= z%NS90jWOyGbre-qHLmL#HEN78t}z~0je0yrjd4Bd>iz!qAIC|PxhKyj)_T|8?_Pi3 z^{#ilzxU?iJ>QvkuJ_m4eD{%0DF&<`LrhR=BwA9)aptj8VBvhEGggkm|pv_ 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 apZX8=8^2bbvAv(GjDKq*Q@>WOYyTf9H%%e{ delta 27892 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

wqFlb@N+Xv7r=Q8WSWcpH=93eb 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 BajXCU diff --git a/modules/imgfmt/HGGif.cpp b/modules/imgfmt/HGGif.cpp index 4f45bc81..fb421cf3 100644 --- a/modules/imgfmt/HGGif.cpp +++ b/modules/imgfmt/HGGif.cpp @@ -72,6 +72,7 @@ struct HGGifWriterImpl { int savedCount = m_gifFile->ImageCount; SavedImage* savedImages = m_gifFile->SavedImages; + //关闭GIF并释放相关存储。 EGifSpew(m_gifFile); @@ -84,12 +85,15 @@ struct HGGifWriterImpl } if (sp->RasterBits != NULL) - free((char*)sp->RasterBits); + { + free(sp->RasterBits); + sp->RasterBits = NULL; + } GifFreeExtensions(&sp->ExtensionBlockCount, &sp->ExtensionBlocks); } - free((char*)savedImages); + free(savedImages); savedImages = NULL; } } @@ -475,6 +479,7 @@ HGResult HGAPI HGImgFmt_CloseGifReader(HGGifReader reader) static HGResult LoadGifImage(HGGifReaderImpl* gifReaderImpl, HGUInt &interval) { assert(NULL != gifReaderImpl); + interval = 0; int transColor = -1; unsigned int loopCount = 0; diff --git a/sdk/webservice/ManagerV2.cpp b/sdk/webservice/ManagerV2.cpp index 0cd16bbc..ae95beb1 100644 --- a/sdk/webservice/ManagerV2.cpp +++ b/sdk/webservice/ManagerV2.cpp @@ -1147,6 +1147,53 @@ namespace ver_2 return ret; } + int ManagerV2::LocalImageClip(const std::string& imagePath, int x, int y, int width, int height, + bool temp, std::string& outImagePath, std::string& errInfo) + { + outImagePath.clear(); + errInfo = "错误"; + + if (imagePath.empty() || x < 0 || y < 0 || width <= 0 || height <= 0) + return -1; + + int ret = -1; + HGImage image = NULL; + HGImgFmt_LoadImage(imagePath.c_str(), 0, NULL, 0, HGBASE_IMGORIGIN_TOP, &image); + if (NULL != image) + { + HGImageRoi roi; + roi.left = x; + roi.top = y; + roi.right = roi.left + width; + roi.bottom = roi.top + height; + + if (HGBASE_ERR_OK == HGBase_SetImageROI(image, &roi)) + { + HGImage image2 = NULL; + if (HGBASE_ERR_OK == HGBase_CloneImage(image, 0, 0, &image2)) + { + if (0 == SaveImage(image2, temp, outImagePath)) + { + if (!temp) + { + m_saveFilePathList.push_back(outImagePath); + RestoreSaveFilePathList(m_saveFilePathList); + } + + errInfo.clear(); + ret = 0; + } + + HGBase_DestroyImage(image2); + } + } + + HGBase_DestroyImage(image); + } + + return ret; + } + int ManagerV2::InitDevice(std::string& errInfo) { errInfo = "错误"; diff --git a/sdk/webservice/ManagerV2.h b/sdk/webservice/ManagerV2.h index efb3f9fe..d985947f 100644 --- a/sdk/webservice/ManagerV2.h +++ b/sdk/webservice/ManagerV2.h @@ -176,6 +176,9 @@ namespace ver_2 int x, int y, int width, int height, bool temp, std::string& outImagePath, std::string& errInfo); // 图像方向校正 int LocalImageDirectionCorrect(const std::string& imagePath, bool temp, std::string& outImagePath, std::string& errInfo); + // 裁剪图像 + int LocalImageClip(const std::string& imagePath, int x, int y, int width, int height, + bool temp, std::string& outImagePath, std::string& errInfo); // 设备初始化 int InitDevice(std::string& errInfo); diff --git a/sdk/webservice/WSUser.cpp b/sdk/webservice/WSUser.cpp index 0c9b43c8..8a258f60 100644 --- a/sdk/webservice/WSUser.cpp +++ b/sdk/webservice/WSUser.cpp @@ -285,6 +285,10 @@ namespace ver_2 { ImageDirectionCorrect(json, func); } + else if ("local_image_clip" == func || "base64_image_clip" == func || "image_clip" == func) + { + ImageClip(json, func); + } else if ("upload_local_file" == func) { UploadLocalFile(json); @@ -2091,6 +2095,88 @@ namespace ver_2 } } + void WSUser::ImageClip(cJSON* json, const std::string& func) + { + assert(NULL != json); + + int x = GetJsonIntValue(json, "x"); + int y = GetJsonIntValue(json, "y"); + int width = GetJsonIntValue(json, "width"); + int height = GetJsonIntValue(json, "height"); + bool find = false; + bool localSave = GetJsonBoolValue(json, "local_save", &find); + if (!find) + localSave = true; + + std::string imagePath; + if ("image_clip" == func) + { + int imageIndex = GetJsonIntValue(json, "image_index"); + std::string errInfo2; + GetManager()->SaveImage(imageIndex, true, imagePath, errInfo2); + } + else if ("local_image_clip" == func) + { + imagePath = Utf8ToStdString(GetJsonStringValue(json, "image_path")); + } + else if ("base64_image_clip" == func) + { + std::string imageBase64 = GetJsonStringValue(json, "image_base64"); + std::string errInfo2; + GetManager()->SaveLocalImage(imageBase64, true, imagePath, errInfo2); + } + + std::string outImagePath; + std::string errInfo; + int ret = GetManager()->LocalImageClip(imagePath, x, y, width, height, !localSave, outImagePath, errInfo); + + if ("image_clip" == func || "base64_image_clip" == func) + { + HGBase_DeleteFile(imagePath.c_str()); + } + + std::string outImageBase64; + bool getBase64 = GetJsonBoolValue(json, "get_base64"); + if (0 == ret && getBase64) + { + std::string errInfo2; + GetManager()->LoadLocalImage(outImagePath, outImageBase64, errInfo2); + } + + bool findIden = false; + std::string iden = GetJsonStringValue(json, "iden", &findIden); + + cJSON* retJson = cJSON_CreateObject(); + if (NULL != retJson) + { + cJSON_AddItemToObject(retJson, "func", cJSON_CreateString(func.c_str())); + if (findIden) + cJSON_AddItemToObject(retJson, "iden", cJSON_CreateString(iden.c_str())); + cJSON_AddItemToObject(retJson, "ret", cJSON_CreateNumber(ret)); + if (0 != ret) + cJSON_AddItemToObject(retJson, "err_info", cJSON_CreateString(StdStringToUtf8(errInfo).c_str())); + else + { + if (localSave) + cJSON_AddItemToObject(retJson, "image_path", cJSON_CreateString(StdStringToUtf8(outImagePath).c_str())); + else + HGBase_DeleteFile(outImagePath.c_str()); + + if (getBase64) + cJSON_AddItemToObject(retJson, "image_base64", cJSON_CreateString(outImageBase64.c_str())); + } + + char* resp = cJSON_Print(retJson); + if (NULL != resp) + { + SendResponse((const HGByte*)resp, (HGUInt)strlen(resp), HGTRUE); + free(resp); + } + + cJSON_Delete(retJson); + } + } + void WSUser::InitDevice(cJSON* json) { assert(NULL != json); diff --git a/sdk/webservice/WSUser.h b/sdk/webservice/WSUser.h index a0be68f5..1a879ed6 100644 --- a/sdk/webservice/WSUser.h +++ b/sdk/webservice/WSUser.h @@ -48,6 +48,7 @@ namespace ver_2 void ImageAddWatermark(cJSON* json, const std::string& func); void ImageDecontamination(cJSON* json, const std::string& func); void ImageDirectionCorrect(cJSON* json, const std::string& func); + void ImageClip(cJSON* json, const std::string& func); void InitDevice(cJSON* json); void DeinitDevice(cJSON* json); diff --git a/test/webservice/demo.html b/test/webservice/demo.html index 6f7a4813..853791fb 100644 --- a/test/webservice/demo.html +++ b/test/webservice/demo.html @@ -97,6 +97,12 @@ myCanvas.src = message['image_base64']; alert(msg.data); } + else if ("local_image_clip" == message['func']) + { + var myCanvas = document.getElementById("myCanvas"); + myCanvas.src = message['image_base64']; + alert(msg.data); + } else if ("init_device" == message['func']) { alert(msg.data); @@ -316,6 +322,12 @@ myCanvas.src = message['image_base64']; alert(msg.data); } + else if ("image_clip" == message['func']) + { + var myCanvas = document.getElementById("myCanvas"); + myCanvas.src = message['image_base64']; + alert(msg.data); + } } } } @@ -483,6 +495,20 @@ })); } + function LocalImageClip() + { + socket.send(JSON.stringify({ + 'func':'local_image_clip', + 'image_path':'D:\\1.jpg', + 'x':100, + 'y':50, + 'width':200, + 'height':600, + 'local_save':false, + 'get_base64':true + })); + } + function InitDevice() { socket.send(JSON.stringify({ @@ -818,6 +844,20 @@ })); } + function ImageClip() + { + socket.send(JSON.stringify({ + 'func':'image_clip', + 'image_index':0, + 'x':100, + 'y':50, + 'width':200, + 'height':600, + 'local_save':false, + 'get_base64':true + })); + } + window.onload = function() { var myimg = document.getElementById("myCanvas"); @@ -863,6 +903,7 @@ + @@ -905,6 +946,7 @@ +