Java加载口腔X光SDK生成的图像时宽高属性为null如何解决
核心问题
- C#端保存图像的代码存在格式不匹配问题:虽然给输出文件设置了
.bmp后缀,但实际使用TiffBitmapEncoder编码生成的是ZIP压缩的16位灰度TIFF格式图像,文件实际格式与后缀不符。 - Java原生ImageIO默认没有内置16位灰度压缩TIFF的解码器,所以调用
ImageIO.read直接返回null。 - JavaFX的Image是异步加载的,你创建实例后立刻调用
getWidth/getHeight时图像还没加载完成,自然拿不到正确的尺寸值。
解决方案一:修改C#端保存逻辑(推荐,兼容性最好)
直接使用BMP格式编码器输出标准BMP文件,替换原有的SaveBmp方法即可:
private static void SaveBmp(Bitmap bmp, string path) { // 直接调用Bitmap自带的Save方法输出标准BMP格式 bmp.Save(path, System.Drawing.Imaging.ImageFormat.Bmp); }
修改后输出的是标准BMP格式,与后缀匹配,Java原生API可直接识别读取。
解决方案二:不修改C#代码,Java端兼容处理
分两步处理:
- 解决JavaFX Image异步加载拿不到尺寸的问题,监听加载完成事件再读取尺寸:
if (file != null) { previousImportDir = file; // 正确的转URI方式,避免路径含特殊字符出错 Image img = new Image(file.toURI().toString()); // 等待图像加载完成再校验尺寸 img.setOnSucceeded(event -> { if (img.getWidth() > 0 && img.getHeight() > 0) { actionSetNewImageOnCanvas(img); } }); // 处理加载失败的情况 img.setOnFailed(event -> { // 自定义加载失败逻辑,比如弹出提示 }); }
- 如果JavaFX仍无法识别该TIFF格式,引入第三方TIFF解码库扩展ImageIO能力,在项目中引入TwelveMonkeys的TIFF依赖(Maven为例):
<dependency> <groupId>com.twelvemonkeys.imageio</groupId> <artifactId>imageio-tiff</artifactId> <version>3.10.1</version> </dependency>
依赖引入后可直接用ImageIO读取该文件,不需要修改后缀:
BufferedImage bufferedImage = ImageIO.read(file); if (bufferedImage != null) { int width = bufferedImage.getWidth(); int height = bufferedImage.getHeight(); // 如需转为JavaFX Image可使用SwingFXUtils转换 Image fxImage = SwingFXUtils.toFXImage(bufferedImage, null); actionSetNewImageOnCanvas(fxImage); }
内容的提问来源于stack exchange,提问作者MatheusCandido
相关产品推荐
相关产品推荐

