2008-08-22 18 views
8

Tengo una necesidad de convertir las imágenes de CMYK al RGB - no necesariamente volver de nuevo, pero bueno, si se puede hacer ...¿Cómo convierto imágenes entre CMYK y RGB en ColdFusion (Java)?

Con el lanzamiento de ColdFusion 8, que tiene la etiqueta CFImage, pero doesn No soporto esta conversión; y tampoco lo hace Image.cfc, o Alagad's Image Component.

Sin embargo, debería ser posible en Java; que podemos aprovechar a través de CF. Por ejemplo, aquí es cómo se puede crear un hilo de Java para dormir un proceso:

<cfset jthread = createObject("java", "java.lang.Thread")/> 
<cfset jthread.sleep(5000)/> 

Conjeturaría un método similar podría utilizarse para apalancar Java para hacer esta conversión de la imagen, pero no ser un desarrollador de Java, que Don Tengo una pista por dónde empezar. ¿Alguien puede ayudar aquí?

+0

Este ejemplo tendrá valores entre 0 y 255^2. Por lo tanto, no es un ejemplo correcto de conversión. –

Respuesta

5

utilizo las bibliotecas de Java (ImageIO https://jai-imageio.dev.java.net). No son perfectos, pero pueden ser simples y terminar el trabajo. En cuanto a la conversión de CMYK a RGB, aquí está lo mejor que he podido encontrar.

Descargue e instale los archivos JAR de ImageIO y las bibliotecas nativas para su plataforma. Las bibliotecas nativas son esenciales. Sin ellos, los archivos ImageIO JAR no podrán detectar las imágenes CMYK. Originalmente, tenía la impresión de que las bibliotecas nativas mejorarían el rendimiento pero no eran necesarias para ninguna funcionalidad. Estaba equivocado.

La única otra cosa que noté es que las imágenes RGB convertidas son a veces mucho más livianas que las imágenes CMYK. Si alguien sabe cómo resolver ese problema, lo agradecería.

A continuación se muestra un código para convertir una imagen CMYK en una imagen RGB de cualquier formato compatible.

Gracias,
Randy Stegbauer

package cmyk; 

import java.awt.color.ColorSpace; 
import java.awt.image.BufferedImage; 
import java.awt.image.ColorConvertOp; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 

import org.apache.commons.lang.StringUtils; 

public class Main 
{ 

    /** 
    * Creates new RGB images from all the CMYK images passed 
    * in on the command line. 
    * The new filename generated is, for example "GIF_original_filename.gif". 
    * 
    */ 
    public static void main(String[] args) 
    { 
     for (int ii = 0; ii < args.length; ii++) 
     { 
      String filename = args[ii]; 
      boolean cmyk = isCMYK(filename); 
      System.out.println(cmyk + ": " + filename); 
      if (cmyk) 
      { 
       try 
       { 
        String rgbFile = cmyk2rgb(filename); 
        System.out.println(isCMYK(rgbFile) + ": " + rgbFile); 
       } 
       catch (IOException e) 
       { 
        System.out.println(e.getMessage()); 
       } 
      } 
     } 
    } 

    /** 
    * If 'filename' is a CMYK file, then convert the image into RGB, 
    * store it into a JPEG file, and return the new filename. 
    * 
    * @param filename 
    */ 
    private static String cmyk2rgb(String filename) throws IOException 
    { 
     // Change this format into any ImageIO supported format. 
     String format = "gif"; 
     File imageFile = new File(filename); 
     String rgbFilename = filename; 
     BufferedImage image = ImageIO.read(imageFile); 
     if (image != null) 
     { 
      int colorSpaceType = image.getColorModel().getColorSpace().getType(); 
      if (colorSpaceType == ColorSpace.TYPE_CMYK) 
      { 
       BufferedImage rgbImage = 
        new BufferedImage(
         image.getWidth(), image.getHeight(), BufferedImage.TYPE_3BYTE_BGR); 
       ColorConvertOp op = new ColorConvertOp(null); 
       op.filter(image, rgbImage); 

       rgbFilename = changeExtension(imageFile.getName(), format); 
       rgbFilename = new File(imageFile.getParent(), format + "_" + rgbFilename).getPath(); 
       ImageIO.write(rgbImage, format, new File(rgbFilename)); 
      } 
     } 
     return rgbFilename; 
    } 

    /** 
    * Change the extension of 'filename' to 'newExtension'. 
    * 
    * @param filename 
    * @param newExtension 
    * @return filename with new extension 
    */ 
    private static String changeExtension(String filename, String newExtension) 
    { 
     String result = filename; 
     if (filename != null && newExtension != null && newExtension.length() != 0); 
     { 
      int dot = filename.lastIndexOf('.'); 
      if (dot != -1) 
      { 
       result = filename.substring(0, dot) + '.' + newExtension; 
      } 
     } 
     return result; 
    } 

    private static boolean isCMYK(String filename) 
    { 
     boolean result = false; 
     BufferedImage img = null; 
     try 
     { 
      img = ImageIO.read(new File(filename)); 
     } 
     catch (IOException e) 
     { 
      System.out.println(e.getMessage() + ": " + filename); 
     } 
     if (img != null) 
     { 
      int colorSpaceType = img.getColorModel().getColorSpace().getType(); 
      result = colorSpaceType == ColorSpace.TYPE_CMYK; 
     } 

     return result; 
    } 
} 
+0

No he podido probar esto todavía, pero parece que has puesto mucho trabajo en la respuesta. ¡Muchas gracias! –

+0

Hola Randy, intenté ejecutar este código pero solo produjo un JPG de 0kb. No estoy seguro por qué. ¿Algunas ideas? –

10

una fórmula muy sencilla para la conversión de CMYK a RGB ignorando todos los perfiles de color es:

 
    R = ((255-C)*(255-K))/255; 
    G = ((255-M)*(255-K))/255; 
    B = ((255-Y)*(255-K))/255; 

Este código requiere valores CMYK para estar en rabia de 0-255. Si tiene de 0 a 100 o de 0.0 a 1.0, deberá convertir los valores.

Espero que esto le comience.

En cuanto a la interfaz Java y ColdFusion, lo siento, pero no tengo ni idea de cómo hacerlo.

1

La etiqueta cfx_image puede ser útil para usted. No lo he usado por un tiempo, pero recuerdo que tenía un montón de características.

Alternativamente, es posible que pueda crear secuencias de comandos de una aplicación de Windows como Irfanview (a través de la línea de comandos usando cfexecute) para procesar imágenes.

Espero que ayude

0

Sé que esta pregunta es viejo, pero sigue teniendo problemas con las imágenes CMYK & ColdFusion. Sin embargo, acabo de leer una imagen JPEG CMYK con ColdFusion 10 y volver a guardarla. La imagen guardada se pudo leer utilizando ColdFusion 9 (que solo es capaz de leer archivos JPEG RGB).) No estoy seguro de si esta conversión es intencional o no y actualmente no tengo ninguna forma de identificar si el perfil de color de la imagen de origen es CMYK o no, ya que el perfil de color guardado aún parece ser el mismo.

<cfset imgData = ImageRead(expandPath("./CMYK_image.jpg"))> 
<cfset ImageWrite(imgData, expandPath("./Saved_image.jpg"))> 
Cuestiones relacionadas