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 :
TCL C74 Series 55C743 – TV 55” 4K QLED 144 ...
Voir le deal
499 €

Réduire les couleurs des images

Aller en bas

Réduire les couleurs des images Empty Réduire les couleurs des images

Message  Gus Ven 8 Juil - 20:37

Voici quelques entités qui réduisent de diverses manières la palette de couleur des images, basés sur l'approche du traitement point par point.

image originale :
Réduire les couleurs des images Mononoke_original

Le "clamping" : gus.image.transform.rendered.color.clamp
Il s'agit de restreindre l'intervalle des valeurs de R,G,B pour les couleurs d'une image, ce qui a pour effet de rendre le blanc un peu moins blanc et le noir un peu moins noir sans toucher aux couleurs intermédiaires. l'intervalle de [0-255] est ici réduit à [50-205]

Code:
package gus05.entity.gus.image.transform.rendered.color.clamp;

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 ImageColorClamp implements Entity, Transform {

    public String getName()            {return "gus.image.transform.rendered.color.clamp";}
    public String getCreationDate()      {return "2011.07.07";}

    public static final int GAP = 50;
   
    private Service toBufferedImage;
   
    public ImageColorClamp() 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(buildColor(c));
          g.drawRect(i,j,1,1);
       }
       g.dispose();
       return buffImg;
    }
   
    private Color buildColor(Color c)
    {
       int r = c.getRed();
       int g = c.getGreen();
       int b = c.getBlue();
      
       if(r<GAP) r=GAP;
      if(r>255-GAP) r=255-GAP;
      
      if(g<GAP) g=GAP;
      if(g>255-GAP) g=255-GAP;

      if(b<GAP) b=GAP;
      if(b>255-GAP) b=255-GAP;
      
      return new Color(r,g,b);
    }
}
Réduire les couleurs des images Mononoke_clamping

La discrétisation des couleurs : gus.image.transform.rendered.color.discretize
Il s'agit de restreindre le nombre de couleurs de l'image en approximant les couleurs par discrétisation des valeurs.

Code:
package gus05.entity.gus.image.transform.rendered.color.discretize;

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 ImageColorDiscretize implements Entity, Transform {

    public String getName()            {return "gus.image.transform.rendered.color.discretize";}
    public String getCreationDate()      {return "2011.07.07";}

    public static final int LAPSE = 50;
   
    private Service toBufferedImage;
   
    public ImageColorDiscretize() 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(buildColor(c));
          g.drawRect(i,j,1,1);
       }
       g.dispose();
       return buffImg;
    }
   
    private Color buildColor(Color c)
    {
       int r = c.getRed();
       int g = c.getGreen();
       int b = c.getBlue();
      
       r = ((r/LAPSE))*LAPSE;
      g = ((g/LAPSE))*LAPSE;
      b = ((b/LAPSE))*LAPSE;
      
      return new Color(r,g,b);
    }
}
Réduire les couleurs des images Mononoke_fewcolors

Réduction aux 8 couleurs de base : gus.image.transform.rendered.color.simplecolors
Il s'agit de restreindre les couleurs de l'image aux 8 couleurs : rouge, vert, bleu, cyan, jaune, magenta, noir, blanc.

Code:
package gus05.entity.gus.image.transform.rendered.color.simplecolors;

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 ImageColorSimpleColors implements Entity, Transform {

    public String getName()            {return "gus.image.transform.rendered.color.simplecolors";}
    public String getCreationDate()      {return "2011.07.07";}

    private Service toBufferedImage;
   
    public ImageColorSimpleColors() 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(buildColor(c));
          g.drawRect(i,j,1,1);
       }
       g.dispose();
       return buffImg;
    }
   
    private Color buildColor(Color c)
    {
       int r = c.getRed();
       int g = c.getGreen();
       int b = c.getBlue();
      
       r = r>127?255:0;
      g = g>127?255:0;
      b = b>127?255:0;
      
      return new Color(r,g,b);
    }
}
Réduire les couleurs des images Mononoke_8colors

Noir et blanc : gus.image.transform.rendered.color.blackandwhite
Il s'agit de restreindre les couleurs de l'image aux 2 seules couleurs : noir, blanc.

Code:
package gus05.entity.gus.image.transform.rendered.color.blackandwhite;

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 ImageColorBlackAndWhite implements Entity, Transform {

    public String getName()            {return "gus.image.transform.rendered.color.blackandwhite";}
    public String getCreationDate()      {return "2011.07.07";}

    public static final int RGB_BLACK = -16777216;
    public static final int RGB_WHITE = -1;
   
    private Service toBufferedImage;
   
    public ImageColorBlackAndWhite() 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();
       
       double m = (RGB_BLACK+RGB_WHITE)/2;
       
       for(int i=0;i<width;i++) for(int j=0;j<heigth;j++)
       {
          int rgb = image.getRGB(i,j);
          rgb = rgb<m?RGB_BLACK:RGB_WHITE;
          g.setColor(new Color(rgb));
          g.drawRect(i,j,1,1);
       }
       g.dispose();
       return buffImg;
    }
}
Réduire les couleurs des images Mononoke_blackwhite

Toutes ces entités ont surtout un rôle didactique pour vous montrer ce qu'il est possible de faire en manipulant les images point par point. Ces transformations s'apparentent le plus souvent à une réduction de la qualité des images lorsqu'on change leur format ou qu'on les compresse pour les rendre moins volumineuses. Ici, la transformation est voulue et le format de l'image reste inchangé...
Gus
Gus
Admin

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

http://www.gus05.com

Revenir en haut Aller en bas

Revenir en haut


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