想要将org.bytedeco.javacpp.lept.PIX转换为byte []和缓冲图像

问题描述 投票:1回答:1

我想编写一个将org.bytedeco.javacpp.lept.PIX转换为byte[]BufferedImage的实用程序。我尝试了以下方法:

1)使用Java2DFrameUtils,但它使用以下代码反转了我的图像颜色(1-> 0和0-> 1):

LeptonicaFrameConverter c = new LeptonicaFrameConverter();
 Frame f = c.convert(src);
 BufferedImage img = Java2DFrameUtils.toBufferedImage(f);

2)this方法不使用org.bytedeco.javacpp包,因此对我没有帮助。

3)当我尝试使用此程序包的PointerPointerSizeTPointer时,出现错误提示

"Error in pixWriteMem: &data not defined".

这是我的代码:

    PointerPointer pp = new PointerPointer();
    SizeTPointer psize = new SizeTPointer();
    lept.pixWriteMem(pp, psize, src, lept.IFF_TIFF);
    byte[] by = pp.asByteBuffer().array();
    BufferedImage img = ImageIO.read(new ByteArrayInputStream(by));

任何帮助将不胜感激。 TIA。

java arrays image-processing bufferedimage leptonica
1个回答
0
投票

我想我来晚了。但是如果将来有人到达此职位,这就是我如何处理此问题。

问题是bufferpsize均未初始化。因此,我将0用作缓冲区的大小,调用pixWriteMem来返回psize指针中的缓冲区大小。然后使用预期大小的缓冲区再次调用pixWriteMem

注意:如果使用非常大的图像,请检查toInt()调用中的潜在问题!

示例代码在Kotlin中。

@Throws(IOException::class)
fun convertPixToImage(pix: PIX?, size: Int = 0): ByteArray {
    val buffer = ByteBuffer.allocate(size)
    val psize = SizeTPointer(size.toLong())
    val format = IFF_PNG
    if (0 != lept.pixWriteMem(buffer, psize, pix, format)) {
        throw IllegalArgumentException("Cannot convert image")
    }
    val gotSize = psize.get().toInt()
    if (gotSize != size) {
        return convertPixToImage(pix, gotSize)
    }
    return buffer.array()
}
© www.soinside.com 2019 - 2024. All rights reserved.