我想编写一个将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)当我尝试使用此程序包的PointerPointer
和SizeTPointer
时,出现错误提示
"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。
我想我来晚了。但是如果将来有人到达此职位,这就是我如何处理此问题。
问题是buffer
和psize
均未初始化。因此,我将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()
}