Traitement des images point par point
Projet gus05 de développement Java :: Chantiers :: Chantiers techniques :: Traitement des données :: Traitements sur les images
Page 1 sur 1
Traitement des images point par point
J'utilise deux approches pour traiter les images :
C'est cette deuxième option que je vais vous montrer dans ce post.
Tout d'abord il est nécessaire de mettre l'image sous la forme standardisée de BufferedImage de type TYPE_INT_RGB (image RBG 8 bits). Voici l'entité de transformation que j'ai crée à cet effet :
gus.image.convert.tobufferedimage
Une fois qu'on a notre objet BufferedImage, il ne reste plus qu'à parcourir chacun de ces points dans une double boucle comme dans la méthode transform ci-dessous :
public Object transform(Object obj) throws Exception
{
BufferedImage image = (BufferedImage) toBufferedImage.transform(obj);
int width = image.getWidth();
int heigth = image.getHeight();
BufferedImage buffImg = new BufferedImage(image.getWidth(null),image.getHeight(null),BufferedImage.TYPE_INT_RGB);
Graphics2D g = buffImg.createGraphics();
for(int i=0;i<width;i++) for(int j=0;j<heigth;j++)
{
int rgb = image.getRGB(i,j);
Color c = new Color(rgb);
// on modifie la couleur du point ici....
g.setColor(c);
g.drawRect(i,j,1,1);
}
g.dispose();
return buffImg;
}
Voici deux exemples simples d'utilisation de cette technique pour assombrir ou éclaircir une image.
Image d'origine :
gus.image.transform.rendered.color.darker
gus.image.transform.rendered.color.brighter
Bien sûr la plupart des traitements possibles sont déjà prévus dans l'API JAI mais cette approche bien que peu performante permet vraiment de personnaliser les traitements d'une manière extrêmement fine si nécessaire. Personnellement, j'y ai recours sans doute trop souvent mais l'essentiel est de mettre en place des entités de traitement opérationnelles quitte à les remplacer plus tard par d'autres plus performantes.
- soit j'utilise les fonctionnalités de l'API JAI (Java Advanced Imaging).
- soit je parcours chaque point de l'image dans une double boucle pour les traiter un à un.
C'est cette deuxième option que je vais vous montrer dans ce post.
Tout d'abord il est nécessaire de mettre l'image sous la forme standardisée de BufferedImage de type TYPE_INT_RGB (image RBG 8 bits). Voici l'entité de transformation que j'ai crée à cet effet :
gus.image.convert.tobufferedimage
- Code:
package gus05.entity.gus.image.convert.tobufferedimage;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import javax.swing.Icon;
import gus05.framework.core.Entity;
import gus05.framework.features.Transform;
public class ToBufferedImage implements Entity, Transform {
public String getName() {return "gus.image.convert.tobufferedimage";}
public String getCreationDate() {return "2011.07.07";}
public Object transform(Object obj) throws Exception
{
if(obj instanceof BufferedImage) return (BufferedImage) obj;
if(obj instanceof RenderedImage) return toBufferedImage((RenderedImage) obj);
if(obj instanceof Image) return toBufferedImage((Image) obj);
if(obj instanceof Icon) return toBufferedImage((Icon) 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);
Graphics2D g = buffImg.createGraphics();
g.drawImage(image,0,0,null);
g.dispose();
return buffImg;
}
private BufferedImage toBufferedImage(RenderedImage image)
{
BufferedImage buffImg = new BufferedImage(image.getWidth(),image.getHeight(),BufferedImage.TYPE_INT_RGB);
Graphics2D g = buffImg.createGraphics();
g.drawRenderedImage(image,AffineTransform.getTranslateInstance(0,0));
g.dispose();
return buffImg;
}
private BufferedImage toBufferedImage(Icon icon)
{
BufferedImage buffImg = new BufferedImage(icon.getIconWidth(),icon.getIconHeight(),BufferedImage.TYPE_INT_RGB);
Graphics2D g = buffImg.createGraphics();
icon.paintIcon(null,g,0,0);
g.dispose();
return buffImg;
}
}
Une fois qu'on a notre objet BufferedImage, il ne reste plus qu'à parcourir chacun de ces points dans une double boucle comme dans la méthode transform ci-dessous :
public Object transform(Object obj) throws Exception
{
BufferedImage image = (BufferedImage) toBufferedImage.transform(obj);
int width = image.getWidth();
int heigth = image.getHeight();
BufferedImage buffImg = new BufferedImage(image.getWidth(null),image.getHeight(null),BufferedImage.TYPE_INT_RGB);
Graphics2D g = buffImg.createGraphics();
for(int i=0;i<width;i++) for(int j=0;j<heigth;j++)
{
int rgb = image.getRGB(i,j);
Color c = new Color(rgb);
// on modifie la couleur du point ici....
g.setColor(c);
g.drawRect(i,j,1,1);
}
g.dispose();
return buffImg;
}
Voici deux exemples simples d'utilisation de cette technique pour assombrir ou éclaircir une image.
Image d'origine :
gus.image.transform.rendered.color.darker
- Code:
package gus05.entity.gus.image.transform.rendered.color.darker;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import gus05.framework.core.Entity;
import gus05.framework.core.Outside;
import gus05.framework.core.Service;
import gus05.framework.features.Transform;
public class ImageColorDarker implements Entity, Transform {
public String getName() {return "gus.image.transform.rendered.color.darker";}
public String getCreationDate() {return "2011.07.07";}
private Service toBufferedImage;
public ImageColorDarker() throws Exception
{toBufferedImage = Outside.service(this,"gus.image.convert.tobufferedimage");}
public Object transform(Object obj) throws Exception
{
BufferedImage image = (BufferedImage) toBufferedImage.transform(obj);
int width = image.getWidth();
int heigth = image.getHeight();
BufferedImage buffImg = new BufferedImage(image.getWidth(null),image.getHeight(null),BufferedImage.TYPE_INT_RGB);
Graphics2D g = buffImg.createGraphics();
for(int i=0;i<width;i++) for(int j=0;j<heigth;j++)
{
int rgb = image.getRGB(i,j);
Color c = new Color(rgb);
g.setColor(c.darker());
g.drawRect(i,j,1,1);
}
g.dispose();
return buffImg;
}
}
gus.image.transform.rendered.color.brighter
- Code:
package gus05.entity.gus.image.transform.rendered.color.brighter;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import gus05.framework.core.Entity;
import gus05.framework.core.Outside;
import gus05.framework.core.Service;
import gus05.framework.features.Transform;
public class ImageColorBrighter implements Entity, Transform {
public String getName() {return "gus.image.transform.rendered.color.brighter";}
public String getCreationDate() {return "2011.07.07";}
private Service toBufferedImage;
public ImageColorBrighter() throws Exception
{toBufferedImage = Outside.service(this,"gus.image.convert.tobufferedimage");}
public Object transform(Object obj) throws Exception
{
BufferedImage image = (BufferedImage) toBufferedImage.transform(obj);
int width = image.getWidth();
int heigth = image.getHeight();
BufferedImage buffImg = new BufferedImage(image.getWidth(null),image.getHeight(null),BufferedImage.TYPE_INT_RGB);
Graphics2D g = buffImg.createGraphics();
for(int i=0;i<width;i++) for(int j=0;j<heigth;j++)
{
int rgb = image.getRGB(i,j);
Color c = new Color(rgb);
g.setColor(c.brighter());
g.drawRect(i,j,1,1);
}
g.dispose();
return buffImg;
}
}
Bien sûr la plupart des traitements possibles sont déjà prévus dans l'API JAI mais cette approche bien que peu performante permet vraiment de personnaliser les traitements d'une manière extrêmement fine si nécessaire. Personnellement, j'y ai recours sans doute trop souvent mais l'essentiel est de mettre en place des entités de traitement opérationnelles quitte à les remplacer plus tard par d'autres plus performantes.
Sujets similaires
» Transposition d'images
» Colorisation des images
» Flouter les images
» Créer un PDF à partir d'images
» Réduire les couleurs des images
» Colorisation des images
» Flouter les images
» Créer un PDF à partir d'images
» Réduire les couleurs des images
Projet gus05 de développement Java :: Chantiers :: Chantiers techniques :: Traitement des données :: Traitements sur les images
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|
Mar 16 Sep - 12:01 par Gus
» Présentation du jeu Vindinium
Jeu 20 Fév - 15:32 par Gus
» Rechercher la cible la plus proche avec le "Breadth First Search"
Jeu 20 Fév - 13:06 par Gus
» Impression d'écran avec sélection de zone
Jeu 20 Fév - 12:12 par Gus
» Envoyer un mail par un compte Gmail
Jeu 25 Avr - 14:04 par Gus
» Streaming : comment télécharger les vidéos
Lun 4 Fév - 19:59 par Gus
» Synology : installer ipkg
Mar 22 Jan - 21:22 par Gus
» Trouver le type de lecteur avec JNA
Mer 9 Jan - 23:11 par Gus
» Adresse ip publique et adresse ip privée, Internet box et UPnP
Mer 9 Jan - 21:02 par Gus
» Accéder au numéro de série du lecteur par un script vb
Mer 9 Jan - 19:31 par Gus