Teinte rose / rougeâtre lors du redimensionnement des images jpeg à l'aide de java thumbnailator ou imgscalr


J'essaie de convertir une image (URL ci-dessous) en utilisant deux bibliothèques (thumbnailator et imgscalr. Mon code fonctionne sur la plupart des images sauf quelques-unes qui, après la conversion, ont une teinte rose/rougeâtre.

J'essaie de comprendre la cause et j'accueillerais favorablement toute recommandation.

Note - Le type d'image de cette image est 5 c'est-à-dire BufferedImage.TYPE_3BYTE_BGR et j'utilise Java 7

entrez la description de l'image icientrez la description de l'image ici

En utilisant Thumbnailator

  Thumbnails.of(fromDir.listFiles())                
                    .size(thumbnailWidth, thumbnailHeight)
                    .toFiles(Rename.SUFFIX_HYPHEN_THUMBNAIL);

En utilisant imgscalr

    BufferedImage bufferedImage = ImageIO.read(file);
    final BufferedImage jpgImage;

    LOG.debug("image type is =[{}] ", bufferedImage.getType());

     BufferedImage scaledImg = Scalr.resize(bufferedImage, Method.ULTRA_QUALITY, thumbnailWidth, thumbnailHeight, Scalr.OP_ANTIALIAS);


    File thumbnailFile = new File(fromDirPath + "/" + getFileName(file.getName()) +THUMBNAIL_KEYWORD  + ".png");

    ImageIO.write(scaledImg, getFileExtension(file.getName()), thumbnailFile);

    bufferedImage.flush();
    scaledImg.flush();
Author: rohtakdev, 2014-09-30

2 answers

Je reçois beaucoup cette question (auteur de imgscalr) the le problème est presque toujours que vous lisez/écrivez différents formats de fichiers et que le canal ALPHA provoque l'élimination de l'un de vos canaux de couleur (R/G/B) du fichier résultant.

Par exemple, si vous lisez dans un fichier ARGB (4 canaux) et que vous l'écrivez en JPG (3 canaux) - à moins que vous manipuliez délibérément les types d'image vous-même et que vous rendiez directement l'ancienne image à la nouvelle, vous obtiendrez un fichier avec un canaux "ARG"... ou plus précisément, juste Rouge et Vert-pas de bleu.

PNG prend en charge un canal alpha et JPG ne le fait pas, alors soyez conscient de cela.

La façon de résoudre ce problème est de créer délibérément des BufferedImage appropriés du bon type (RGB, ARGB, etc.) et en utilisant l'appel destImage.getGraphics() pour rendre une image à l'autre avant de l'écrire sur le disque et de la ré-encoder.

Sun et Oracle n'ont JAMAIS rendu les bibliothèques ImageIO suffisamment intelligentes pour détecter les bibliothèques non prises en charge canaux lors de l'écriture dans différents types de fichiers, donc ce comportement se produit tout le temps: (

J'espère que ça aide!

 6
Author: Riyad Kalla, 2015-04-07 08:37:42

Le morceau de code suivant a résolu mon problème:

ByteArrayOutputStream baos = new ByteArrayOutputStream();

  Thumbnails.of(new ByteArrayInputStream(imageByteArray))
    .outputFormat("jpg")
    .size(200, 200)
    .toOutputStream(outputStream);

  return baos.toByteArray();

J'utilise Thumbnailator et le code a été posté ici: https://github.com/coobird/thumbnailator/issues/23

 1
Author: md. ariful ahsan, 2016-11-14 08:42:59