Java 每像素字节数,每行字节数-如何在tess two的tessbaseapi.cpp中使用函数nativeSetImageBytes?

Java 每像素字节数,每行字节数-如何在tess two的tessbaseapi.cpp中使用函数nativeSetImageBytes?,java,c++,java-native-interface,tesseract,tess-two,Java,C++,Java Native Interface,Tesseract,Tess Two,我们正在解析一个显示文本片段的图像,该文本片段的分辨率为2121x105 px。在Java中,我们有以下代码来获取字节数组(我们的限制之一是在这里使用字节数组): 这个字节数组然后传递给本机C++代码——我们不使用TESS 2的java包装器,但是我们使用本地库。在本机代码中,我们试图获得 带有GetUTF8Text()的图像文本。然后我们看到tess two已经有了一个实现,可以通过将图像作为字节数组传递来设置要读取的图像: void Java_com_..._TessBaseAPI_nati

我们正在解析一个显示文本片段的图像,该文本片段的分辨率为2121x105 px。在Java中,我们有以下代码来获取字节数组(我们的限制之一是在这里使用字节数组):

这个字节数组然后传递给本机C++代码——我们不使用TESS 2的java包装器,但是我们使用本地库。在本机代码中,我们试图获得 带有GetUTF8Text()的图像文本。然后我们看到tess two已经有了一个实现,可以通过将图像作为字节数组传递来设置要读取的图像:

void Java_com_..._TessBaseAPI_nativeSetImageBytes(JNIEnv *env,
                                                  jobject thiz,
                                                  jlong mNativeData,
                                                  jbyteArray data,
                                                  jint width,
                                                  jint height,
                                                  jint bpp,
                                                  jint bpl) {

...
我们计算PNG的bpp应该是4(RGBA)。目前尚不清楚bpl的预期效果。如果我们将图像的宽度设置为bpp,那么我们会得到一个分割错误。如果我们将其设置为零,则返回一个空字符串

更新: 符号错误在GetUTF8Text()中抛出,而不是在SetImage()中抛出

SIGSEGV (signal SIGSEGV: invalid address (fault address: 0xc))
它使用rgba rgb或灰色格式的解码图像

所以您需要解码png(这个问题解释了如何在java中实现),并将结果转换为字节数组

bpp是rgba格式的每像素字节数,它将是4(1字节为红色2字节为绿色3字节为蓝色4字节为alpha),rgb为3(1字节为红色2字节为绿色3字节为蓝色),灰度为1


bpl是每行字节数=bpp*图像宽度

您需要先解码png。解码是什么意思?我是说我说的。您的图像是用libpng编码的,需要解码才能使用tesseract。请参阅java示例好的,谢谢。现在我知道我需要解码我的jbyteArray,但是我将得到另一个对象类型,而nativeSetImageBytes需要一个字节数组。为了清楚起见,函数nativeSetImageBytes是tess-two的一个实现。tess-two又称tesseract,它需要rgba rgb或灰色格式的解码图像。所以您需要解码png并将结果转换为字节数组。对于rgba格式,bpp为每像素字节数。对于rgb格式,bpp为4字节(1字节为红色;2字节为绿色;3字节为蓝色;4字节为alpha);对于rgb格式,bpp为3字节(1字节为红色;2字节为绿色;3字节为蓝色);对于灰度,bpp为1字节。bpl是每行字节数=bpp*图像宽度
SIGSEGV (signal SIGSEGV: invalid address (fault address: 0xc))