2010-12-08 5 views
2

J'ai une question à propos de la méthode BufferedImage#getType. Lorsque vous faites référence une image PNG à partir du système de fichiers, le code suivant imprimera dans mon Mac et dans une boîte CentOS avec cette machine virtuelle Java:Pourquoi java.awt.image.BufferedImage # getType renvoie une valeur différente Mac & CENTOS

java version "1.6.0_03" Java (TM) SE Runtime Environment (build 1.6.0_03-b05) Java HotSpot (TM) 64 bits serveur VM (build 1.6.0_03-b05, mode mixte)

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

} 

quelqu'un peut-il s'il vous plaît faire la lumière sur ce qui pourrait être provoquant cette différence afin que je puisse travailler autour d'elle? Le code renvoie les mêmes valeurs pour les autres types d'images, par exemple les images GIF.

Merci

+1

c'est totalement normal. Que voulez-vous dire par «travailler autour de lui» *? Vous pouvez instancier votre propre BufferedImage avec le type exact que vous voulez et copier l'image que vous avez lue dans ce BufferedImage. AFAIK vous ne pouvez pas forcer ImageIO.read à créer directement le type BufferedImage souhaité. Notez également que forcer votre propre type BufferedImage entraînera probablement des performances sous-optimales lorsque vous manipulerez l'image sur les différentes plates-formes que vous ciblez. – SyntaxT3rr0r

+0

Bonjour Webinator, je comprends que c'est normal; la question est, quelle est la cause? Pourquoi ai-je différents types d'images pour la même image dans les différents systèmes d'exploitation? C'est ce que je ne comprends pas, pourquoi seraient-ils différents si c'est le même fichier image? Merci pour votre réponse. – Ytsejammer

Répondre

2

La raison de la différence est que les implémentations Java dans OS X et CentOS utilisent différentes bibliothèques sous-jacentes pour analyser l'image PNG - qu'ils sont autorisés à, comme il n'y a rien dans le contrat de ImageIO exigeant pour produire un type d'image particulier.

Si vous voulez avoir une image cohérente (et rapide à tirer), la meilleure chose à faire est d'utiliser le code suivant pour convertir l'image en l'espace de couleur utilisé par le système d'affichage:

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(); 
+0

Salut Zarkonnnen. J'apprécie vraiment ta réponse. Parce que mon code s'exécutera dans un environnement de serveur «sans tête», j'ai fini par utiliser la configuration graphique d'une autre image lue par ImageIO.read() comme ceci: sourceImage.createGraphics(). GetDeviceConfiguration(); Merci encore – Ytsejammer

Questions connexes