Почему java.awt.image.BufferedImage # getType возвращает другое значение Mac & CENTOS - PullRequest
2 голосов
/ 08 декабря 2010

У меня вопрос по поводу метода BufferedImage # getType .При ссылке на изображение PNG из файловой системы следующий код напечатает 5 на моем Mac и 0 в окне CENTOS с этой JVM:

java version "1.6.0_03 "Java (TM) SE Runtime Environment (сборка 1.6.0_03-b05) Java HotSpot (TM) 64-разрядная серверная виртуальная машина (сборка 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 Ответ

2 голосов
/ 09 декабря 2010

Причина различия заключается в том, что реализации Java в OS X и CENTOS используют разные базовые библиотеки для анализа изображения 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();
...