Projet gus05 de développement Java
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Le Deal du moment : -39%
Pack Home Cinéma Magnat Monitor : Ampli DENON ...
Voir le deal
1190 €

Ecrire un fichier BMP avec Java Advanced Imaging (JAI)

Aller en bas

Ecrire un fichier BMP avec Java Advanced Imaging (JAI) Empty Ecrire un fichier BMP avec Java Advanced Imaging (JAI)

Message  Gus Dim 26 Juin - 20:38

Le fichier BMP (Bitmap) est le format de fichier de prédilection pour stocker des images sans perte de qualité.

L'API Java Advanced Imaging permet entre autres choses d'enregistrer les images dans des fichiers BMP. Vous allez d'abord

Vous pouvez télécharger et installer les deux jars nécessaires (jai_codec.jar et jai_core.jar) à partir de l'URL suivante :
http://java.sun.com/products/java-media/jai/downloads/download-1_1_3.html

Le code source qui permet d'enregistrer un objet RenderedImage dans un fichier (objet File) est le suivant :

Code:
OutputStream os = new FileOutputStream(file);
BMPEncodeParam param = new BMPEncodeParam();
ImageEncoder enc = ImageCodec.createImageEncoder("BMP",os,param);
enc.encode(image);
os.close();

Le plus difficile est d'obtenir un objet de type RenderedImage qui soit compatible avec le format BMP, c'est à dire sans propriétés de transparence (ne possédant que au maximum 3 bandes dans son raster). Voici le code source qui permet d'obtenir un tel objet à partir de n'importe quel objet Image ou RenderedImage :

Code:
private RenderedImage toRenderedImage(Object obj) throws Exception
    {
       if(obj instanceof RenderedImage)
       {
          RenderedImage image = (RenderedImage) obj;
          if(image.getData().getNumBands()>3)
             return toBufferedImage(image);
          return image;
       }
       if(obj instanceof Image) return toBufferedImage((Image) obj);
       throw new Exception("Invalid data type: "+obj.getClass().getName());
    }
   
   
    private BufferedImage toBufferedImage(Image image)
    {
       BufferedImage buffImg = new BufferedImage(image.getWidth(null),image.getHeight(null),BufferedImage.TYPE_INT_RGB);
       buffImg.createGraphics().drawImage(image,0,0,null);
       return buffImg;
    }
   
    private BufferedImage toBufferedImage(RenderedImage image)
    {
       BufferedImage buffImg = new BufferedImage(image.getWidth(),image.getHeight(),BufferedImage.TYPE_INT_RGB);
       buffImg.createGraphics().drawRenderedImage(image,null);
       return buffImg;
    }

Voici pour finir le code source complet de l'entité gus.file.write.bmp2 qui permet d'enregistrer une image dans un fichier au format BMP (les deux objets File et Image étant passés sous la forme d'un tableau dans la méthode give)

Code:
package gus05.entity.gus.file.write.bmp2;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

import com.sun.media.jai.codec.BMPEncodeParam;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.ImageEncoder;

import gus05.framework.core.Entity;
import gus05.framework.features.Give;

public class FileWriteBmp2 implements Entity, Give {

    public String getName()         {return "gus.file.write.bmp2";}
    public String getCreationDate()      {return "2011.06.15";}


    public void give(Object obj) throws Exception
    {
       Object[] data = (Object[]) obj;
       if(data.length!=2) throw new Exception("Wrong data number: "+data.length);

       File file = (File) data[0];
       RenderedImage image = toRenderedImage(data[1]);
       
       OutputStream os = new FileOutputStream(file);
       BMPEncodeParam param = new BMPEncodeParam();
       ImageEncoder enc = ImageCodec.createImageEncoder("BMP",os,param);
       enc.encode(image);
       os.close();
    }
   
    private RenderedImage toRenderedImage(Object obj) throws Exception
    {
       if(obj instanceof RenderedImage)
       {
          RenderedImage image = (RenderedImage) obj;
          if(image.getData().getNumBands()>3)
             return toBufferedImage(image);
          return image;
       }
       if(obj instanceof Image) return toBufferedImage((Image) obj);
       throw new Exception("Invalid data type: "+obj.getClass().getName());
    }
   
    private BufferedImage toBufferedImage(Image image)
    {
       BufferedImage buffImg = new BufferedImage(image.getWidth(null),image.getHeight(null),BufferedImage.TYPE_INT_RGB);
       buffImg.createGraphics().drawImage(image,0,0,null);
       return buffImg;
    }
   
    private BufferedImage toBufferedImage(RenderedImage image)
    {
       BufferedImage buffImg = new BufferedImage(image.getWidth(),image.getHeight(),BufferedImage.TYPE_INT_RGB);
       buffImg.createGraphics().drawRenderedImage(image,null);
       return buffImg;
    }
}
Gus
Gus
Admin

Messages : 249
Date d'inscription : 01/09/2009

http://www.gus05.com

Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum