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

vendredi 22 octobre 2010

Deux liste de données avec seam

Pour gérer une ou plusieurs liste de données vous n'êtes pas obligé d'utiliser un EJB, vous pouvez utiliser un Composant Seam simple.

Un composant Seam est moins lourd en terme de mémoire, de performances et de consommation des ressources .
Le but de cet exemple est d'afficher deux liste de données dans une page JSF pour se faire nous utilisons les annontation Seam :

@DataModel : Ici on annote la liste @DataModel (Annotation Seam) c'est elle qui va être notre modèle de données. l'annotation renvoie à jsf une liste à la page jsf. Ce qui permet d'utiliser la liste dans une interface jsf.


@DataModelSelection
 : l'annotation Seam  qui permet de lier la ligne sélectionnée sur la page web à un objet java. L'annotation @DataModelSelection dit à seam d'injecter l'élément de liste qui correspond à la ligne cliquée.

@Factory :  Une annotation magique de Seam : le @Factory explique à Seam de créer une instance de la liste puis d'invoquer la méthode  pour initialiser l'objet dans la view

samedi 2 octobre 2010

Etude comparatif entre les framworks de présentation JEE

Voir le nombre important de Framework destinés aux développements de la couche présentation, le choix d’une solution se base sur les principales fonctionnalités et besoins et ressources (qualité, interopérabilité, évolutive ainsi que le temps de production de maquettes de la charte graphique et la présentation des interfaces attractives). Les plus connus dans la communauté freeware sont JSF-Richfaces, Spring MVC, Struts, GWT, WICKET, FLEX .


 
WICKET

Wicket est un framework à base de composants, à l'inverse des frameworks MVC traditionnels à base d'actions, comme Apache Struts ou Spring MVC par exemple.

Avantages : 

  • Utilise exclusivement les pages XHTML comme technologie de présentation. De plus, il n'y a aucune logique à écrire directement dans les pages XHTML.
  • Wicket permet de séparer l’HTML et le code Java.
  • Véritable séparation entre la partie cliente et la partie serveur.
  • Pas de fichier de configuration : une classe définie dans le web.xml sert de point d’entrée Pas de configuration complexe (XML).
  • Navigation entre les pages définies en Java.
Limites

  • Wicket stocke beaucoup d’informations en session et il est donc trop lourd pour gérer plusieurs centaine d’utilisateurs simultanés. 
  • A l’usage, on se rend compte que l’intégration manuelle avec le JavaScript n’est pas évidente. Toujours ces histoires d’Id générés qui rendent plus compliqué un framework orienté Composants.

GWT Google Web Toolkit


L’outil de Google est dédié à la présentation. « Il permet de coder 5 fois plus vite la couche graphique Web de son application ». GWT repose sur un modèle en composant. Par exemple, il dispose d’objets Champ texte, Tableau… Chacun de ces composants supporte les CSS et est donc potentiellement skinnable.

Avantages :
  • Côté intégration à un modèle de page, il n’y aurait aucun souci. Il suffit de partir du HTML et d’appliquer les styles au composant GWT
Limites :
  • Manque guidé de bonnes pratiques et de la documentation en général.
  • Il n’y a que des composants graphiques « simples ». Si l’on veut utiliser des composants plus évolués, il faut soit les coder ou bien se tourner vers des librairies de widgets GWT Open Source « non Google » (avantage : elles offre des composant telle que agenda facile à intégrer).

JSF Java Server Faces

Java Server Faces est un Framework pour la conception d'interfaces graphiques Web en Java.
JSF s'attache donc à :
  • Faciliter l'écriture d'interface à partir d'une bibliothèque de contrôles.
  • Gérer automatiquement l'état HTTP entre client et serveur (en cas de Postback par exemple)
  • Fournir un modèle simple pour la gestion des évènements coté client et coté serveur
  • Autoriser les créations ou l'enrichissement de composants graphiques utilisateur (custom)