|
|
|
![]() |
|
Strumenti |
![]() |
#21 |
Member
Iscritto dal: Feb 2004
Messaggi: 67
|
Ecco un nuovo modo di convertire i colori ma che generano un errore:
The specified ColorModel is incompatible with the image SampleModel Il modo è: public class Converting_1{ public static void main (String args[]) throws IOException { BufferedInputStream inBuffer = new BufferedInputStream( new FileInputStream("C:/profili/CMYK.pf")); ICC_Profile cmykProfile = ICC_Profile.getInstance(inBuffer); ColorSpace cmykColorSpace = new ICC_ColorSpace(cmykProfile); RenderedOp image = JAI.create("fileload", "C:/a/01.jpg"); ParameterBlock pb = new ParameterBlock(); ColorModel colorModel = new ComponentColorModel(cmykColorSpace, true, image.getAsBufferedImage().isAlphaPremultiplied(), image.getColorModel().getTransparency(), image.getAsBufferedImage().getRaster().getDataBuffer().getDataType()); pb.addSource(image).add(colorModel); RenderedOp dst = JAI.create("ColorConvert", pb); JAI.create("filestore", dst, "C:/a/001.jpg", "JPEG", null); } } Dovrebbe funzionare però!!! Boh magari a qualcuno è utile (: |
![]() |
![]() |
![]() |
#22 |
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Alla fine ho provato la conversione di un jpg in rgb in un tiff cmyk.
L'immagine viene più scura, però (stando a "The Gimp") i valori "nero" non sono tutti uguali. quel jai.create è deprecato. rilancio con un esempio ai posteri. Codice:
try { BufferedInputStream inBuffer = new BufferedInputStream( new FileInputStream("Z:\\Software Downloads\\JAICMM\\CMYK.pf")); ICC_Profile cmykProfile = ICC_Profile.getInstance(inBuffer); ICC_ColorSpace cmykColorSpace = new ICC_ColorSpace(cmykProfile); BufferedImage image = ImageIO.read(new File("z:\\marmotta.jpg")); ColorConvertOp cmykConversion = new ColorConvertOp( image.getColorModel().getColorSpace(), cmykColorSpace, null); ComponentColorModel colorModel = new ComponentColorModel( cmykColorSpace, false, image.isAlphaPremultiplied(), image.getTransparency(), image.getRaster().getDataBuffer().getDataType()); BufferedImage convertedImage = cmykConversion.createCompatibleDestImage(image, colorModel); cmykConversion.filter(image, convertedImage); FileStoreDescriptor.create( convertedImage, "z:\\immagine.tiff", "tiff", null, null, null); } catch(IOException e) { System.out.println(e); } |
![]() |
![]() |
![]() |
#23 |
Member
Iscritto dal: Feb 2004
Messaggi: 67
|
Ok... allora posso abbassare la testa.
Il problema è che il nero, con questa conversione, viene perso per strada. Mi è stato detto di implementare l'inverso di uno di questi algoritmi: /* Adobe PhotoShop algorithm */ cyan = Math.min(255, cyan + black); magenta = Math.min(255, magenta + black); yellow = Math.min(255, yellow + black); rgb[0] = 255 - cyan; rgb[1] = 255 - magenta; rgb[2] = 255 - yellow; /* GNU Ghostscript algorithm */ int colors = 255 - black; rgb[0] = colors * (255 - cyan)/255; rgb[1] = colors * (255 - magenta)/255; rgb[2] = colors * (255 - yellow)/255; Sembrerebbe una kakkiata ma io non ho la più pallida idea di come fare ![]() |
![]() |
![]() |
![]() |
#24 |
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
In via del tutto teorica (bello concreto come al solito eh?
![]() In via pratica, la mia marmotta "pixel-per-pixel" mi viene grigio chiaro chiaro. Codice:
try { BufferedInputStream inBuffer = new BufferedInputStream( new FileInputStream("Z:\\Software Downloads\\JAICMM\\CMYK.pf")); ICC_Profile cmykProfile = ICC_Profile.getInstance(inBuffer); ICC_ColorSpace cmykColorSpace = new ICC_ColorSpace(cmykProfile); final BufferedImage image = ImageIO.read(new File("z:\\marmotta.jpg")); final ColorConvertOp cmykConversion = new ColorConvertOp( image.getColorModel().getColorSpace(), cmykColorSpace, null); ComponentColorModel colorModel = new ComponentColorModel( cmykColorSpace, false, image.isAlphaPremultiplied(), image.getTransparency(), image.getRaster().getDataBuffer().getDataType()); convertedImage = cmykConversion.createCompatibleDestImage(image, colorModel); WritableRaster raster = convertedImage.getRaster(); for(int i = 0; i < convertedImage.getWidth(); i++) { for(int j = 0; j < convertedImage.getHeight(); j++) { int rgb = image.getRGB(i, j); int r = (rgb >> 16) & 0xff; int g = (rgb >> 8) & 0xff; int b = rgb & 0xff; /* conversione semplice rgb cmyk K=255-(max(R,G,B)); C=((255-R)-K)/(255-K); M=((255-G)-K)/(255-K); Y=((255-B)-K)/(255-K);*/ int k = r > g ? r : g; k = k > b ? k : b; k = 255 - k; int div = 255 - k; int c = div != 0 ? ((255 -r)-k) / div : 0; int m = div != 0 ? ((255-g)-k) / div : 0; int y = div != 0 ? ((255-b)-k) / div : 0; raster.setPixel(i, j, new int[] {c,m,y,k}); } } convertedImage.setData(raster); |
![]() |
![]() |
![]() |
#25 |
Member
Iscritto dal: Feb 2004
Messaggi: 67
|
Giuro che se non dovessi sfondare come programmatore il tuo avvenire è proiettato verso la comicità!!!
La marmotta pixel per pixel è stata l'apoteosi. Ancora rido! Grazie mille ancora |
![]() |
![]() |
![]() |
#26 |
Member
Iscritto dal: Feb 2004
Messaggi: 67
|
Domanda:
Ma ci deve mettere molto? |
![]() |
![]() |
![]() |
#27 |
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Ti diro, se cerco di visualizzare l'immagine cmyk in un'etichetta, attraverso un ImageIcon, ci mette 6000 anni, se devo salvarla e basta lo fa in un paio di secondi.
Il ciclo sui pixel invece è piuttosto rapido |
![]() |
![]() |
![]() |
#28 |
Member
Iscritto dal: Feb 2004
Messaggi: 67
|
Al posto del tuo algoritmo ho utilizzato questo:
int k = r > g ? r : g; k = k > b ? k : b; k = (255-k); int c = r != 0 ? ((255-r)-k) : 255; int m = g != 0 ? ((255-g)-k) : 255; int y = b != 0 ? ((255-b)-k) : 255; e magicamente la marmotta prende colore (: Ora il problema riguarda solo l'algoritmo di conversione. Infatti con questo viene fuori un'immagine più che buona ma sempre un pò sbiadita! Purtroppo non me lo poso permettere. Conosci/ete un sito dove reperire altri algoritmi di conversione (o algoritmi veri e propri)? |
![]() |
![]() |
![]() |
#29 |
Member
Iscritto dal: Feb 2004
Messaggi: 67
|
Mi ci sono molto ( e sottolineo molto) avvicinato con questo:
int k = r < g ? r : g; k = k < b ? k : b; int div = (255-k); int c = div!=0 ? (255 - (255*r)/div) : 0; c = c < 0 ? 0 : c; int m = div!=0 ? (255 - (255*g)/div) : 0; m = m < 0 ? 0 : m; int y = div!=0 ? (255 - (255*b)/div) : 0; y = y < 0 ? 0 : y; k = r > g ? r : g; k = k > b ? k : b; k = 255-k; Però il bianco è troppo lucente! (sono fiero perchè l'ho scritto io ![]() |
![]() |
![]() |
![]() |
#30 |
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Prova a vedere se qui si capisce qualcosa
http://research.microsoft.com/~holla...olor/cmyk.html Dovrebbe essere una spiegazione sul formato cmyk |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:59.