java - 如何使用 java 8 将 8 位 RGBA png 图像转换为 16 bpc RGBA png 图像?
问题描述
我使用 BufferedImage 类从 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);
解决方案
要为每个样本(或通道)创建一个 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);
}
推荐阅读
- c++ - 如何将控制器与视图连接起来,反之亦然?
- html - 在线商店产品的 HTML 和 CSS 结构
- android - 如何解决“状态不佳:无法在 DocumentSnapshotPlatform 上获取不存在的字段”
- javascript - 将 Promise 对象转换为 JSON 对象
- laravel - Laravel 资源集合显示空字段
- c++ - 使用自定义 AVIOContext 查找流信息时出现 FFMPEG 错误
- sql - 如何在 HIVE 中查询 JSON 格式?
- git-lfs - Git LFS“服务器上不存在对象”,因为它试图找到 LFS 未跟踪的旧文件?
- html - 如何为我的按钮设置响应高度
- bash - 使用 afconvert 命令行工具将 .mp3 文件转换为 m4r