为什么 java.awt.image.BufferedImage#getType 返回不同的值 Mac 和 Mac中央操作系统

发布于 2024-10-06 21:03:15 字数 855 浏览 5 评论 0原文

我有一个关于 BufferedImage#getType 方法。当从文件系统引用 PNG 图像时,以下代码将使用此 JVM 在我的 Mac 中打印 5 并在 CENTOS 机器中打印 0

java version "1.6.0_03" Java(TM) SE 运行时环境(版本 1.6.0_03-b05) Java HotSpot(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 图像)返回相同的值。

谢谢

I have a question about the BufferedImage#getType method. When referencing a PNG image from the file system, the following code will print 5 in my Mac and 0 in a CENTOS box with this JVM:

java version "1.6.0_03"
Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
Java HotSpot(TM) 64-Bit Server VM (build 1.6.0_03-b05, mixed mode)

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());
   }

}

Can anyone please shed some light as to what might be causing this difference so that I can work around it? The code returns the same values for other image types, say GIF images.

Thank you

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

御守 2024-10-13 21:03:15

造成差异的原因是 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();

The reason for the difference is that the Java implementations in OS X and CENTOS use different underlying libraries to parse the PNG image - which they're allowed to, as there is nothing in ImageIO's contract requiring it to produce a particular image type.

If you want to have a consistent (and fast to draw) image, the best thing to do is to use the following code to convert the image into the colour space being used by the display system:

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();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文