2010-01-12 4 views
1

J'utilise Java AWT pour mettre à l'échelle une image JPEG, pour créer des vignettes. Le code fonctionne correctement lorsque l'image a un facteur d'échantillonnage normal (2x2,1x1,1x1)Comment mettre à l'échelle les images JPEG avec un facteur d'échantillonnage non standard en Java?

Cependant, une image qui a ce facteur d'échantillonnage (1x1, 1x1, 1x1) crée un problème lors de la mise à l'échelle. Les couleurs sont corrompues bien que les caractéristiques soient reconnaissables.

Le original et la vignette: alt text http://otherplace.in/thumb1.jpg

Le code que je utilise est à peu près équivalent à:

static BufferedImage awtScaleImage(BufferedImage image, 
            int maxSize, int hint) { 
    // We use AWT Image scaling because it has far superior quality 
    // compared to JAI scaling. It also performs better (speed)! 
    System.out.println("AWT Scaling image to: " + maxSize); 
    int w = image.getWidth(); 
    int h = image.getHeight(); 
    float scaleFactor = 1.0f; 
    if (w > h) 
     scaleFactor = ((float) maxSize/(float) w); 
    else 
     scaleFactor = ((float) maxSize/(float) h); 
    w = (int)(w * scaleFactor); 
    h = (int)(h * scaleFactor); 
    // since this code can run both headless and in a graphics context 
    // we will just create a standard rgb image here and take the 
    // performance hit in a non-compatible image format if any 
    Image i = image.getScaledInstance(w, h, hint); 
    image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
    Graphics2D g = image.createGraphics(); 
    g.drawImage(i, null, null); 
    g.dispose(); 
    i.flush(); 
    return image; 
} 

(code avec la permission de this page)

Y at-il une meilleure façon de faire ce?

Voici un test image avec un facteur d'échantillonnage de [1x1, 1x1, 1x1].

+0

J'ai vu cet effet en utilisant 'ImageIO' pour encoder une image * translucide * au format JPEG, mais je ne pense pas que cela s'applique à votre exemple car votre image de sortie est opaque (' TYPE_INT_RGB'). l'échantillon est-il complet ou y a-t-il un autre post-traitement appliqué à l'image? Il est possible de créer une image translucide sans le vouloir (par exemple 'AffineTransformOp' avec' TYPE_BILINEAR' va ajouter un canal alpha à l'anti-alias le bord de l'image résultante au cas où il ne se trouve pas sur une limite de pixel exacte.) – finnw

Répondre

2

Je crois que le problème n'est pas la mise à l'échelle, mais l'utilisation d'un modèle de couleur incompatible ("type d'image") lors de la construction de votre image buffered.

Créer des vignettes décent en Java est étonnamment difficile. Voici un detailed discussion.

+0

J'ai lu cette discussion et j'utilise certaines de ces techniques pour une mise à l'échelle plus rapide. Mais ne semble pas pertinent à mon problème. Mais oui, le modèle de couleur incompatible est un suspect possible au stade de la charge d'image. J'utilise 'javax.imageio.ImageIO.read' pour charger l'image dans la mémoire. Peut-être ne supporte-t-il pas les facteurs d'échantillonnage anormaux. – HRJ

Questions connexes