如何使用Java8将8位rgba png图像转换为16 bpc rgba png图像?

kr98yfug  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(642)

我使用BuffereImage类从pdf生成图像。我得到了8位rgba使用下面提到的片段,但我无法将其转换为16 bpc rgba。

int page = 0;
BufferedImage bim = new BufferedImage(100, 100, BufferedImage.TYPE_USHORT_565_RGB);
bim = pdfRenderer.renderImage(page);
String fileName = OUTPUT_DIR + "image-" + page + ".png";
ImageIOUtil.writeImage(bim, fileName, 1);
bf1o4zei

bf1o4zei1#

为每个采样(或通道)创建16位 BufferedImage 并将其存储为png,可以使用以下代码:

ComponentColorModel colorModel = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_USHORT);
BufferedImage image = new BufferedImage(colorModel, colorModel.createCompatibleWritableRaster(100, 100), colorModel.isAlphaPremultiplied(), null);

if (!ImageIO.write(image, "PNG", new File("test.png"))) {
    System.err.println("Could not write PNG: " + image);
}

根据代码,我假设你使用的是pdfbox。如果您使用的是pdfbox,则可以使用 ImageIOUtil.writeImage 而不是 ImageIO.write . 但是你可能想把dpi设置得比 1 ... ?
还要注意的是 image = pdfRenderer.renderImage(page) 在你的代码中将替换图像,所以你不能使用它。尝试使用 renderPageToGraphics(int, Graphics2D) 方法:

ComponentColorModel colorModel = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_USHORT);
BufferedImage image = new BufferedImage(colorModel, colorModel.createCompatibleWritableRaster(100, 100), colorModel.isAlphaPremultiplied(), null);

Graphics2D g = image.createGraphics();
try {
    pdfRenderer.renderPageToGraphics(page, g);
}
finally {
    g.dispose();
}

if (!ImageIOUtil.writeImage(image, test.png, 72))) {
    System.err.println("Could not write PNG: " + image);
}

相关问题