mirror of
https://github.com/HIllya51/LunaTranslator.git
synced 2024-12-27 15:44:12 +08:00
wx
This commit is contained in:
parent
79e6dfa28f
commit
9296699635
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -10,3 +10,6 @@
|
|||||||
[submodule "plugins/libs/rapidfuzz-cpp"]
|
[submodule "plugins/libs/rapidfuzz-cpp"]
|
||||||
path = plugins/libs/rapidfuzz-cpp
|
path = plugins/libs/rapidfuzz-cpp
|
||||||
url = https://github.com/rapidfuzz/rapidfuzz-cpp
|
url = https://github.com/rapidfuzz/rapidfuzz-cpp
|
||||||
|
[submodule "plugins/libs/wechat-ocr"]
|
||||||
|
path = plugins/libs/wechat-ocr
|
||||||
|
url = https://github.com/swigger/wechat-ocr
|
||||||
|
@ -1,8 +1,4 @@
|
|||||||
import requests
|
|
||||||
import random
|
import random
|
||||||
import json
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
from hashlib import md5
|
from hashlib import md5
|
||||||
from ocrengines.baseocrclass import baseocr
|
from ocrengines.baseocrclass import baseocr
|
||||||
|
|
||||||
|
@ -106,6 +106,8 @@ class baseocr(commonbase):
|
|||||||
self.level2init()
|
self.level2init()
|
||||||
try:
|
try:
|
||||||
text = self.ocr(imagebinary)
|
text = self.ocr(imagebinary)
|
||||||
|
if text is None:
|
||||||
|
text = ""
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.needinit = True
|
self.needinit = True
|
||||||
raise e
|
raise e
|
||||||
|
61
LunaTranslator/LunaTranslator/ocrengines/weixinocr.py
Normal file
61
LunaTranslator/LunaTranslator/ocrengines/weixinocr.py
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
import gobject, os, uuid, json
|
||||||
|
from ocrengines.baseocrclass import baseocr
|
||||||
|
from ctypes import CDLL, c_void_p, c_wchar_p, c_char_p, cast
|
||||||
|
|
||||||
|
|
||||||
|
class OCR(baseocr):
|
||||||
|
def initocr(self):
|
||||||
|
self.wcocr = CDLL(gobject.GetDllpath(("wcocr.dll")))
|
||||||
|
wcocr_init = self.wcocr.wcocr_init
|
||||||
|
wcocr_init.argtypes = (
|
||||||
|
c_wchar_p,
|
||||||
|
c_wchar_p,
|
||||||
|
)
|
||||||
|
wcocr_init.restype = c_void_p
|
||||||
|
|
||||||
|
base = r"C:\Program Files\Tencent\WeChat"
|
||||||
|
for _ in os.listdir(base):
|
||||||
|
if _.startswith("["):
|
||||||
|
wechat_path = os.path.join(
|
||||||
|
base,
|
||||||
|
_,
|
||||||
|
)
|
||||||
|
break
|
||||||
|
wechatocr_path = (
|
||||||
|
os.getenv("APPDATA")
|
||||||
|
+ r"\Tencent\WeChat\XPlugin\Plugins\WeChatOCR\7079\extracted\WeChatOCR.exe"
|
||||||
|
)
|
||||||
|
self.pobj = wcocr_init(wechatocr_path, wechat_path)
|
||||||
|
|
||||||
|
def end(self):
|
||||||
|
|
||||||
|
wcocr_destroy = self.wcocr.wcocr_destroy
|
||||||
|
wcocr_destroy.argtypes = c_void_p
|
||||||
|
wcocr_destroy(self.pobj)
|
||||||
|
|
||||||
|
def ocr(self, imagebinary):
|
||||||
|
if not self.pobj:
|
||||||
|
raise Exception("找不到微信&微信OCR路径")
|
||||||
|
fname = gobject.gettempdir(str(uuid.uuid4()) + ".png")
|
||||||
|
with open(fname, "wb") as ff:
|
||||||
|
ff.write(imagebinary)
|
||||||
|
imgfile = os.path.abspath(fname)
|
||||||
|
wcocr_ocr = self.wcocr.wcocr_ocr
|
||||||
|
wcocr_ocr.argtypes = c_void_p, c_char_p
|
||||||
|
wcocr_ocr.restype = c_void_p
|
||||||
|
wcocr_free_str = self.wcocr.wcocr_free_str
|
||||||
|
wcocr_free_str.argtypes = (c_void_p,)
|
||||||
|
pstring = wcocr_ocr(self.pobj, imgfile.encode("utf8"))
|
||||||
|
if not pstring:
|
||||||
|
return
|
||||||
|
string = cast(pstring, c_char_p).value.decode("utf8")
|
||||||
|
wcocr_free_str(pstring)
|
||||||
|
|
||||||
|
os.remove(imgfile)
|
||||||
|
boxs = []
|
||||||
|
texts = []
|
||||||
|
for line in json.loads(string):
|
||||||
|
x1, y1, x2, y2, text = line
|
||||||
|
boxs.append((x1, y1, x2, y2))
|
||||||
|
texts.append(text)
|
||||||
|
return self.common_solve_text_orientation(boxs, texts)
|
@ -1454,6 +1454,11 @@
|
|||||||
"use": false,
|
"use": false,
|
||||||
"name": "manga-ocr",
|
"name": "manga-ocr",
|
||||||
"type": "offline"
|
"type": "offline"
|
||||||
|
},
|
||||||
|
"weixinocr": {
|
||||||
|
"use": false,
|
||||||
|
"name": "WeChatOCR",
|
||||||
|
"type": "offline"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"fanyi": {
|
"fanyi": {
|
||||||
|
@ -29,7 +29,7 @@ include(generate_product_version)
|
|||||||
|
|
||||||
set(VERSION_MAJOR 5)
|
set(VERSION_MAJOR 5)
|
||||||
set(VERSION_MINOR 11)
|
set(VERSION_MINOR 11)
|
||||||
set(VERSION_PATCH 1)
|
set(VERSION_PATCH 2)
|
||||||
|
|
||||||
add_library(pch pch.cpp)
|
add_library(pch pch.cpp)
|
||||||
target_precompile_headers(pch PUBLIC pch.h)
|
target_precompile_headers(pch PUBLIC pch.h)
|
||||||
@ -41,3 +41,4 @@ add_subdirectory(winsharedutils)
|
|||||||
add_subdirectory(hookmagpie)
|
add_subdirectory(hookmagpie)
|
||||||
add_subdirectory(shareddllproxy)
|
add_subdirectory(shareddllproxy)
|
||||||
add_subdirectory(applicationloopbackaudio)
|
add_subdirectory(applicationloopbackaudio)
|
||||||
|
add_subdirectory(wcocr)
|
1
plugins/libs/wechat-ocr
Submodule
1
plugins/libs/wechat-ocr
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit ec76d84b950b68e5c3e2a06bc3d62f28bd06e19f
|
@ -5,8 +5,10 @@ if x86:
|
|||||||
shutil.copy('../builds/_x86/loopbackaudio.exe','../../LunaTranslator/files/plugins')
|
shutil.copy('../builds/_x86/loopbackaudio.exe','../../LunaTranslator/files/plugins')
|
||||||
shutil.copy('../builds/_x86/winrtutils32.dll','../../LunaTranslator/files/plugins/DLL32')
|
shutil.copy('../builds/_x86/winrtutils32.dll','../../LunaTranslator/files/plugins/DLL32')
|
||||||
shutil.copy('../builds/_x86/winsharedutils32.dll','../../LunaTranslator/files/plugins/DLL32')
|
shutil.copy('../builds/_x86/winsharedutils32.dll','../../LunaTranslator/files/plugins/DLL32')
|
||||||
|
shutil.copy('../builds/_x86/wcocr.dll','../../LunaTranslator/files/plugins/DLL32')
|
||||||
else:
|
else:
|
||||||
shutil.copy('../builds/_x64/shareddllproxy64.exe','../../LunaTranslator/files/plugins')
|
shutil.copy('../builds/_x64/shareddllproxy64.exe','../../LunaTranslator/files/plugins')
|
||||||
shutil.copy('../builds/_x64/hookmagpie.dll','../../LunaTranslator/files/plugins')
|
shutil.copy('../builds/_x64/hookmagpie.dll','../../LunaTranslator/files/plugins')
|
||||||
shutil.copy('../builds/_x64/winrtutils64.dll','../../LunaTranslator/files/plugins/DLL64')
|
shutil.copy('../builds/_x64/winrtutils64.dll','../../LunaTranslator/files/plugins/DLL64')
|
||||||
shutil.copy('../builds/_x64/winsharedutils64.dll','../../LunaTranslator/files/plugins/DLL64')
|
shutil.copy('../builds/_x64/winsharedutils64.dll','../../LunaTranslator/files/plugins/DLL64')
|
||||||
|
shutil.copy('../builds/_x64/wcocr.dll','../../LunaTranslator/files/plugins/DLL64')
|
||||||
|
30
plugins/wcocr/CMakeLists.txt
Normal file
30
plugins/wcocr/CMakeLists.txt
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
|
||||||
|
project(wcocr)
|
||||||
|
|
||||||
|
set(wcocr_src wechat-ocr/src/mojocall.cpp wechat-ocr/src/ocr_protobuf.pb.cc wechat-ocr/src/wechatocr.cpp)
|
||||||
|
message(${wcocr_src})
|
||||||
|
string(REPLACE ";" ";../libs/" wcocr_src "${wcocr_src}")
|
||||||
|
message(${wcocr_src})
|
||||||
|
set(wcocr_src "../libs/${wcocr_src}")
|
||||||
|
message(${wcocr_src})
|
||||||
|
|
||||||
|
|
||||||
|
add_library(wcocr MODULE wcocr.cpp ${wcocr_src})
|
||||||
|
target_include_directories(wcocr PUBLIC ../libs/wechat-ocr/vs.proj PUBLIC ../libs/wechat-ocr/src PRIVATE ../libs/wechat-ocr/spt)
|
||||||
|
|
||||||
|
target_compile_options(wcocr
|
||||||
|
PUBLIC
|
||||||
|
/std:c++17
|
||||||
|
/MD
|
||||||
|
/wd4018
|
||||||
|
/DUNICODE
|
||||||
|
/D_UNICODE
|
||||||
|
)
|
||||||
|
|
||||||
|
if(${CMAKE_SIZEOF_VOID_P} EQUAL 8)
|
||||||
|
target_link_libraries(wcocr ${CMAKE_SOURCE_DIR}/libs/wechat-ocr/spt/x64/libprotobuf-lite.lib ${CMAKE_SOURCE_DIR}/libs/wechat-ocr/spt/x64/mmmojo_64.lib)
|
||||||
|
target_link_options(wcocr PRIVATE "/DELAYLOAD:mmmojo_64.dll")
|
||||||
|
else()
|
||||||
|
target_link_libraries(wcocr ${CMAKE_SOURCE_DIR}/libs/wechat-ocr/spt/x86/libprotobuf-lite.lib ${CMAKE_SOURCE_DIR}/libs/wechat-ocr/spt/x86/mmmojo.lib)
|
||||||
|
target_link_options(wcocr PRIVATE "/DELAYLOAD:mmmojo.dll")
|
||||||
|
endif()
|
51
plugins/wcocr/wcocr.cpp
Normal file
51
plugins/wcocr/wcocr.cpp
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#include <stdafx.h>
|
||||||
|
#include <wechatocr.h>
|
||||||
|
#include <nlohmann/json.hpp>
|
||||||
|
#define DECLARE extern "C" __declspec(dllexport)
|
||||||
|
|
||||||
|
DECLARE void *wcocr_init(const wchar_t *wexe, const wchar_t *wwcdir)
|
||||||
|
{
|
||||||
|
auto obj = new CWeChatOCR(wexe, wwcdir);
|
||||||
|
if (obj->wait_connection(5000))
|
||||||
|
{
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
delete obj;
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DECLARE void wcocr_destroy(void *pobj)
|
||||||
|
{
|
||||||
|
if (!pobj)
|
||||||
|
return;
|
||||||
|
auto obj = reinterpret_cast<CWeChatOCR *>(pobj);
|
||||||
|
delete obj;
|
||||||
|
}
|
||||||
|
DECLARE void wcocr_free_str(char *ptr)
|
||||||
|
{
|
||||||
|
delete[] ptr;
|
||||||
|
}
|
||||||
|
DECLARE char *wcocr_ocr(void *pobj, const char *u8path)
|
||||||
|
{
|
||||||
|
if (!pobj)
|
||||||
|
return 0;
|
||||||
|
auto obj = reinterpret_cast<CWeChatOCR *>(pobj);
|
||||||
|
CWeChatOCR::result_t res;
|
||||||
|
std::string imgpath = u8path;
|
||||||
|
if (!obj->doOCR(imgpath, &res))
|
||||||
|
return 0;
|
||||||
|
std::vector<std::wstring> rets;
|
||||||
|
std::vector<int> xs, ys, xs2, ys2;
|
||||||
|
nlohmann::json js;
|
||||||
|
for (auto &blk : res.ocr_response)
|
||||||
|
{
|
||||||
|
js.push_back({blk.left, blk.top, blk.right, blk.bottom, blk.text});
|
||||||
|
}
|
||||||
|
std::string _s = js.dump();
|
||||||
|
auto s = new char[_s.size() + 1];
|
||||||
|
strcpy(s, _s.c_str());
|
||||||
|
return s;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user