2010-12-08 111 views
2

我有一个关于BufferedImage#getType方法的问题。当引用从文件系统PNG图像,下面的代码将打印我的Mac 和在这个JVM一个CentOS框:为什么java.awt.image.BufferedImage#getType返回不同​​的值Mac和CENTOS

Java版本 “1.6.0_03” 的Java(TM)SE运行时环境(建立1.6.0_03-B05) 的HotSpot的Java(TM)64位服务器VM(建立1.6.0_03-B05,混合模式)

import java.awt.*; 
import java.awt.geom.AffineTransform; 
import java.awt.image.BufferedImage; 
import javax.imageio.ImageIO; 
import java.io.*; 

public class ImageTypeTest { 

    public static void main(String[] args) throws Exception{ 
     BufferedImage sourceImage = ImageIO.read(new File("/path/to/png.png")); 
     System.out.println(sourceImage.getType()); 
    } 

} 

任何人都可以请一些线索,以什么可能是造成这种差异,以便我可以解决它?该代码为其他图像类型返回相同的值,例如GIF图像。

谢谢

+1

这是完全正常的。 *“解决它”*是什么意思?您可以使用所需的确切类型实例化自己的BufferedImage,并复制您在BufferedImage中读取的图像。 AFAIK你不能强制ImageIO.read直接创建你想要的BufferedImage类型。还要注意,强制自己的BufferedImage类型可能会导致在您定位的各种平台上处理所述图像时的次优性能。 – SyntaxT3rr0r 2010-12-08 20:28:26

+0

您好Webinator,我明白这是正常的;问题是,原因是什么?为什么在不同的操作系统中为同一图像获取不同的图像类型?这就是我不明白,如果它是相同的图像文件,他们为什么会不同?感谢您的回复。 – Ytsejammer 2010-12-08 21:10:14

回答

2

的原因不同的是,OS X和CentOS的Java实现使用不同的底层库来解析PNG图像 - 这他们允许,因为没有什么ImageIO在合同要求它产生一个特定的图像类型。

如果你想有一个一致的(和快速绘制)图像,做最好的办法是使用下面的代码将图像转换成颜色空间正在使用的显示系统:

GraphicsConfiguration config = new JFrame().getGraphicsConfiguration(); 
// Or better, use your main GUI component instead of new JFrame() 
BufferedImage fixedImg = config.createCompatibleImage(img.getWidth(), img.getHeight(), Transparency.TRANSLUCENT); 
Graphics2D fig = fixedImg.createGraphics(); 
fig.drawImage(img, 0, 0, null); 
fig.dispose(); 
fixedImg.flush(); 
相关问题