diff --git a/app/scanner/mainwindow.cpp b/app/scanner/mainwindow.cpp
index 49d5f187..780dc714 100644
--- a/app/scanner/mainwindow.cpp
+++ b/app/scanner/mainwindow.cpp
@@ -77,7 +77,13 @@ MainWindow::MainWindow(QWidget *parent)
#endif
this->setAutoFillBackground(true);
this->setPalette(QPalette(QColor(230, 230, 230)));
- resize(950,720);
+
+ QDesktopWidget *desktopWidget = QApplication::desktop();
+ QRect screenRect = desktopWidget->screenGeometry(this);
+ if(screenRect.width() > 950 || screenRect.height() > 720)
+ {
+ resize(950, 720);
+ }
m_config.load();
@@ -2480,7 +2486,13 @@ void MainWindow::on_act_help_triggered()
QString filename = "/opt/apps/scanner-driver-huagao/doc/HuaGoScan_App_Help_manual.pdf";
#endif
#else
- QString filename = nullptr;
+ #if defined(OEM_HANWANG)
+ QString filename = "/opt/apps/scanner-driver-hanvon/doc/HanvonScan_App_Help_manual.pdf";
+ #elif defined(OEM_LISICHENG)
+ QString filename = "/opt/apps/scanner-driver-lanxum/doc/LanxumScan_App_Help_manual.pdf";
+ #else
+ QString filename = "/opt/apps/scanner-driver-huagao/doc/HuaGoScan_App_Help_manual.pdf";
+ #endif
#endif
#endif
diff --git a/build-qt/HGSolution/HGScanner.pro b/build-qt/HGSolution/HGScanner.pro
index e2be3914..d8f97f5a 100644
--- a/build-qt/HGSolution/HGScanner.pro
+++ b/build-qt/HGSolution/HGScanner.pro
@@ -62,7 +62,7 @@ unix {
}
}
- contains(ARCH, aarch64){
+ contains(ARCH, aarch64){
LIBS += -L../../../release/uos/aarch64 -lHGBase -lHGImgFmt -lHGImgProc -lsane-hgsane -lhgdriver
CONFIG(release, debug|release) {
DESTDIR = ../../../release/uos/aarch64/
@@ -92,7 +92,7 @@ unix {
}
}
- contains(ARCH, aarch64){
+ contains(ARCH, aarch64){
LIBS += -L../../../release/kylin/aarch64 -lHGBase -lHGImgFmt -lHGImgProc -lsane-hgsane -lhgdriver
CONFIG(release, debug|release) {
DESTDIR = ../../../release/kylin/aarch64/
@@ -110,7 +110,35 @@ unix {
}
}
- }
+ }else{
+ contains(ARCH, x86_64){
+ LIBS += -L../../../release/kylin/x86_64 -lHGBase -lHGImgFmt -lHGImgProc -lsane-hgsane -lhgdriver
+ CONFIG(release, debug|release) {
+ DESTDIR = ../../../release/kylin/x86_64/
+ }
+ CONFIG(debug, debug|release) {
+
+ }
+ }
+ contains(ARCH, aarch64){
+ LIBS += -L../../../release/kylin/aarch64 -lHGBase -lHGImgFmt -lHGImgProc -lsane-hgsane -lhgdriver
+ CONFIG(release, debug|release) {
+ DESTDIR = ../../../release/kylin/aarch64/
+ }
+ CONFIG(debug, debug|release) {
+
+ }
+ }
+ contains(ARCH, mips64){
+ LIBS += -L../../../release/kylin/mips64 -lHGBase -lHGImgFmt -lHGImgProc -lsane-hgsane -lhgdriver
+ CONFIG(release, debug|release) {
+ DESTDIR = ../../../release/kylin/mips64/
+ }
+ CONFIG(debug, debug|release) {
+
+ }
+ }
+ }
}
INCLUDEPATH += $$PWD/../../app/scanner/
diff --git a/build.sh b/build.sh
index 74f77b78..cd89140b 100755
--- a/build.sh
+++ b/build.sh
@@ -70,13 +70,6 @@ rm -rf ./obj
rm -f makefile
rm HGImgProcTmp.cbp
-#cd ../HGWebService
-#cbp2make -targets ${system}_${arch}_Release -in HGWebService.cbp -out makefile
-#make -j6
-#rm -rf ./bin
-#rm -rf ./obj
-#rm -f makefile
-
cd ../../../build-qt/HGSolution
cp HGScanner.pro HGScannerTmp.pro
if [ "${1}" == "hw" ]; then
diff --git a/build/linux/HGImgProc/HGImgProc.cbp b/build/linux/HGImgProc/HGImgProc.cbp
index ed428ce4..841d1899 100644
--- a/build/linux/HGImgProc/HGImgProc.cbp
+++ b/build/linux/HGImgProc/HGImgProc.cbp
@@ -16,6 +16,7 @@
+
@@ -26,6 +27,8 @@
+
+
@@ -42,6 +45,7 @@
+
@@ -53,6 +57,8 @@
+
+
@@ -68,6 +74,7 @@
+
@@ -78,6 +85,8 @@
+
+
@@ -94,6 +103,7 @@
+
@@ -105,6 +115,8 @@
+
+
@@ -120,6 +132,7 @@
+
@@ -129,6 +142,8 @@
+
+
@@ -145,6 +160,7 @@
+
@@ -155,6 +171,8 @@
+
+
@@ -170,6 +188,7 @@
+
@@ -180,6 +199,8 @@
+
+
@@ -196,6 +217,7 @@
+
@@ -207,6 +229,8 @@
+
+
@@ -222,6 +246,7 @@
+
@@ -233,6 +258,8 @@
+
+
@@ -249,6 +276,7 @@
+
@@ -261,6 +289,8 @@
+
+
@@ -276,6 +306,7 @@
+
@@ -285,6 +316,8 @@
+
+
@@ -301,6 +334,7 @@
+
@@ -311,6 +345,8 @@
+
+
@@ -328,6 +364,8 @@
+
+
diff --git a/build/windows/HGImgProc/HGImgProc.def b/build/windows/HGImgProc/HGImgProc.def
index 16e59841..b06c3968 100644
--- a/build/windows/HGImgProc/HGImgProc.def
+++ b/build/windows/HGImgProc/HGImgProc.def
@@ -6,6 +6,8 @@ HGImgProc_ResizeImage
HGImgProc_ImageAdjustColors
HGImgProc_ImageAutoCrop
HGImgProc_ImageBlankCheck
+HGImgProc_ImageDrawLine
+HGImgProc_AddImageWatermark
HGImgProc_CreateOCRMgr
HGImgProc_DestroyOCRMgr
diff --git a/build/windows/HGImgProc/HGImgProc.vcxproj b/build/windows/HGImgProc/HGImgProc.vcxproj
index ff9a537b..adac3d32 100644
--- a/build/windows/HGImgProc/HGImgProc.vcxproj
+++ b/build/windows/HGImgProc/HGImgProc.vcxproj
@@ -19,6 +19,7 @@
+
@@ -32,6 +33,7 @@
+
@@ -121,7 +123,7 @@
NotUsing
pch.h
MultiThreadedDebug
- ../../../third_party/opencv/windows/include;../../../third_party/ocr/hanvon/windows/include;%(AdditionalIncludeDirectories)
+ ../../../third_party/opencv/windows/include;../../../third_party/freetype/windows/include;../../../third_party/ocr/hanvon/windows/include;%(AdditionalIncludeDirectories)
4244;%(DisableSpecificWarnings)
@@ -129,8 +131,8 @@
true
false
HGImgProc.def
- ../Debug/HGBase.lib;../Debug/HGImgFmt.lib;../../../third_party/opencv/windows/lib/x86/opencv_core3416d.lib;../../../third_party/opencv/windows/lib/x86/opencv_highgui3416d.lib;../../../third_party/opencv/windows/lib/x86/opencv_features2d3416d.lib;../../../third_party/opencv/windows/lib/x86/opencv_imgproc3416d.lib;../../../third_party/opencv/windows/lib/x86/ittnotifyd.lib;../../../third_party/opencv/windows/lib/x86/zlibd.lib;%(AdditionalDependencies)
- /ignore:4099 %(AdditionalOptions)
+ ../Debug/HGBase.lib;../Debug/HGImgFmt.lib;../../../third_party/opencv/windows/lib/x86/opencv_core3416d.lib;../../../third_party/opencv/windows/lib/x86/opencv_highgui3416d.lib;../../../third_party/opencv/windows/lib/x86/opencv_features2d3416d.lib;../../../third_party/opencv/windows/lib/x86/opencv_imgproc3416d.lib;../../../third_party/opencv/windows/lib/x86/ittnotifyd.lib;../../../third_party/opencv/windows/lib/x86/zlibd.lib;../../../third_party/freetype/windows/lib/x86/freetype.lib;%(AdditionalDependencies)
+ /ignore:4099,4098 %(AdditionalOptions)
@@ -144,7 +146,7 @@
NotUsing
pch.h
MultiThreaded
- ../../../third_party/opencv/windows/include;../../../third_party/ocr/hanvon/windows/include;%(AdditionalIncludeDirectories)
+ ../../../third_party/opencv/windows/include;../../../third_party/freetype/windows/include;../../../third_party/ocr/hanvon/windows/include;%(AdditionalIncludeDirectories)
4244;%(DisableSpecificWarnings)
@@ -154,8 +156,8 @@
true
false
HGImgProc.def
- ../Release/HGBase.lib;../Release/HGImgFmt.lib;../../../third_party/opencv/windows/lib/x86/opencv_core3416.lib;../../../third_party/opencv/windows/lib/x86/opencv_highgui3416.lib;../../../third_party/opencv/windows/lib/x86/opencv_features2d3416.lib;../../../third_party/opencv/windows/lib/x86/opencv_imgproc3416.lib;../../../third_party/opencv/windows/lib/x86/ittnotify.lib;../../../third_party/opencv/windows/lib/x86/zlib.lib;%(AdditionalDependencies)
- /LTCG %(AdditionalOptions)
+ ../Release/HGBase.lib;../Release/HGImgFmt.lib;../../../third_party/opencv/windows/lib/x86/opencv_core3416.lib;../../../third_party/opencv/windows/lib/x86/opencv_highgui3416.lib;../../../third_party/opencv/windows/lib/x86/opencv_features2d3416.lib;../../../third_party/opencv/windows/lib/x86/opencv_imgproc3416.lib;../../../third_party/opencv/windows/lib/x86/ittnotify.lib;../../../third_party/opencv/windows/lib/x86/zlib.lib;../../../third_party/freetype/windows/lib/x86/freetype.lib;%(AdditionalDependencies)
+ /ignore:4099 /LTCG %(AdditionalOptions)
copy $(OutDir)HGImgProc.lib $(SolutionDir)..\..\..\sdk\lib\win\x86\Release\
@@ -173,7 +175,7 @@ copy $(OutDir)HGImgProc.dll $(SolutionDir)..\..\..\release\win\x86\Release\NotUsing
pch.h
MultiThreadedDebug
- ../../../third_party/opencv/windows/include;../../../third_party/ocr/hanvon/windows/include;%(AdditionalIncludeDirectories)
+ ../../../third_party/opencv/windows/include;../../../third_party/freetype/windows/include;../../../third_party/ocr/hanvon/windows/include;%(AdditionalIncludeDirectories)
4244;4267;%(DisableSpecificWarnings)
@@ -181,8 +183,8 @@ copy $(OutDir)HGImgProc.dll $(SolutionDir)..\..\..\release\win\x86\Release\true
false
HGImgProc.def
- ../x64/Debug/HGBase.lib;../x64/Debug/HGImgFmt.lib;../../../third_party/opencv/windows/lib/x64/opencv_core3416d.lib;../../../third_party/opencv/windows/lib/x64/opencv_highgui3416d.lib;../../../third_party/opencv/windows/lib/x64/opencv_features2d3416d.lib;../../../third_party/opencv/windows/lib/x64/opencv_imgproc3416d.lib;../../../third_party/opencv/windows/lib/x64/ittnotifyd.lib;../../../third_party/opencv/windows/lib/x64/zlibd.lib;%(AdditionalDependencies)
- /ignore:4099 %(AdditionalOptions)
+ ../x64/Debug/HGBase.lib;../x64/Debug/HGImgFmt.lib;../../../third_party/opencv/windows/lib/x64/opencv_core3416d.lib;../../../third_party/opencv/windows/lib/x64/opencv_highgui3416d.lib;../../../third_party/opencv/windows/lib/x64/opencv_features2d3416d.lib;../../../third_party/opencv/windows/lib/x64/opencv_imgproc3416d.lib;../../../third_party/opencv/windows/lib/x64/ittnotifyd.lib;../../../third_party/opencv/windows/lib/x64/zlibd.lib;../../../third_party/freetype/windows/lib/x64/freetype.lib;%(AdditionalDependencies)
+ /ignore:4099,4098 %(AdditionalOptions)
@@ -196,7 +198,7 @@ copy $(OutDir)HGImgProc.dll $(SolutionDir)..\..\..\release\win\x86\Release\NotUsing
pch.h
MultiThreaded
- ../../../third_party/opencv/windows/include;../../../third_party/ocr/hanvon/windows/include;%(AdditionalIncludeDirectories)
+ ../../../third_party/opencv/windows/include;../../../third_party/freetype/windows/include;../../../third_party/ocr/hanvon/windows/include;%(AdditionalIncludeDirectories)
4244;4267;%(DisableSpecificWarnings)
@@ -206,8 +208,8 @@ copy $(OutDir)HGImgProc.dll $(SolutionDir)..\..\..\release\win\x86\Release\true
false
HGImgProc.def
- ../x64/Release/HGBase.lib;../x64/Release/HGImgFmt.lib;../../../third_party/opencv/windows/lib/x64/opencv_core3416.lib;../../../third_party/opencv/windows/lib/x64/opencv_highgui3416.lib;../../../third_party/opencv/windows/lib/x64/opencv_features2d3416.lib;../../../third_party/opencv/windows/lib/x64/opencv_imgproc3416.lib;../../../third_party/opencv/windows/lib/x64/ittnotify.lib;../../../third_party/opencv/windows/lib/x64/zlib.lib;%(AdditionalDependencies)
- /LTCG %(AdditionalOptions)
+ ../x64/Release/HGBase.lib;../x64/Release/HGImgFmt.lib;../../../third_party/opencv/windows/lib/x64/opencv_core3416.lib;../../../third_party/opencv/windows/lib/x64/opencv_highgui3416.lib;../../../third_party/opencv/windows/lib/x64/opencv_features2d3416.lib;../../../third_party/opencv/windows/lib/x64/opencv_imgproc3416.lib;../../../third_party/opencv/windows/lib/x64/ittnotify.lib;../../../third_party/opencv/windows/lib/x64/zlib.lib;../../../third_party/freetype/windows/lib/x64/freetype.lib;%(AdditionalDependencies)
+ /ignore:4099 /LTCG %(AdditionalOptions)
copy $(OutDir)HGImgProc.lib $(SolutionDir)..\..\..\sdk\lib\win\x64\Release\
diff --git a/doc/webservice/新版websdk接口说明.doc b/doc/webservice/新版websdk接口说明.doc
index 6c976832..5c536b0a 100644
Binary files a/doc/webservice/新版websdk接口说明.doc and b/doc/webservice/新版websdk接口说明.doc differ
diff --git a/modules/base/HGDef.h b/modules/base/HGDef.h
index 94a5cc5d..aa1cd285 100644
--- a/modules/base/HGDef.h
+++ b/modules/base/HGDef.h
@@ -68,6 +68,14 @@ typedef double HGDouble;
typedef HGUInt HGUSize;
#endif
+typedef HGUInt HGColor;
+
+#define HG_MAKECOLOR(r, g, b, a) (HGColor)(((HGUInt)a << 24) | ((HGUInt)b << 16) | ((HGUInt)g << 8) | (HGUInt)r)
+#define HG_GETCOLOR_R(color) (HGUInt)((HGColor)color & 0xFF)
+#define HG_GETCOLOR_G(color) (HGUInt)(((HGColor)color >> 8) & 0xFF)
+#define HG_GETCOLOR_B(color) (HGUInt)(((HGColor)color >> 16) & 0xFF)
+#define HG_GETCOLOR_A(color) (HGUInt)(((HGColor)color >> 24) & 0xFF)
+
/* error code */
typedef HGUInt HGResult;
diff --git a/modules/base/HGInc.h b/modules/base/HGInc.h
index b94ebb9a..e47abc01 100644
--- a/modules/base/HGInc.h
+++ b/modules/base/HGInc.h
@@ -13,6 +13,7 @@
#include
#include
#include
+#include
#if defined(HG_CMP_MSC)
#include
diff --git a/modules/imgproc/CvxText.cpp b/modules/imgproc/CvxText.cpp
new file mode 100644
index 00000000..0c6c65d6
--- /dev/null
+++ b/modules/imgproc/CvxText.cpp
@@ -0,0 +1,463 @@
+#include "CvxText.hpp"
+#include "../base/HGDef.h"
+#include "../base/HGInc.h"
+#include
+
+CvxText::CvxText()
+{
+ m_library = NULL;
+ m_face = NULL;
+}
+
+CvxText::~CvxText()
+{
+ Destroy();
+}
+
+HGResult CvxText::Create(const HGChar* fontPath)
+{
+ if (NULL != m_face)
+ {
+ return HGBASE_ERR_FAIL;
+ }
+
+ FT_Init_FreeType(&m_library);
+ if (NULL == m_library)
+ {
+ return HGBASE_ERR_FAIL;
+ }
+
+ FT_New_Face(m_library, fontPath, 0, &m_face);
+ if (NULL == m_face)
+ {
+ FT_Done_FreeType(m_library);
+ m_library = NULL;
+ return HGBASE_ERR_FAIL;
+ }
+
+ return HGBASE_ERR_OK;
+}
+
+HGResult CvxText::Destroy()
+{
+ if (NULL == m_face)
+ {
+ return HGBASE_ERR_FAIL;
+ }
+
+ FT_Done_Face(m_face);
+ m_face = NULL;
+ FT_Done_FreeType(m_library);
+ m_library = NULL;
+ return HGBASE_ERR_OK;
+}
+
+#if defined(HG_CMP_MSC)
+static WCHAR *GetUnicodeStr(const char *text)
+{
+ int len = ::MultiByteToWideChar(CP_ACP, 0, text, -1, NULL, 0);
+ WCHAR *pUnicode = new WCHAR [len];
+ ::MultiByteToWideChar(CP_ACP, 0, text, -1, pUnicode, len);
+ return pUnicode;
+}
+#else
+static uint16_t *GetUnicodeStr(const char *text)
+{
+ if (0 == *text)
+ {
+ uint16_t *pUnicode = new uint16_t [1];
+ *pUnicode = 0;
+ return pUnicode;
+ }
+
+ uint16_t *pUnicode = new uint16_t [strlen(text) + 2];
+ memset(pUnicode, 0, sizeof(uint16_t) * (strlen(text) + 2));
+
+ iconv_t cd = iconv_open("UNICODE//IGNORE", "UTF-8");
+ if ((iconv_t)-1 != cd)
+ {
+ char *inbuf = (char *)text;
+ size_t inbytes = strlen(text);
+ char *outbuf = (char *)pUnicode;
+ size_t outsize = sizeof(uint16_t) * (strlen(text) + 1);
+
+ iconv(cd, &inbuf, &inbytes, &outbuf, &outsize);
+ iconv_close(cd);
+ }
+
+ return pUnicode;
+}
+#endif
+
+HGResult CvxText::DrawString(HGImage image, const HGChar* text, HGColor color, HGUInt posType, HGInt locationX, HGInt locationY,
+ HGUInt fontSize, HGBool bold, HGBool underline, HGBool italic, HGBool strikeout)
+{
+ if (NULL == m_face)
+ {
+ return HGBASE_ERR_FAIL;
+ }
+
+ assert(NULL != image);
+ assert(NULL != text && '\0' != *text);
+ assert(posType >= HGIMGPROC_WMPOSTYPE_LEFT && posType <= HGIMGPROC_WMPOSTYPE_LOCATION);
+ assert(0 != fontSize);
+
+ HGImageInfo imgInfo;
+ HGBase_GetImageInfo(image, &imgInfo);
+ if (HGBASE_IMGTYPE_BINARY == imgInfo.type)
+ {
+ HGImage imageTmp = NULL;
+ HGResult ret = HGBase_CloneImage(image, HGBASE_IMGTYPE_GRAY, 0, &imageTmp);
+ if (HGBASE_ERR_OK == ret)
+ {
+ ret = DrawString(imageTmp, text, color, posType, locationX, locationY, fontSize, bold, underline, italic, strikeout);
+ HGBase_DestroyImage(imageTmp);
+ }
+
+ return ret;
+ }
+
+ HGUInt width, height;
+ std::vector vPos;
+ GetStringLocation(text, fontSize, bold, underline, italic, strikeout, width, height, vPos);
+
+ if (HGIMGPROC_WMPOSTYPE_LOCATION == posType)
+ {
+#if defined(HG_CMP_MSC)
+ WCHAR* pUnicode = GetUnicodeStr(text);
+#else
+ uint16_t* pUnicode = GetUnicodeStr(text);
+ uint16_t* pUnicodeEx = pUnicode + 1;
+#endif
+
+ int i = 0;
+#if defined(HG_CMP_MSC)
+ while ('\0' != pUnicode[i])
+#else
+ while ('\0' != pUnicodeEx[i])
+#endif
+ {
+#if defined(HG_CMP_MSC)
+ DrawChar(image, pUnicode[i], color, locationX + vPos[i].left, locationY + vPos[i].top, fontSize, bold, italic);
+#else
+ DrawChar(image, pUnicodeEx[i], color, locationX + vPos[i].left, locationY + vPos[i].top, fontSize, bold, italic);
+#endif
+ ++i;
+ }
+
+ delete[] pUnicode;
+
+ if (underline)
+ {
+ HGImgProc_ImageDrawLine(image, locationX, locationY + height - 1,
+ locationX + width, locationY + height - 1, color, 1, HGIMGPROC_LINETYPE_SOLID);
+ }
+
+ if (strikeout)
+ {
+ if (underline)
+ HGImgProc_ImageDrawLine(image, locationX, locationY + (height - 1) / 2,
+ locationX + width, locationY + (height - 1) / 2, color, 1, HGIMGPROC_LINETYPE_SOLID);
+ else
+ HGImgProc_ImageDrawLine(image, locationX, locationY + height / 2,
+ locationX + width, locationY + height / 2, color, 1, HGIMGPROC_LINETYPE_SOLID);
+ }
+
+ return HGBASE_ERR_OK;
+ }
+
+ HGImageRoi imgRoi;
+ HGBase_GetImageROI(image, &imgRoi);
+ HGInt roiWidth = imgRoi.right - imgRoi.left;
+ HGInt roiHeight = imgRoi.bottom - imgRoi.top;
+
+ HGInt x, y;
+ if (HGIMGPROC_WMPOSTYPE_LEFT == posType)
+ {
+ x = 0;
+ y = (roiHeight - height) / 2;
+ }
+ else if (HGIMGPROC_WMPOSTYPE_TOP == posType)
+ {
+ x = (roiWidth - width) / 2;
+ y = 0;
+ }
+ else if (HGIMGPROC_WMPOSTYPE_RIGHT == posType)
+ {
+ x = roiWidth - width;
+ y = (roiHeight - height) / 2;
+ }
+ else if (HGIMGPROC_WMPOSTYPE_BOTTOM == posType)
+ {
+ x = (roiWidth - width) / 2;
+ y = roiHeight - height;
+ }
+ else if (HGIMGPROC_WMPOSTYPE_LEFTTOP == posType)
+ {
+ x = 0;
+ y = 0;
+ }
+ else if (HGIMGPROC_WMPOSTYPE_RIGHTTOP == posType)
+ {
+ x = roiWidth - width;
+ y = 0;
+ }
+ else if (HGIMGPROC_WMPOSTYPE_LEFTBOTTOM == posType)
+ {
+ x = 0;
+ y = roiHeight - height;
+ }
+ else if (HGIMGPROC_WMPOSTYPE_RIGHTBOTTOM == posType)
+ {
+ x = roiWidth - width;
+ y = roiHeight - height;
+ }
+ else
+ {
+ x = (roiWidth - width) / 2;
+ y = (roiHeight - height) / 2;
+ }
+
+ return DrawString(image, text, color, HGIMGPROC_WMPOSTYPE_LOCATION, x, y, fontSize, bold, underline, italic, strikeout);
+}
+
+void CvxText::MeasureChar(HGUInt wc, HGUInt fontSize, HGBool bold, HGBool italic, FT_BBox& acbox)
+{
+ assert(NULL != m_face);
+ assert(0 != fontSize);
+
+ FT_Set_Pixel_Sizes(m_face, fontSize, fontSize);
+ FT_UInt glyph_index = FT_Get_Char_Index(m_face, wc);
+ FT_Load_Glyph(m_face, glyph_index, FT_LOAD_DEFAULT);
+
+ if (bold)
+ {
+ if (m_face->glyph->format == FT_GLYPH_FORMAT_OUTLINE)
+ {
+ FT_Outline_Embolden(&m_face->glyph->outline, fontSize * 2);
+ }
+ }
+
+ if (italic)
+ {
+ if (m_face->glyph->format == FT_GLYPH_FORMAT_OUTLINE)
+ {
+ FT_Matrix matrix;
+ matrix.xx = 0x10000L;
+ matrix.xy = 0.4f * 0x10000L;
+ matrix.yx = 0;
+ matrix.yy = 0x10000L;
+ FT_Outline_Transform(&m_face->glyph->outline, &matrix);
+ }
+ }
+
+ if (m_face->glyph->format != FT_GLYPH_FORMAT_BITMAP)
+ {
+ FT_Render_Glyph(m_face->glyph, FT_RENDER_MODE_NORMAL);
+ }
+
+ FT_Glyph glyph;
+ FT_Get_Glyph(m_face->glyph, &glyph);
+ FT_Glyph_Get_CBox(glyph, FT_GLYPH_BBOX_TRUNCATE, &acbox);
+}
+
+void CvxText::GetStringLocation(const HGChar* text, HGUInt fontSize, HGBool bold, HGBool underline, HGBool italic, HGBool strikeout,
+ HGUInt& width, HGUInt& height, std::vector &vPos)
+{
+ assert(NULL != text && '\0' != *text);
+ assert(0 != fontSize);
+
+ width = 0;
+ height = 0;
+ vPos.clear();
+
+#if defined(HG_CMP_MSC)
+ WCHAR* pUnicode = GetUnicodeStr(text);
+#else
+ uint16_t* pUnicode = GetUnicodeStr(text);
+ uint16_t* pUnicodeEx = pUnicode + 1;
+#endif
+
+ HGInt origin = 0;
+ HGInt minY = INT_MAX, maxY = INT_MIN;
+
+ int i = 0;
+#if defined(HG_CMP_MSC)
+ while ('\0' != pUnicode[i])
+#else
+ while ('\0' != pUnicodeEx[i])
+#endif
+ {
+ FT_BBox acbox;
+#if defined(HG_CMP_MSC)
+ MeasureChar(pUnicode[i], fontSize, bold, italic, acbox);
+#else
+ MeasureChar(pUnicodeEx[i], fontSize, bold, italic, acbox);
+#endif
+
+ HGRect pos;
+ pos.left = origin + acbox.xMin;
+ pos.right = origin + acbox.xMax;
+ pos.top = -acbox.yMax;
+ pos.bottom = -acbox.yMin;
+ vPos.push_back(pos);
+
+#if defined(HG_CMP_MSC)
+ if (pUnicode[i] < 255 && (!isprint((int)pUnicode[i]) || isspace((int)pUnicode[i])))
+#else
+ if (pUnicodeEx[i] < 255 && (!isprint((int)pUnicodeEx[i]) || isspace((int)pUnicodeEx[i])))
+#endif
+ {
+ origin += fontSize / 2;
+ }
+ else
+ {
+ origin += (acbox.xMax + acbox.xMin);
+ }
+
+ if (acbox.yMin < minY)
+ minY = acbox.yMin;
+ if (acbox.yMax > maxY)
+ maxY = acbox.yMax;
+
+ ++i;
+ }
+
+ delete[] pUnicode;
+
+ width = origin;
+ height = (maxY - minY);
+ if (underline)
+ ++height;
+
+ for (int i = 0; i < (int)vPos.size(); ++i)
+ {
+ vPos[i].top += maxY;
+ vPos[i].bottom += maxY;
+ }
+}
+
+void CvxText::DrawChar(HGImage image, HGUInt wc, HGColor color, HGInt x, HGInt y, HGUInt fontSize, HGBool bold, HGBool italic)
+{
+ assert(NULL != m_face);
+ assert(NULL != image);
+ assert(0 != fontSize);
+
+ FT_Set_Pixel_Sizes(m_face, fontSize, fontSize);
+ FT_UInt glyph_index = FT_Get_Char_Index(m_face, wc);
+ FT_Load_Glyph(m_face, glyph_index, FT_LOAD_DEFAULT);
+
+ if (bold)
+ {
+ if (m_face->glyph->format == FT_GLYPH_FORMAT_OUTLINE)
+ {
+ FT_Outline_Embolden(&m_face->glyph->outline, fontSize * 2);
+ }
+ }
+
+ if (italic)
+ {
+ if (m_face->glyph->format == FT_GLYPH_FORMAT_OUTLINE)
+ {
+ FT_Matrix matrix;
+ matrix.xx = 0x10000L;
+ matrix.xy = 0.4f * 0x10000L;
+ matrix.yx = 0;
+ matrix.yy = 0x10000L;
+ FT_Outline_Transform(&m_face->glyph->outline, &matrix);
+ }
+ }
+
+ if (m_face->glyph->format != FT_GLYPH_FORMAT_BITMAP)
+ {
+ FT_Render_Glyph(m_face->glyph, FT_RENDER_MODE_NORMAL);
+ }
+
+ HGImageInfo imgInfo;
+ HGBase_GetImageInfo(image, &imgInfo);
+ uint32_t imgWidth = imgInfo.width;
+ uint32_t imgHeight = imgInfo.height;
+ uint32_t imgWidthStep = imgInfo.widthStep;
+ uint32_t imgType = imgInfo.type;
+
+ uint8_t *imgData;
+ HGBase_GetImageData(image, &imgData);
+
+ int32_t imgChannel = 0;
+ if (HGBASE_IMGTYPE_GRAY == imgType)
+ imgChannel = 1;
+ else if (HGBASE_IMGTYPE_RGB == imgType || HGBASE_IMGTYPE_BGR == imgType)
+ imgChannel = 3;
+ else if (HGBASE_IMGTYPE_RGBA == imgType || HGBASE_IMGTYPE_BGRA == imgType)
+ imgChannel = 4;
+ assert(0 != imgChannel);
+
+ HGImageRoi imgRoi;
+ HGBase_GetImageROI(image, &imgRoi);
+ uint32_t imgLeft = imgRoi.left;
+ uint32_t imgTop = imgRoi.top;
+ uint32_t imgRight = imgRoi.right;
+ uint32_t imgBottom = imgRoi.bottom;
+
+ for (unsigned int i = 0; i < m_face->glyph->bitmap.rows; ++i)
+ {
+ for (unsigned int j = 0; j < m_face->glyph->bitmap.width; ++j)
+ {
+ int32_t xOffset = (int32_t)imgLeft + x + (int32_t)j;
+ int32_t yOffset = (int32_t)imgTop + y + (int32_t)i;
+
+ if (xOffset >= (int32_t)imgLeft && xOffset < (int32_t)imgRight
+ && yOffset >= (int32_t)imgTop && yOffset < (int32_t)imgBottom)
+ {
+ uint8_t *p = m_face->glyph->bitmap.buffer + m_face->glyph->bitmap.pitch * i + j;
+ int32_t opacity = HG_GETCOLOR_A(color) * (*p) / 255;
+
+ uint8_t *pEx = imgData + yOffset * imgWidthStep + xOffset * imgChannel;
+ if (HGBASE_IMGORIGIN_BOTTOM == imgInfo.origin)
+ pEx = imgData + (imgHeight - yOffset - 1) * imgWidthStep + xOffset * imgChannel;
+
+ if (HGBASE_IMGTYPE_RGB == imgType || HGBASE_IMGTYPE_RGBA == imgType)
+ {
+ int32_t v0 = HG_GETCOLOR_R(color);
+ int32_t vDest0 = pEx[0];
+ int32_t value0 = (v0 - vDest0) * opacity;
+ pEx[0] = (uint8_t)(vDest0 + (((value0 << 8) + value0) >> 16));
+
+ int32_t v1 = HG_GETCOLOR_G(color);
+ int32_t vDest1 = pEx[1];
+ int32_t value1 = (v1 - vDest1) * opacity;
+ pEx[1] = (uint8_t)(vDest1 + (((value1 << 8) + value1) >> 16));
+
+ int32_t v2 = HG_GETCOLOR_B(color);
+ int32_t vDest2 = pEx[2];
+ int32_t value2 = (v2 - vDest2) * opacity;
+ pEx[2] = (uint8_t)(vDest2 + (((value2 << 8) + value2) >> 16));
+ }
+ else if (HGBASE_IMGTYPE_BGR == imgType || HGBASE_IMGTYPE_BGRA == imgType)
+ {
+ int32_t v0 = HG_GETCOLOR_B(color);
+ int32_t vDest0 = pEx[0];
+ int32_t value0 = (v0 - vDest0) * opacity;
+ pEx[0] = (uint8_t)(vDest0 + (((value0 << 8) + value0) >> 16));
+
+ int32_t v1 = HG_GETCOLOR_G(color);
+ int32_t vDest1 = pEx[1];
+ int32_t value1 = (v1 - vDest1) * opacity;
+ pEx[1] = (uint8_t)(vDest1 + (((value1 << 8) + value1) >> 16));
+
+ int32_t v2 = HG_GETCOLOR_R(color);
+ int32_t vDest2 = pEx[2];
+ int32_t value2 = (v2 - vDest2) * opacity;
+ pEx[2] = (uint8_t)(vDest2 + (((value2 << 8) + value2) >> 16));
+ }
+ else
+ {
+ int32_t v = (HG_GETCOLOR_R(color) * 76 + HG_GETCOLOR_G(color) * 150 + HG_GETCOLOR_B(color) * 30) >> 8;
+ int32_t vDest = *pEx;
+ int32_t value = (v - vDest) * opacity;
+ *pEx = (uint8_t)(vDest + (((value << 8) + value) >> 16));
+ }
+ }
+ }
+ }
+}
diff --git a/modules/imgproc/CvxText.hpp b/modules/imgproc/CvxText.hpp
new file mode 100644
index 00000000..ba231669
--- /dev/null
+++ b/modules/imgproc/CvxText.hpp
@@ -0,0 +1,34 @@
+#ifndef __CVXTEXT_H__
+#define __CVXTEXT_H__
+
+#include "HGImgProc.h"
+#include
+#include
+#include
+#include
+#include
+#include
+
+class CvxText
+{
+public:
+ CvxText();
+ ~CvxText();
+
+ HGResult Create(const HGChar *fontPath);
+ HGResult Destroy();
+ HGResult DrawString(HGImage image, const HGChar* text, HGColor color, HGUInt posType, HGInt locationX, HGInt locationY,
+ HGUInt fontSize, HGBool bold, HGBool underline, HGBool italic, HGBool strikeout);
+
+private:
+ void MeasureChar(HGUInt wc, HGUInt fontSize, HGBool bold, HGBool italic, FT_BBox& acbox);
+ void GetStringLocation(const HGChar* text, HGUInt fontSize, HGBool bold, HGBool underline, HGBool italic, HGBool strikeout,
+ HGUInt &width, HGUInt &height, std::vector &vPos);
+ void DrawChar(HGImage image, HGUInt wc, HGColor color, HGInt x, HGInt y, HGUInt fontSize, HGBool bold, HGBool italic);
+
+private:
+ FT_Library m_library;
+ FT_Face m_face;
+};
+
+#endif /* __CVXTEXT_H__ */
diff --git a/modules/imgproc/HGImgProc.cpp b/modules/imgproc/HGImgProc.cpp
index 56ebc1c0..b054250e 100644
--- a/modules/imgproc/HGImgProc.cpp
+++ b/modules/imgproc/HGImgProc.cpp
@@ -2,8 +2,9 @@
#include "./ImageProcess/ImageApplyAdjustColors.h"
#include "./ImageProcess/ImageApplyAutoCrop.h"
#include "./ImageProcess/ImageApplyDiscardBlank.h"
-#include
+#include "CvxText.hpp"
#include "../base/HGInc.h"
+#include "../base/HGUtility.h"
HGResult HGAPI HGImgProc_ResizeImage(HGImage image, HGImage destImage, HGUInt interp)
{
@@ -81,7 +82,12 @@ HGResult HGAPI HGImgProc_ResizeImage(HGImage image, HGImage destImage, HGUInt in
channels = 4;
uint8_t* p = data + roi.top * imgInfo.widthStep + roi.left * channels;
+ if (HGBASE_IMGORIGIN_BOTTOM == imgInfo.origin)
+ p = data + (imgInfo.height - roi.bottom) * imgInfo.widthStep + roi.left * channels;
+
uint8_t* pDest = destData + destRoi.top * destImgInfo.widthStep + destRoi.left * channels;
+ if (HGBASE_IMGORIGIN_BOTTOM == destImgInfo.origin)
+ pDest = destData + (destImgInfo.height - destRoi.bottom) * destImgInfo.widthStep + destRoi.left * channels;
IplImage* pImg = cvCreateImageHeader(cvSize(roiWidth, roiHeight), IPL_DEPTH_8U, channels);
IplImage* pImgDest = cvCreateImageHeader(cvSize(destRoiWidth, destRoiHeight), IPL_DEPTH_8U, channels);
@@ -147,8 +153,10 @@ HGResult HGAPI HGImgProc_ImageAdjustColors(HGImage image, HGImage destImage,
}
uint8_t* p = data + roi.top * imgInfo.widthStep + roi.left * channels;
- cv::Mat img(roiHeight, roiWidth, CV_8UC(channels), p, imgInfo.widthStep);
+ if (HGBASE_IMGORIGIN_BOTTOM == imgInfo.origin)
+ p = data + (imgInfo.height - roi.bottom) * imgInfo.widthStep + roi.left * channels;
+ cv::Mat img(roiHeight, roiWidth, CV_8UC(channels), p, imgInfo.widthStep);
CImageApplyAdjustColors imgApply(brightness, contrast, gamma);
imgApply.apply(img, 0);
}
@@ -196,8 +204,10 @@ HGResult HGAPI HGImgProc_ImageAdjustColors(HGImage image, HGImage destImage,
HGBase_CopyImage(image, destImage);
uint8_t* pDest = destData + destRoi.top * destImgInfo.widthStep + destRoi.left * channels;
- cv::Mat destImg(destRoiHeight, destRoiWidth, CV_8UC(channels), pDest, destImgInfo.widthStep);
+ if (HGBASE_IMGORIGIN_BOTTOM == destImgInfo.origin)
+ pDest = destData + (destImgInfo.height - destRoi.bottom) * destImgInfo.widthStep + destRoi.left * channels;
+ cv::Mat destImg(destRoiHeight, destRoiWidth, CV_8UC(channels), pDest, destImgInfo.widthStep);
CImageApplyAdjustColors imgApply(brightness, contrast, gamma);
imgApply.apply(destImg, 0);
}
@@ -227,7 +237,7 @@ HGResult HGAPI HGImgProc_ImageAutoCrop(HGImage image, HGBool autoCrop, HGBool de
if (0 == destOrigin)
destOrigin = imgInfo.origin;
- ret = HGImgProc_ImageAutoCrop(imageTmp, autoCrop, deskew, fillBlank, param,
+ ret = HGImgProc_ImageAutoCrop(imageTmp, autoCrop, deskew, fillBlank, param,
destWidth, destHeight, destType, destOrigin, destImage);
HGBase_DestroyImage(imageTmp);
}
@@ -267,6 +277,9 @@ HGResult HGAPI HGImgProc_ImageAutoCrop(HGImage image, HGBool autoCrop, HGBool de
channels = 3;
uint8_t* p = data + roi.top * imgInfo.widthStep + roi.left * channels;
+ if (HGBASE_IMGORIGIN_BOTTOM == imgInfo.origin)
+ p = data + (imgInfo.height - roi.bottom) * imgInfo.widthStep + roi.left * channels;
+
cv::Mat img(roiHeight, roiWidth, CV_8UC(channels), p, imgInfo.widthStep);
cv::Mat destImg;
@@ -343,9 +356,129 @@ HGResult HGAPI HGImgProc_ImageBlankCheck(HGImage image, const HGImgBlankCheckPar
channels = 3;
uint8_t* p = data + roi.top * imgInfo.widthStep + roi.left * channels;
+ if (HGBASE_IMGORIGIN_BOTTOM == imgInfo.origin)
+ p = data + (imgInfo.height - roi.bottom) * imgInfo.widthStep + roi.left * channels;
+
cv::Mat img(roiHeight, roiWidth, CV_8UC(channels), p, imgInfo.widthStep);
bool ret = CImageApplyDiscardBlank::apply(img, threshold, edge, blockSize, devTh, meanTh);
*blank = ret ? HGTRUE : HGFALSE;
return HGBASE_ERR_OK;
-}
\ No newline at end of file
+}
+
+HGResult HGAPI HGImgProc_ImageDrawLine(HGImage image, HGInt x1, HGInt y1, HGInt x2, HGInt y2,
+ HGColor color, HGUInt width, HGUInt type)
+{
+ if (NULL == image || 0 == width || type < HGIMGPROC_LINETYPE_SOLID || type > HGIMGPROC_LINETYPE_DASH)
+ {
+ return HGBASE_ERR_INVALIDARG;
+ }
+
+ HGImageInfo imgInfo;
+ HGBase_GetImageInfo(image, &imgInfo);
+ if (HGBASE_IMGTYPE_BINARY == imgInfo.type || HGBASE_IMGTYPE_GRAY == imgInfo.type)
+ {
+ HGImage imageTmp = NULL;
+ HGResult ret = HGBase_CloneImage(image, HGBASE_IMGTYPE_RGB, 0, &imageTmp);
+ if (HGBASE_ERR_OK == ret)
+ {
+ ret = HGImgProc_ImageDrawLine(imageTmp, x1, y1, x2, y2, color, width, type);
+ if (HGBASE_ERR_OK == ret)
+ {
+ ret = HGBase_CopyImage(imageTmp, image);
+ }
+
+ HGBase_DestroyImage(imageTmp);
+ }
+
+ return ret;
+ }
+
+ HGByte* data = NULL;
+ HGBase_GetImageData(image, &data);
+
+ HGImageRoi roi;
+ HGBase_GetImageROI(image, &roi);
+ HGUInt roiWidth = roi.right - roi.left;
+ HGUInt roiHeight = roi.bottom - roi.top;
+
+ uint32_t channels = 3;
+ if (HGBASE_IMGTYPE_BGRA == imgInfo.type || HGBASE_IMGTYPE_RGBA == imgInfo.type)
+ channels = 4;
+
+ uint8_t* p = data + roi.top * imgInfo.widthStep + roi.left * channels;
+ if (HGBASE_IMGORIGIN_BOTTOM == imgInfo.origin)
+ p = data + (imgInfo.height - roi.bottom) * imgInfo.widthStep + roi.left * channels;
+
+ IplImage* pImg = cvCreateImageHeader(cvSize(roiWidth, roiHeight), IPL_DEPTH_8U, channels);
+ cvSetData(pImg, p, imgInfo.widthStep);
+
+ if (HGBASE_IMGORIGIN_BOTTOM == imgInfo.origin)
+ {
+ y1 = roiHeight - y1 - 1;
+ y2 = roiHeight - y2 - 1;
+ }
+
+ HGUInt r = HG_GETCOLOR_R(color);
+ HGUInt g = HG_GETCOLOR_G(color);
+ HGUInt b = HG_GETCOLOR_B(color);
+ if (HGBASE_IMGTYPE_BGR == imgInfo.type || HGBASE_IMGTYPE_BGRA == imgInfo.type)
+ {
+ r = HG_GETCOLOR_B(color);
+ g = HG_GETCOLOR_G(color);
+ b = HG_GETCOLOR_R(color);
+ }
+
+ cvLine(pImg, cvPoint(x1, y1), cvPoint(x2, y2), cvScalar(r, g, b), width);
+ cvReleaseImageHeader(&pImg);
+ return HGBASE_ERR_OK;
+}
+
+HGResult HGAPI HGImgProc_AddImageWatermark(HGImage image, const HGChar* text, HGColor color, HGUInt posType,
+ HGInt locationX, HGInt locationY, const HGImgWatermarkFontParam *fontParam)
+{
+ if (NULL == image || NULL == text || '\0' == *text || posType < HGIMGPROC_WMPOSTYPE_LEFT
+ || posType > HGIMGPROC_WMPOSTYPE_LOCATION)
+ {
+ return HGBASE_ERR_INVALIDARG;
+ }
+
+ std::string fontName = "宋体";
+ HGUInt fontSize = 20;
+ HGBool bold = HGFALSE;
+ HGBool underline = HGFALSE;
+ HGBool italic = HGFALSE;
+ HGBool strikeout = HGFALSE;
+
+ if (NULL != fontParam)
+ {
+ if (0 == fontParam->fontSize)
+ {
+ return HGBASE_ERR_INVALIDARG;
+ }
+
+ fontName = fontParam->foneName;
+ fontSize = fontParam->fontSize;
+ bold = fontParam->bold;
+ underline = fontParam->underline;
+ italic = fontParam->italic;
+ strikeout = fontParam->strikeout;
+ }
+
+ HGChar moduleName[256];
+ HGBase_GetModuleName((void *)HGImgProc_AddImageWatermark, moduleName, 256);
+ HGChar modulePath[256];
+ HGBase_GetFilePath(moduleName, modulePath, 256);
+ HGChar fontPath[256];
+ sprintf(fontPath, "%s%s.ttf", modulePath, fontName.c_str());
+
+ CvxText cvxText;
+ HGResult ret = cvxText.Create(fontPath);
+ if (HGBASE_ERR_OK != ret)
+ {
+ return ret;
+ }
+
+ ret = cvxText.DrawString(image, text, color, posType, locationX, locationY, fontSize, bold, underline, italic, strikeout);
+ return ret;
+}
diff --git a/modules/imgproc/HGImgProc.h b/modules/imgproc/HGImgProc.h
index 57f43044..e4949567 100644
--- a/modules/imgproc/HGImgProc.h
+++ b/modules/imgproc/HGImgProc.h
@@ -11,6 +11,32 @@
/* 双线性插值 */
#define HGIMGPROC_INTERPOTYPE_LINEAR 2L
+/* 线条类型-实线 */
+#define HGIMGPROC_LINETYPE_SOLID 1L
+/* 线条类型-虚线 */
+#define HGIMGPROC_LINETYPE_DASH 2L
+
+/* 水印位置-左侧 */
+#define HGIMGPROC_WMPOSTYPE_LEFT 1L
+/* 水印位置-上侧 */
+#define HGIMGPROC_WMPOSTYPE_TOP 2L
+/* 水印位置-右侧 */
+#define HGIMGPROC_WMPOSTYPE_RIGHT 3L
+/* 水印位置-下侧 */
+#define HGIMGPROC_WMPOSTYPE_BOTTOM 4L
+/* 水印位置-左上 */
+#define HGIMGPROC_WMPOSTYPE_LEFTTOP 5L
+/* 水印位置-右上 */
+#define HGIMGPROC_WMPOSTYPE_RIGHTTOP 6L
+/* 水印位置-左下 */
+#define HGIMGPROC_WMPOSTYPE_LEFTBOTTOM 7L
+/* 水印位置-右下 */
+#define HGIMGPROC_WMPOSTYPE_RIGHTBOTTOM 8L
+/* 水印位置-中间 */
+#define HGIMGPROC_WMPOSTYPE_CENTER 9L
+/* 水印位置-自定义 */
+#define HGIMGPROC_WMPOSTYPE_LOCATION 10L
+
/* 自动裁剪参数 */
typedef struct
{
@@ -33,6 +59,17 @@ typedef struct
HGDouble meanTh; /* 默认200 */
}HGImgBlankCheckParam;
+/* 水印字体参数 */
+typedef struct
+{
+ HGChar foneName[64]; /* 字体名, windows上为GBK编码, linux上为UTF8编码 */
+ HGUInt fontSize; /* 字号 */
+ HGBool bold; /* 是否粗体 */
+ HGBool underline; /* 是否有下划线 */
+ HGBool italic; /* 是否斜体 */
+ HGBool strikeout; /* 是否有删除线 */
+}HGImgWatermarkFontParam;
+
/* 图像缩放
* 参数:
* 1) image: in, 源图像句柄
@@ -89,4 +126,33 @@ HGEXPORT HGResult HGAPI HGImgProc_ImageAutoCrop(HGImage image, HGBool autoCrop,
*/
HGEXPORT HGResult HGAPI HGImgProc_ImageBlankCheck(HGImage image, const HGImgBlankCheckParam *param, HGBool *blank);
+/* 图像画线
+* 1) image: in, 图像句柄
+* 2) x1: in, 第一个点x坐标
+* 3) y1: in, 第一个点y坐标
+* 4) x2: in, 第二个点x坐标
+* 5) y2: in, 第二个点y坐标
+* 6) color: in, 颜色
+* 7) width: in, 线宽
+* 8) type: in, 表示线类型, 参见HGIMGPROC_LINETYPE_*
+* 说明:
+* 1) 操作的只是图像的ROI区域
+*/
+HGEXPORT HGResult HGAPI HGImgProc_ImageDrawLine(HGImage image, HGInt x1, HGInt y1, HGInt x2, HGInt y2,
+ HGColor color, HGUInt width, HGUInt type);
+
+/* 添加图像水印
+* 1) image: in, 图像句柄
+* 2) text: 水印文本, windows上为GBK编码, linux上为UTF8编码
+* 3) color: 颜色
+* 4) posType: 位置, 见HGIMGPROC_WMPOSTYPE_*
+* 5) locationX: 当posType为HGIMGPROC_WMPOSTYPE_LOCATION时表示x坐标
+* 6) locationY: 当posType为HGIMGPROC_WMPOSTYPE_LOCATION时表示y坐标
+* 7) fontParam: 字体参数, 为NULL时使用默认参数
+* 说明:
+* 1) 操作的只是图像的ROI区域
+*/
+HGEXPORT HGResult HGAPI HGImgProc_AddImageWatermark(HGImage image, const HGChar *text, HGColor color, HGUInt posType,
+ HGInt locationX, HGInt locationY, const HGImgWatermarkFontParam *fontParam);
+
#endif /* __HGIMGPROC_H__ */
\ No newline at end of file
diff --git a/sdk/webservice/ManagerV2.cpp b/sdk/webservice/ManagerV2.cpp
index 344d7ddc..b4cea796 100644
--- a/sdk/webservice/ManagerV2.cpp
+++ b/sdk/webservice/ManagerV2.cpp
@@ -57,13 +57,6 @@ namespace ver_2
m_globalCfg.imageJpegQuality = GetCfgIntValue("global", "imageJpegQuality", 80);
m_globalCfg.imageTiffCompression = GetCfgStringValue("global", "imageTiffCompression", "lzw");
m_globalCfg.imageTiffJpegQuality = GetCfgIntValue("global", "imageTiffJpegQuality", 80);
- m_globalCfg.uploadHttpHost = GetCfgStringValue("global", "uploadHttpHost", "");
- m_globalCfg.uploadHttpPort = GetCfgIntValue("global", "uploadHttpPort", 80);
- m_globalCfg.uploadHttpPath = GetCfgStringValue("global", "uploadHttpPath", "/upload.cgi");
- m_globalCfg.uploadFtpUser = GetCfgStringValue("global", "uploadFtpUser", "");
- m_globalCfg.uploadFtpPassword = GetCfgStringValue("global", "uploadFtpPassword", "");
- m_globalCfg.uploadFtpHost = GetCfgStringValue("global", "uploadFtpHost", "");
- m_globalCfg.uploadFtpPort = GetCfgIntValue("global", "uploadFtpPort", 21);
m_globalCfg.fileSavePath.push_back('/');
HGChar stdSavePath[256];
@@ -280,41 +273,6 @@ namespace ver_2
m_globalCfg.imageTiffJpegQuality = cfg.imageTiffJpegQuality;
SetCfgIntValue("global", "imageTiffJpegQuality", m_globalCfg.imageTiffJpegQuality);
}
- if (mask & GlobalConfig::uploadHttpHostMask)
- {
- m_globalCfg.uploadHttpHost = cfg.uploadHttpHost;
- SetCfgStringValue("global", "uploadHttpHost", m_globalCfg.uploadHttpHost);
- }
- if (mask & GlobalConfig::uploadHttpPortMask)
- {
- m_globalCfg.uploadHttpPort = cfg.uploadHttpPort;
- SetCfgIntValue("global", "uploadHttpPort", m_globalCfg.uploadHttpPort);
- }
- if (mask & GlobalConfig::uploadHttpPathMask)
- {
- m_globalCfg.uploadHttpPath = cfg.uploadHttpPath;
- SetCfgStringValue("global", "uploadHttpPath", m_globalCfg.uploadHttpPath);
- }
- if (mask & GlobalConfig::uploadFtpUserMask)
- {
- m_globalCfg.uploadFtpUser = cfg.uploadFtpUser;
- SetCfgStringValue("global", "uploadFtpUser", m_globalCfg.uploadFtpUser);
- }
- if (mask & GlobalConfig::uploadFtpPasswordMask)
- {
- m_globalCfg.uploadFtpPassword = cfg.uploadFtpPassword;
- SetCfgStringValue("global", "uploadFtpPassword", m_globalCfg.uploadFtpPassword);
- }
- if (mask & GlobalConfig::uploadFtpHostMask)
- {
- m_globalCfg.uploadFtpHost = cfg.uploadFtpHost;
- SetCfgStringValue("global", "uploadFtpHost", m_globalCfg.uploadFtpHost);
- }
- if (mask & GlobalConfig::uploadFtpPortMask)
- {
- m_globalCfg.uploadFtpPort = cfg.uploadFtpPort;
- SetCfgIntValue("global", "uploadFtpPort", m_globalCfg.uploadFtpPort);
- }
HGBase_LeaveLock(m_lock);
errInfo.clear();
@@ -840,25 +798,200 @@ namespace ver_2
return ret;
}
- int ManagerV2::UploadLocalFile(const std::string& filePath, const std::string& mode, const std::string& remoteFilePath, std::string& errInfo)
+ static int tolower(int c)
+ {
+ if (c >= 'A' && c <= 'Z')
+ {
+ return c + 'a' - 'A';
+ }
+ else
+ {
+ return c;
+ }
+ }
+
+ static int htoi(char s[])
+ {
+ int i;
+ int n = 0;
+ if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
+ {
+ i = 2;
+ }
+ else
+ {
+ i = 0;
+ }
+ for (; (s[i] >= '0' && s[i] <= '9') || (s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z'); ++i)
+ {
+ if (tolower(s[i]) > '9')
+ {
+ n = 16 * n + (10 + tolower(s[i]) - 'a');
+ }
+ else
+ {
+ n = 16 * n + (tolower(s[i]) - '0');
+ }
+ }
+ return n;
+ }
+
+ int ManagerV2::LocalImageAddWatermark(const std::string& imagePath, const std::string& text, const std::string& textColor, int textOpacity, const std::string& textPos,
+ int marginLeft, int marginTop, int marginRight, int marginBottom, int locationX, int locationY, const std::string& fontName,
+ int fontSize, bool fontBold, bool fontUnderline, bool fontItalic, bool fontStrikeout, std::string& outImagePath, std::string& errInfo)
+ {
+ outImagePath.clear();
+ errInfo = "错误";
+
+ if (imagePath.empty() || text.empty() || 7 != textColor.size() || textOpacity < 0 || textOpacity > 255 || marginLeft < 0 || marginTop < 0
+ || marginRight < 0 || marginBottom < 0 || fontName.empty() || fontSize <= 0)
+ return -1;
+
+ HGUInt posType = 0;
+ if ("left" == textPos)
+ posType = HGIMGPROC_WMPOSTYPE_LEFT;
+ else if ("top" == textPos)
+ posType = HGIMGPROC_WMPOSTYPE_TOP;
+ else if ("right" == textPos)
+ posType = HGIMGPROC_WMPOSTYPE_RIGHT;
+ else if ("bottom" == textPos)
+ posType = HGIMGPROC_WMPOSTYPE_BOTTOM;
+ else if ("left_top" == textPos)
+ posType = HGIMGPROC_WMPOSTYPE_LEFTTOP;
+ else if ("right_top" == textPos)
+ posType = HGIMGPROC_WMPOSTYPE_RIGHTTOP;
+ else if ("left_bottom" == textPos)
+ posType = HGIMGPROC_WMPOSTYPE_LEFTBOTTOM;
+ else if ("right_bottom" == textPos)
+ posType = HGIMGPROC_WMPOSTYPE_RIGHTBOTTOM;
+ else if ("center" == textPos)
+ posType = HGIMGPROC_WMPOSTYPE_CENTER;
+ else if ("location" == textPos)
+ posType = HGIMGPROC_WMPOSTYPE_LOCATION;
+ if (0 == posType)
+ {
+ return -1;
+ }
+
+ if ('#' != textColor[0])
+ return -1;
+ for (int i = 1; i < (int)textColor.size(); ++i)
+ {
+ if ((textColor[i] >= '0' && textColor[i] <= '9') || (textColor[i] >= 'a' && textColor[i] <= 'f')
+ || (textColor[i] >= 'A' && textColor[i] <= 'F'))
+ {
+
+ }
+ else
+ {
+ return -1;
+ }
+ }
+
+ char colorR[3] = { 0 };
+ char colorG[3] = { 0 };
+ char colorB[3] = { 0 };
+ strncpy(colorR, textColor.c_str() + 1, 2);
+ strncpy(colorG, textColor.c_str() + 3, 2);
+ strncpy(colorB, textColor.c_str() + 5, 2);
+ HGUInt r = htoi(colorR);
+ HGUInt g = htoi(colorG);
+ HGUInt b = htoi(colorB);
+
+ int ret = -1;
+ HGImage image = NULL;
+ HGImgFmt_LoadImage(imagePath.c_str(), 0, NULL, 0, HGBASE_IMGORIGIN_TOP, &image);
+ if (NULL != image)
+ {
+ HGImageRoi roi;
+ HGBase_GetImageROI(image, &roi);
+
+ if (HGIMGPROC_WMPOSTYPE_LEFT == posType)
+ {
+ roi.left += marginLeft;
+ }
+ else if (HGIMGPROC_WMPOSTYPE_TOP == posType)
+ {
+ roi.top += marginTop;
+ }
+ else if (HGIMGPROC_WMPOSTYPE_RIGHT == posType)
+ {
+ roi.right -= marginRight;
+ }
+ else if (HGIMGPROC_WMPOSTYPE_BOTTOM == posType)
+ {
+ roi.bottom -= marginBottom;
+ }
+ else if (HGIMGPROC_WMPOSTYPE_LEFTTOP == posType)
+ {
+ roi.left += marginLeft;
+ roi.top += marginTop;
+ }
+ else if (HGIMGPROC_WMPOSTYPE_RIGHTTOP == posType)
+ {
+ roi.top += marginTop;
+ roi.right -= marginRight;
+ }
+ else if (HGIMGPROC_WMPOSTYPE_LEFTBOTTOM == posType)
+ {
+ roi.left += marginLeft;
+ roi.bottom -= marginBottom;
+ }
+ else if (HGIMGPROC_WMPOSTYPE_RIGHTBOTTOM == posType)
+ {
+ roi.right -= marginRight;
+ roi.bottom -= marginBottom;
+ }
+
+ HGImgWatermarkFontParam fontParam;
+ strcpy(fontParam.foneName, fontName.c_str());
+ fontParam.fontSize = fontSize;
+ fontParam.bold = fontBold;
+ fontParam.underline = fontUnderline;
+ fontParam.italic = fontItalic;
+ fontParam.strikeout = fontStrikeout;
+
+ HGColor color = HG_MAKECOLOR(r, g, b, textOpacity);
+ if (HGBASE_ERR_OK == HGBase_SetImageROI(image, &roi)
+ && HGBASE_ERR_OK == HGImgProc_AddImageWatermark(image, text.c_str(), color, posType,
+ locationX, locationY, &fontParam))
+ {
+ if (0 == SaveImage(image, outImagePath))
+ {
+ HGBase_EnterLock(m_lock);
+ m_saveFilePathList.push_back(outImagePath);
+ RestoreSaveFilePathList(m_saveFilePathList);
+ HGBase_LeaveLock(m_lock);
+ errInfo.clear();
+ ret = 0;
+ }
+ }
+
+ HGBase_DestroyImage(image);
+ }
+
+ return ret;
+ }
+
+ int ManagerV2::UploadLocalFile(const std::string& filePath, const std::string& remoteFilePath, const std::string& uploadMode,
+ const std::string& httpHost, int httpPort, const std::string& httpPath, const std::string& ftpUser, const std::string& ftpPassword,
+ const std::string& ftpHost, int ftpPort, std::string& errInfo)
{
errInfo = "错误";
if (filePath.empty() || remoteFilePath.empty())
return -1;
- if ("http" != mode && "ftp" != mode)
+ if ("http" != uploadMode && "ftp" != uploadMode)
return -1;
int ret = -1;
- if ("http" == mode)
+ if ("http" == uploadMode)
{
- ret = HttpUpload(m_globalCfg.uploadHttpHost, m_globalCfg.uploadHttpPort, m_globalCfg.uploadHttpPath,
- filePath, remoteFilePath);
+ ret = HttpUpload(httpHost, httpPort, httpPath, filePath, remoteFilePath);
}
else
{
- ret = FtpUpload(m_globalCfg.uploadFtpUser, m_globalCfg.uploadFtpPassword, m_globalCfg.uploadFtpHost,
- m_globalCfg.uploadFtpPort, filePath, remoteFilePath);
+ ret = FtpUpload(ftpUser, ftpPassword, ftpHost, ftpPort, filePath, remoteFilePath);
}
if (0 == ret)
@@ -2347,6 +2480,29 @@ namespace ver_2
return ret;
}
+ int ManagerV2::ImageAddWatermark(int imageIndex, const std::string& text, const std::string& textColor, int textOpacity, const std::string& textPos,
+ int marginLeft, int marginTop, int marginRight, int marginBottom, int locationX, int locationY, const std::string& fontName,
+ int fontSize, bool fontBold, bool fontUnderline, bool fontItalic, bool fontStrikeout, std::string& outImagePath, std::string& errInfo)
+ {
+ outImagePath.clear();
+ errInfo.clear();
+
+ if (NULL == m_sqlite)
+ return -1;
+
+ std::string imagePath;
+ if (0 != SaveImage(imageIndex, imagePath))
+ {
+ return -1;
+ }
+
+ int ret = LocalImageAddWatermark(imagePath, text, textColor, textOpacity, textPos, marginLeft, marginTop, marginRight, marginBottom,
+ locationX, locationY, fontName, fontSize, fontBold, fontUnderline, fontItalic, fontStrikeout, outImagePath, errInfo);
+
+ HGBase_DeleteFile(imagePath.c_str());
+ return ret;
+ }
+
int ManagerV2::LoadBase64(const std::string& fileName, std::string& base64)
{
base64.clear();
@@ -2641,7 +2797,7 @@ namespace ver_2
break;
#else
struct stat buf;
- int result = stat(lineContent, &buf);
+ int result = stat(filePath, &buf);
if (0 != result)
break;
#endif
@@ -3238,7 +3394,7 @@ namespace ver_2
if (NULL == imgData)
return NULL;
- size = imgSize;
+ size = (HGUInt)imgSize;
format = imgFormat;
return imgData;
}
@@ -3424,7 +3580,7 @@ namespace ver_2
void ManagerV2::ClearBindFolder()
{
assert(!m_bindFolder.empty());
-
+#if defined(HG_CMP_MSC)
char szFind[MAX_PATH];
sprintf(szFind, "%s*.*", m_bindFolder.c_str());
@@ -3445,6 +3601,24 @@ namespace ver_2
} while (FindNextFileA(hFind, &FindFileData));
FindClose(hFind);
+#else
+ DIR* dir = opendir(m_bindFolder.c_str());
+ if (NULL != dir)
+ {
+ struct dirent* dire = NULL;
+ while (dire = readdir(dir))
+ {
+ char fileName[256];
+ sprintf(fileName, "%s%s", m_bindFolder.c_str(), dire->d_name);
+ if (!IS_DIR(fileName))
+ {
+ HGBase_DeleteFile(fileName);
+ }
+ }
+
+ closedir(dir);
+ }
+#endif
}
void ManagerV2::UpdateBindFolder()
@@ -3498,7 +3672,11 @@ namespace ver_2
sprintf(fileName, fmt, m_bindFolder.c_str(), m_bindNameBase + tables[i].idx, tables[i].format.c_str());
char destName[256];
sprintf(destName, fmt, m_bindFolder.c_str(), m_bindNameBase + tables[i].idx + 1, tables[i].format.c_str());
+#if defined(HG_CMP_MSC)
MoveFileA(fileName, destName);
+#else
+ rename(fileName, destName);
+#endif
}
}
@@ -3507,7 +3685,7 @@ namespace ver_2
SaveToFile(imgData, imgSize, fileName);
}
- void ManagerV2::ModifyBindFolderImage(const std::vector& tables, int imageIndex, const std::string imgFmt,
+ void ManagerV2::ModifyBindFolderImage(const std::vector& tables, int imageIndex, const std::string imgFmt,
const HGByte* imgData, HGUInt imgSize)
{
assert(!m_bindFolder.empty());
@@ -3580,7 +3758,11 @@ namespace ver_2
sprintf(fileName, fmt, m_bindFolder.c_str(), m_bindNameBase + tables[i].idx, tables[i].format.c_str());
char destName[256];
sprintf(destName, fmt, m_bindFolder.c_str(), m_bindNameBase + tables[i].idx - value, tables[i].format.c_str());
+#if defined(HG_CMP_MSC)
MoveFileA(fileName, destName);
+#else
+ rename(fileName, destName);
+#endif
}
}
}
@@ -3607,17 +3789,29 @@ namespace ver_2
sprintf(fileName1, fmt, m_bindFolder.c_str(), m_bindNameBase + imageIndex1, format1.c_str());
char TmpFileName[256];
sprintf(TmpFileName, "%sTemp", m_bindFolder.c_str());
- MoveFileA(fileName1, TmpFileName);
+#if defined(HG_CMP_MSC)
+ MoveFileA(fileName1, TmpFileName);
+#else
+ rename(fileName1, TmpFileName);
+#endif
char fileName2[256];
sprintf(fileName2, fmt, m_bindFolder.c_str(), m_bindNameBase + imageIndex2, format2.c_str());
char fileName2Dest[256];
sprintf(fileName2Dest, fmt, m_bindFolder.c_str(), m_bindNameBase + imageIndex1, format2.c_str());
- MoveFileA(fileName2, fileName2Dest);
+#if defined(HG_CMP_MSC)
+ MoveFileA(fileName2, fileName2Dest);
+#else
+ rename(fileName2, fileName2Dest);
+#endif
char fileName1Dest[256];
sprintf(fileName1Dest, fmt, m_bindFolder.c_str(), m_bindNameBase + imageIndex2, format1.c_str());
- MoveFileA(TmpFileName, fileName1Dest);
+#if defined(HG_CMP_MSC)
+ MoveFileA(TmpFileName, fileName1Dest);
+#else
+ rename(TmpFileName, fileName1Dest);
+#endif
}
void ManagerV2::ClearBindFolderImageList(const std::vector& tables)
diff --git a/sdk/webservice/ManagerV2.h b/sdk/webservice/ManagerV2.h
index e0e7ae38..e1098b73 100644
--- a/sdk/webservice/ManagerV2.h
+++ b/sdk/webservice/ManagerV2.h
@@ -36,22 +36,13 @@ namespace ver_2
imageFormatMask = 0x00000008,
imageJpegQualityMask = 0x00000010,
imageTiffCompressionMask = 0x00000020,
- imageTiffJpegQualityMask = 0x00000040,
- uploadHttpHostMask = 0x00000080,
- uploadHttpPortMask = 0x00000100,
- uploadHttpPathMask = 0x00000200,
- uploadFtpUserMask = 0x00000400,
- uploadFtpPasswordMask = 0x00000800,
- uploadFtpHostMask = 0x00001000,
- uploadFtpPortMask = 0x00002000,
+ imageTiffJpegQualityMask = 0x00000040
};
GlobalConfig()
{
imageJpegQuality = 0;
imageTiffJpegQuality = 0;
- uploadHttpPort = 0;
- uploadFtpPort = 0;
}
// 文件保存
@@ -63,14 +54,6 @@ namespace ver_2
int imageJpegQuality;
std::string imageTiffCompression;
int imageTiffJpegQuality;
- // 上传
- std::string uploadHttpHost;
- unsigned short uploadHttpPort;
- std::string uploadHttpPath;
- std::string uploadFtpUser;
- std::string uploadFtpPassword;
- std::string uploadFtpHost;
- unsigned short uploadFtpPort;
};
struct DeviceParam
@@ -229,8 +212,14 @@ namespace ver_2
std::string& outZipPath, std::string& errInfo);
// 本地图像纠偏
int LocalImageDeskew(const std::string& imagePath, std::string& outImagePath, std::string& errInfo);
+ // 本地图像添加水印
+ int LocalImageAddWatermark(const std::string& imagePath, const std::string& text, const std::string& textColor, int textOpacity, const std::string& textPos,
+ int marginLeft, int marginTop, int marginRight, int marginBottom, int locationX, int locationY, const std::string& fontName,
+ int fontSize, bool fontBold, bool fontUnderline, bool fontItalic, bool fontStrikeout, std::string& outImagePath, std::string& errInfo);
// 上传文件
- int UploadLocalFile(const std::string& filePath, const std::string& mode, const std::string& remoteFilePath, std::string& errInfo);
+ int UploadLocalFile(const std::string& filePath, const std::string& remoteFilePath, const std::string& uploadMode,
+ const std::string &httpHost, int httpPort, const std::string& httpPath, const std::string &ftpUser, const std::string& ftpPassword,
+ const std::string& ftpHost, int ftpPort, std::string& errInfo);
// 设备初始化
int InitDevice(std::string& errInfo);
@@ -314,6 +303,10 @@ namespace ver_2
int MakeZipFile(const std::vector& imageIndexList, std::string& outZipPath, std::string& errInfo);
// 图像纠偏
int ImageDeskew(int imageIndex, std::string& outImagePath, std::string& errInfo);
+ // 图像添加水印
+ int ImageAddWatermark(int imageIndex, const std::string& text, const std::string& textColor, int textOpacity, const std::string& textPos,
+ int marginLeft, int marginTop, int marginRight, int marginBottom, int locationX, int locationY, const std::string& fontName,
+ int fontSize, bool fontBold, bool fontUnderline, bool fontItalic, bool fontStrikeout, std::string& outImagePath, std::string& errInfo);
public:
static int LoadBase64(const std::string& fileName, std::string& base64);
diff --git a/sdk/webservice/WSUser.cpp b/sdk/webservice/WSUser.cpp
index db3225d1..704a5e70 100644
--- a/sdk/webservice/WSUser.cpp
+++ b/sdk/webservice/WSUser.cpp
@@ -272,6 +272,10 @@ namespace ver_2
{
LocalImageDeskew(json);
}
+ else if ("local_image_add_watermark" == func)
+ {
+ LocalImageAddWatermark(json);
+ }
else if ("upload_local_file" == func)
{
UploadLocalFile(json);
@@ -424,6 +428,10 @@ namespace ver_2
{
ImageDeskew(json);
}
+ else if ("image_add_watermark" == func)
+ {
+ ImageAddWatermark(json);
+ }
cJSON_Delete(json);
}
@@ -1040,34 +1048,6 @@ namespace ver_2
if (find)
mask |= GlobalConfig::imageTiffJpegQualityMask;
- cfg.uploadHttpHost = GetJsonStringValue(json, "upload_http_host", &find);
- if (find)
- mask |= GlobalConfig::uploadHttpHostMask;
-
- cfg.uploadHttpPort = GetJsonIntValue(json, "upload_http_port", &find);
- if (find)
- mask |= GlobalConfig::uploadHttpPortMask;
-
- cfg.uploadHttpPath = GetJsonStringValue(json, "upload_http_path", &find);
- if (find)
- mask |= GlobalConfig::uploadHttpPathMask;
-
- cfg.uploadFtpUser = GetJsonStringValue(json, "upload_ftp_user", &find);
- if (find)
- mask |= GlobalConfig::uploadFtpUserMask;
-
- cfg.uploadFtpPassword = GetJsonStringValue(json, "upload_ftp_password", &find);
- if (find)
- mask |= GlobalConfig::uploadFtpPasswordMask;
-
- cfg.uploadFtpHost = GetJsonStringValue(json, "upload_ftp_host", &find);
- if (find)
- mask |= GlobalConfig::uploadFtpHostMask;
-
- cfg.uploadFtpPort = GetJsonIntValue(json, "upload_ftp_port", &find);
- if (find)
- mask |= GlobalConfig::uploadFtpPortMask;
-
std::string errInfo;
int ret = GetManager()->SetGlobalConfig(cfg, mask, errInfo);
@@ -1136,14 +1116,7 @@ namespace ver_2
fmt += "\"image_format\":\"%s\", ";
fmt += "\"image_jpeg_quality\":%d, ";
fmt += "\"image_tiff_compression\":\"%s\", ";
- fmt += "\"image_tiff_jpeg_quality\":%d, ";
- fmt += "\"upload_http_host\":\"%s\", ";
- fmt += "\"upload_http_port\":%d, ";
- fmt += "\"upload_http_path\":\"%s\", ";
- fmt += "\"upload_ftp_user\":\"%s\", ";
- fmt += "\"upload_ftp_password\":\"%s\", ";
- fmt += "\"upload_ftp_host\":\"%s\", ";
- fmt += "\"upload_ftp_port\":%d}";
+ fmt += "\"image_tiff_jpeg_quality\":%d}";
}
char resp[2048] = {0};
@@ -1159,15 +1132,11 @@ namespace ver_2
if (findIden)
sprintf(resp, fmt.c_str(), "get_global_config", iden.c_str(), ret, StdStringToUtf8(strToJson(cfg.fileSavePath)).c_str(),
StdStringToUtf8(strToJson(cfg.fileNamePrefix)).c_str(), cfg.fileNameMode.c_str(), cfg.imageFormat.c_str(), cfg.imageJpegQuality,
- cfg.imageTiffCompression.c_str(), cfg.imageTiffJpegQuality, cfg.uploadHttpHost.c_str(), cfg.uploadHttpPort,
- strToJson(cfg.uploadHttpPath).c_str(), cfg.uploadFtpUser.c_str(), cfg.uploadFtpPassword.c_str(), cfg.uploadFtpHost.c_str(),
- cfg.uploadFtpPort);
+ cfg.imageTiffCompression.c_str(), cfg.imageTiffJpegQuality);
else
sprintf(resp, fmt.c_str(), "get_global_config", ret, StdStringToUtf8(strToJson(cfg.fileSavePath)).c_str(),
StdStringToUtf8(strToJson(cfg.fileNamePrefix)).c_str(), cfg.fileNameMode.c_str(), cfg.imageFormat.c_str(), cfg.imageJpegQuality,
- cfg.imageTiffCompression.c_str(), cfg.imageTiffJpegQuality, cfg.uploadHttpHost.c_str(), cfg.uploadHttpPort,
- strToJson(cfg.uploadHttpPath).c_str(), cfg.uploadFtpUser.c_str(), cfg.uploadFtpPassword.c_str(), cfg.uploadFtpHost.c_str(),
- cfg.uploadFtpPort);
+ cfg.imageTiffCompression.c_str(), cfg.imageTiffJpegQuality);
}
SendResponse((const HGByte*)resp, (HGUInt)strlen(resp), HGTRUE);
@@ -1801,6 +1770,113 @@ namespace ver_2
delete[] resp;
}
+ void WSUser::LocalImageAddWatermark(cJSON* json)
+ {
+ assert(NULL != json);
+
+ std::string imagePath = Utf8ToStdString(GetJsonStringValue(json, "image_path"));
+ std::string text = Utf8ToStdString(GetJsonStringValue(json, "text"));
+
+ bool find;
+ std::string textColor = GetJsonStringValue(json, "text_color", &find);
+ if (!find)
+ textColor = "#000000";
+ int textOpacity = GetJsonIntValue(json, "text_opacity", &find);
+ if (!find)
+ textOpacity = 255;
+ std::string textPos = GetJsonStringValue(json, "text_pos", &find);
+ if (!find)
+ textPos = "location";
+ int marginLeft = GetJsonIntValue(json, "margin_left", &find);
+ int marginTop = GetJsonIntValue(json, "margin_top", &find);
+ int marginRight = GetJsonIntValue(json, "margin_right", &find);
+ int marginBottom = GetJsonIntValue(json, "margin_bottom", &find);
+ int locationX = GetJsonIntValue(json, "location_x", &find);
+ int locationY = GetJsonIntValue(json, "location_y", &find);
+
+ std::string fontName = Utf8ToStdString(GetJsonStringValue(json, "font_name", &find));
+ if (!find)
+ fontName = "宋体";
+ int fontSize = GetJsonIntValue(json, "font_size", &find);
+ if (!find)
+ fontSize = 20;
+ bool fontBold = GetJsonBoolValue(json, "font_bold");
+ bool fontUnderline = GetJsonBoolValue(json, "font_underline");
+ bool fontItalic = GetJsonBoolValue(json, "font_italic");
+ bool fontStrikeout = GetJsonBoolValue(json, "font_strikeout");
+
+ std::string outImagePath;
+ std::string errInfo;
+ int ret = GetManager()->LocalImageAddWatermark(imagePath, text, textColor, textOpacity, textPos,
+ marginLeft, marginTop, marginRight, marginBottom, locationX, locationY, fontName, fontSize,
+ fontBold, fontUnderline, fontItalic, fontStrikeout, outImagePath, errInfo);
+
+ 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);
+
+ std::string fmt;
+ fmt += "{\"func\":\"%s\", ";
+ if (findIden)
+ fmt += "\"iden\":\"%s\", ";
+ if (0 != ret)
+ {
+ fmt += "\"ret\":%d, ";
+ fmt += "\"err_info\":\"%s\"}";
+ }
+ else
+ {
+ fmt += "\"ret\":%d, ";
+ if (getBase64)
+ {
+ fmt += "\"image_path\":\"%s\", ";
+ fmt += "\"image_base64\":\"%s\"}";
+ }
+ else
+ {
+ fmt += "\"image_path\":\"%s\"}";
+ }
+ }
+
+ char* resp = new char[1024 + outImageBase64.size()];
+ if (0 != ret)
+ {
+ if (findIden)
+ sprintf(resp, fmt.c_str(), "local_image_add_watermark", iden.c_str(), ret, StdStringToUtf8(errInfo).c_str());
+ else
+ sprintf(resp, fmt.c_str(), "local_image_add_watermark", ret, StdStringToUtf8(errInfo).c_str());
+ }
+ else
+ {
+ if (findIden)
+ {
+ if (getBase64)
+ sprintf(resp, fmt.c_str(), "local_image_add_watermark", iden.c_str(), ret, StdStringToUtf8(strToJson(outImagePath)).c_str(),
+ outImageBase64.c_str());
+ else
+ sprintf(resp, fmt.c_str(), "local_image_add_watermark", iden.c_str(), ret, StdStringToUtf8(strToJson(outImagePath)).c_str());
+ }
+ else
+ {
+ if (getBase64)
+ sprintf(resp, fmt.c_str(), "local_image_add_watermark", ret, StdStringToUtf8(strToJson(outImagePath)).c_str(),
+ outImageBase64.c_str());
+ else
+ sprintf(resp, fmt.c_str(), "local_image_add_watermark", ret, StdStringToUtf8(strToJson(outImagePath)).c_str());
+ }
+ }
+
+ SendResponse((const HGByte*)resp, (HGUInt)strlen(resp), HGTRUE);
+ delete[] resp;
+ }
+
void WSUser::UploadLocalFile(cJSON* json)
{
assert(NULL != json);
@@ -1808,9 +1884,6 @@ namespace ver_2
std::string filePath = Utf8ToStdString(GetJsonStringValue(json, "file_path"));
bool find = false;
- std::string mode = GetJsonStringValue(json, "upload_mode", &find);
- if (!find)
- mode = "http";
std::string remoteFilePath = Utf8ToStdString(GetJsonStringValue(json, "remote_file_path", &find));
if (!find)
{
@@ -1820,9 +1893,26 @@ namespace ver_2
remoteFilePath += "/";
remoteFilePath += fileName;
}
+ std::string uploadMode = GetJsonStringValue(json, "upload_mode", &find);
+ if (!find)
+ uploadMode = "http";
+ std::string httpHost = GetJsonStringValue(json, "http_host", &find);
+ int httpPort = GetJsonIntValue(json, "http_port", &find);
+ if (!find)
+ httpPort = 80;
+ std::string httpPath = GetJsonStringValue(json, "http_path", &find);
+ if (!find)
+ httpPath = "/upload.cgi";
+ std::string ftpUser = GetJsonStringValue(json, "ftp_user", &find);
+ std::string ftpPassword = GetJsonStringValue(json, "ftp_password", &find);
+ std::string ftpHost = GetJsonStringValue(json, "ftp_host", &find);
+ int ftpPort = GetJsonIntValue(json, "ftp_port", &find);
+ if (!find)
+ ftpPort = 21;
std::string errInfo;
- int ret = GetManager()->UploadLocalFile(filePath, mode, remoteFilePath, errInfo);
+ int ret = GetManager()->UploadLocalFile(filePath, remoteFilePath, uploadMode, httpHost, httpPort, httpPath,
+ ftpUser, ftpPassword, ftpHost, ftpPort, errInfo);
bool findIden = false;
std::string iden = GetJsonStringValue(json, "iden", &findIden);
@@ -4033,4 +4123,111 @@ namespace ver_2
SendResponse((const HGByte*)resp, (HGUInt)strlen(resp), HGTRUE);
delete[] resp;
}
+
+ void WSUser::ImageAddWatermark(cJSON* json)
+ {
+ assert(NULL != json);
+
+ int imageIndex = GetJsonIntValue(json, "image_index");
+ std::string text = Utf8ToStdString(GetJsonStringValue(json, "text"));
+
+ bool find;
+ std::string textColor = GetJsonStringValue(json, "text_color", &find);
+ if (!find)
+ textColor = "#000000";
+ int textOpacity = GetJsonIntValue(json, "text_opacity", &find);
+ if (!find)
+ textOpacity = 255;
+ std::string textPos = GetJsonStringValue(json, "text_pos", &find);
+ if (!find)
+ textPos = "location";
+ int marginLeft = GetJsonIntValue(json, "margin_left", &find);
+ int marginTop = GetJsonIntValue(json, "margin_top", &find);
+ int marginRight = GetJsonIntValue(json, "margin_right", &find);
+ int marginBottom = GetJsonIntValue(json, "margin_bottom", &find);
+ int locationX = GetJsonIntValue(json, "location_x", &find);
+ int locationY = GetJsonIntValue(json, "location_y", &find);
+
+ std::string fontName = Utf8ToStdString(GetJsonStringValue(json, "font_name", &find));
+ if (!find)
+ fontName = "宋体";
+ int fontSize = GetJsonIntValue(json, "font_size", &find);
+ if (!find)
+ fontSize = 20;
+ bool fontBold = GetJsonBoolValue(json, "font_bold");
+ bool fontUnderline = GetJsonBoolValue(json, "font_underline");
+ bool fontItalic = GetJsonBoolValue(json, "font_italic");
+ bool fontStrikeout = GetJsonBoolValue(json, "font_strikeout");
+
+ std::string outImagePath;
+ std::string errInfo;
+ int ret = GetManager()->ImageAddWatermark(imageIndex, text, textColor, textOpacity, textPos,
+ marginLeft, marginTop, marginRight, marginBottom, locationX, locationY, fontName, fontSize,
+ fontBold, fontUnderline, fontItalic, fontStrikeout, outImagePath, errInfo);
+
+ 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);
+
+ std::string fmt;
+ fmt += "{\"func\":\"%s\", ";
+ if (findIden)
+ fmt += "\"iden\":\"%s\", ";
+ if (0 != ret)
+ {
+ fmt += "\"ret\":%d, ";
+ fmt += "\"err_info\":\"%s\"}";
+ }
+ else
+ {
+ fmt += "\"ret\":%d, ";
+ if (getBase64)
+ {
+ fmt += "\"image_path\":\"%s\", ";
+ fmt += "\"image_base64\":\"%s\"}";
+ }
+ else
+ {
+ fmt += "\"image_path\":\"%s\"}";
+ }
+ }
+
+ char* resp = new char[1024 + outImageBase64.size()];
+ if (0 != ret)
+ {
+ if (findIden)
+ sprintf(resp, fmt.c_str(), "image_add_watermark", iden.c_str(), ret, StdStringToUtf8(errInfo).c_str());
+ else
+ sprintf(resp, fmt.c_str(), "image_add_watermark", ret, StdStringToUtf8(errInfo).c_str());
+ }
+ else
+ {
+ if (findIden)
+ {
+ if (getBase64)
+ sprintf(resp, fmt.c_str(), "image_add_watermark", iden.c_str(), ret, StdStringToUtf8(strToJson(outImagePath)).c_str(),
+ outImageBase64.c_str());
+ else
+ sprintf(resp, fmt.c_str(), "image_add_watermark", iden.c_str(), ret, StdStringToUtf8(strToJson(outImagePath)).c_str());
+ }
+ else
+ {
+ if (getBase64)
+ sprintf(resp, fmt.c_str(), "image_add_watermark", ret, StdStringToUtf8(strToJson(outImagePath)).c_str(),
+ outImageBase64.c_str());
+ else
+ sprintf(resp, fmt.c_str(), "image_add_watermark", ret, StdStringToUtf8(strToJson(outImagePath)).c_str());
+ }
+ }
+
+ SendResponse((const HGByte*)resp, (HGUInt)strlen(resp), HGTRUE);
+ delete[] resp;
+ }
}
\ No newline at end of file
diff --git a/sdk/webservice/WSUser.h b/sdk/webservice/WSUser.h
index 70fdc81c..1b0a9584 100644
--- a/sdk/webservice/WSUser.h
+++ b/sdk/webservice/WSUser.h
@@ -44,6 +44,7 @@ namespace ver_2
void SplitLocalImage(cJSON* json);
void LocalMakeZipFile(cJSON* json);
void LocalImageDeskew(cJSON* json);
+ void LocalImageAddWatermark(cJSON* json);
void UploadLocalFile(cJSON* json);
void InitDevice(cJSON* json);
@@ -84,6 +85,7 @@ namespace ver_2
void SplitImage(cJSON* json);
void MakeZipFile(cJSON* json);
void ImageDeskew(cJSON* json);
+ void ImageAddWatermark(cJSON* json);
private:
std::string m_initDeviceIden;
diff --git a/test/webservice/demo.html b/test/webservice/demo.html
index f5978b92..927c1878 100644
--- a/test/webservice/demo.html
+++ b/test/webservice/demo.html
@@ -71,6 +71,11 @@
var myCanvas = document.getElementById("myCanvas");
myCanvas.src = message['image_base64'];
}
+ else if ("local_image_add_watermark" == message['func'])
+ {
+ var myCanvas = document.getElementById("myCanvas");
+ myCanvas.src = message['image_base64'];
+ }
else if ("upload_local_file" == message['func'])
{
alert(msg.data);
@@ -264,6 +269,11 @@
var myCanvas = document.getElementById("myCanvas");
myCanvas.src = message['image_base64'];
}
+ else if ("image_add_watermark" == message['func'])
+ {
+ var myCanvas = document.getElementById("myCanvas");
+ myCanvas.src = message['image_base64'];
+ }
}
}
}
@@ -354,6 +364,25 @@
}));
}
+ function LocalImageAddWatermark()
+ {
+ socket.send(JSON.stringify({
+ 'func':'local_image_add_watermark',
+ 'image_path':'D:\\1.jpg',
+ 'text':'扫描仪,1234qwer',
+ 'text_color':'#FF0000',
+ 'text_pos':'right_top',
+ 'font_size':60,
+ 'margin_right':20,
+ 'margin_top':50,
+ 'font_bold':true,
+ 'font_underline':true,
+ 'font_italic':true,
+ 'font_strikeout':true,
+ 'get_base64':true
+ }));
+ }
+
function UploadLocalFile()
{
socket.send(JSON.stringify({
@@ -648,6 +677,18 @@
}));
}
+ function ImageAddWatermark()
+ {
+ socket.send(JSON.stringify({
+ 'func':'image_add_watermark',
+ 'image_index':0,
+ 'text':'1234567890',
+ 'text_color':'#FF0000',
+ 'font_size':60,
+ 'get_base64':true
+ }));
+ }
+
window.onload = function()
{
var myimg = document.getElementById("myCanvas");
@@ -686,6 +727,7 @@
+
@@ -722,6 +764,7 @@
+
diff --git a/third_party/freetype/kylin/aarch64/lib/libfreetype.a b/third_party/freetype/kylin/aarch64/lib/libfreetype.a
index ecc1319c..9f027399 100644
Binary files a/third_party/freetype/kylin/aarch64/lib/libfreetype.a and b/third_party/freetype/kylin/aarch64/lib/libfreetype.a differ
diff --git a/third_party/freetype/kylin/amd64/lib/libfreetype.a b/third_party/freetype/kylin/amd64/lib/libfreetype.a
index 6efc65c8..9edbeef6 100644
Binary files a/third_party/freetype/kylin/amd64/lib/libfreetype.a and b/third_party/freetype/kylin/amd64/lib/libfreetype.a differ