vendredi 18 février 2011

Convertire une image en byte et byte [] vers image

Il existe déjà des milliers d'exemple sur internet sur comment convertire
une image vers un tableau des byte [] en java et vis versa, récement j'ai eu l'occasion de travailer sur un petit projet qui  m'oblige a convertire une image vers un tableau de bytes, stocker dans une base des données et de récuperer l'image par la suite.

Ma recherche sur internet n'etait pas satisfaisante vu que j'arrive pa
a convertire les images de n'importe types gif, tiff, jpeg, jpg, png ...

Le but de cette article est donc de présenter et expliquer
comment on converti tous type d'images vers un tableau de bytes en java ..

On commence par créer une classe Utils avec des methodes
static

Premiere methode : convertire une image vers un tableau de bytes byte [] prend comme paramétre le chemin d'image à convertire


public static byte [] ImageToByte(File filePath) throw FileNotFoundException{
 

FileInputStream fis = new FileInputStream(filePath);
ByteArrayOutputStream bos = new ByteArrayOutputStream();

byte[] buf = new byte[1024];
      
try {

for (int readNum; (readNum = fis.read(buf)) != -1;) {
bos.write(buf, 0, readNum);
System.out.println("read " + readNum + " bytes,");
}
} catch (IOException ex) {

    
}

    byte[] bytes = bos.toByteArray();
  
    return bytes;   


    }

Pour la deuxiéme méthode : convertire un tableau de bytes byte[] vers une image ici la format de l'image et JPEG vous pouvez la changer de votre choix

imageFile : chemin vers le path destination

bytes : le tableau des byte [] a convertire

public static void byteToImage(byte [] bytes,File imageFile) throws IOException{

ByteArrayInputStream bis =new ByteArrayInputStream(bytes);
Iterator<?> readers =ImageIO.getImageReadersByFormatName("jpeg");
ImageReader reader =(ImageReader) readers.next();
Object source = bis;
ImageInputStream iis =ImageIO.createImageInputStream(source);
reader.setInput(iis, true);
ImageReadParam param =reader.getDefaultReadParam();
Image image = reader.read(0,param);
BufferedImage bufferedImage= new BufferedImage(image.getWidth(null), image.getHeight(null),BufferedImage.TYPE_INT_RGB);
Graphics2D g2 =bufferedImage.createGraphics();
g2.drawImage(image, null,null);
ImageIO.write(bufferedImage,"jpeg", imageFile);
System.out.println(imageFile.getPath());
    }



Notre Class Utils :

import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Iterator;
import java.util.logging.Level;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;

public class Utils {

public static byte [] ImageToByte(File filePath) throws FileNotFoundException{

FileInputStream fis = new FileInputStream(filePath);
ByteArrayOutputStream bos =new ByteArrayOutputStream();
byte[] buf = new byte[1024];
try {

for (int readNum; (readNum = fis.read(buf)) != -1;) {
bos.write(buf, 0, readNum);
System.out.println("read " + readNum + " bytes,");
            }
        } catch (IOException ex) {
}
byte[] bytes =bos.toByteArray();
       
return bytes;
    }

public static void byteToImage(byte [] bytes,File imageFile) throws IOException{

ByteArrayInputStream bis =new ByteArrayInputStream(bytes);
Iterator<?> readers =ImageIO.getImageReadersByFormatName("jpeg");
ImageReader reader =(ImageReader) readers.next();
Object source = bis;
ImageInputStream iis =ImageIO.createImageInputStream(source);
reader.setInput(iis, true);
ImageReadParam param =reader.getDefaultReadParam();
Image image = reader.read(0,param);
BufferedImage bufferedImage= new BufferedImage(image.getWidth(null),image.getHeight(null),BufferedImage.TYPE_INT_RGB);
Graphics2D g2 =bufferedImage.createGraphics();
g2.drawImage(image, null,null);
ImageIO.write(bufferedImage,"jpeg", imageFile);
System.out.println(imageFile.getPath());
    }

}

Et enfin une petite Class de test

    public static void main(String[] args) throws FileNotFoundException, IOException {

    try {

        
byte [] bytes = Utils.ImageToByte(new File("c:/chemin_source/fileSource.png"));
     
 

Utils.byteToImage(bytes,new File("c:/chemin_destination/fileDestination.jpeg"));
      
} catch (Exception e) {

        e.printStackTrace();

    }
  }     

}

Dans un autre article je vous explique comment afficher une image converti en byte dans une page web

1 commentaire:

  1. je suis debutante en java, et g essayé de compiler la 1ere partie ( image to byteArray) et son test avec eclipse mais ça fonctionne pas, on me renvoi :
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.(Unknown Source)
    est ce que vs pouvez m'aider svp ?? :(

    RépondreSupprimer