Código para testear cómo van a quedar las imágenes generadas en processing después de aplicar un perfil de color ICC, tipicamente util para preveer las diferencias entre lo que se ve en la pantalla y en la impresión.
Ver más sobre la clase ICC_ColorSpace de Java, o sobre ICC

Este ejemplo solo funciona con pefiles de “salida” (impresoras, plotters) y no de entrada (scanners.) ni de display.

Los updates van a ir acá eventualmente: https://gist.github.com/gcorallo/7107014

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/*
ICC Profiles for PImage in Processing.
Press spacebar to switch between default and loaded profile (first time takes a while...)
*/
import java.awt.color.ColorSpace;
import java.awt.color.ICC_Profile;
import java.awt.color.ICC_ColorSpace;
import java.awt.image.ColorConvertOp;
 
import java.io.FileInputStream;
 
PImage img, img2;
boolean showICC=false;
 
ICC_Profile icc1;
 
ColorConvertOp op1;
 
ColorSpace cs=null;
 
void setup() {
 
  size(800, 450);  
  img=loadImage("img.jpg");
 
  //only works for "output" profiles (ie: printer profiles)
  //http://docs.oracle.com/javase/7/docs/api/java/awt/color/ICC_ColorSpace.html
 
  //String profilePath="/Library/ColorSync/Profiles/550 Megaphoto Frontier FF 23072012.icc";
  String profilePath=dataPath("hp_pspro_b8800_ilford_galerie_classic_gloss.icc");
 
  try {
 
    ICC_Profile icc1=ICC_Profile.getInstance(new
      FileInputStream(profilePath));
 
    println("iccType: "+icc1.getColorSpaceType() );
    //color space types:
    // http://dcs.oracle.com/javase/6/docs/api/constant-values.html#java.awt.color.ColorSpace.TYPE_XYZ
 
    cs=new ICC_ColorSpace(icc1);
 
  }
  catch(IOException e) {
    println(e);
  }
 
  op1 = new ColorConvertOp(cs, null);
}
 
void draw() {
  background(0);
 
  if (!showICC) {
    image(img, 0, 0, img.width, img.height);
  }
  else {
 
    if (img2==null) {
      println("applying icc profile");
      java.awt.image.BufferedImage result = op1.filter( (java.awt.image.BufferedImage)img.getImage(), null );
 
      try {
 
        img2=new PImage(result.getWidth(), result.getHeight(), PConstants.RGB);
 
        result.getRGB(0, 0, img2.width, img2.height, img2.pixels, 0, img2.width);
 
        img2.updatePixels();
      }
      catch(Exception e) {
        e.printStackTrace();
      }
 
      println("icc profile ready");
    }
    else {
      image(img2, 0, 0, img2.width, img2.height);
    }
  }
}
 
void keyPressed() {
  if (key==' ') {
    showICC=!showICC;
  }
}