Pregunta

Necesito convertir imágenes de CMYK a RGB, no necesariamente de nuevo, pero bueno, si se puede hacer...

Con el lanzamiento de ColdFusion 8, obtuvimos la CFImagen etiqueta, pero no admite esta conversión;y tampoco lo hace Imagen.cfc, o Componente de imagen de Alagad.

Sin embargo, debería ser posible en Java;que podemos aprovechar a través de la FC.Por ejemplo, así es como puedes crear un subproceso Java para suspender un proceso:

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

Supongo que se podría utilizar un método similar para aprovechar Java para realizar esta conversión de imágenes, pero como no soy desarrollador de Java, no tengo idea de por dónde empezar.¿Alguien puede echar una mano aquí?

¿Fue útil?

Solución

Utilizo las bibliotecas Java ImageIO (https://jai-imageio.dev.java.net).No son perfectos, pero pueden ser simples y hacer el trabajo.En cuanto a la conversión de CMYK a RGB, esto es lo mejor que se me ha ocurrido.

Descargue e instale los 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.Me equivoqué.

La única otra cosa que noté es que las imágenes RGB convertidas a veces son mucho más claras que las imágenes CMYK.Si alguien sabe como solucionar ese problema se 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;
    }
}

Otros consejos

Una fórmula muy sencilla para convertir 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 que los valores CMYK estén entre 0 y 255.Si tiene de 0 a 100 o de 0,0 a 1,0, tendrá que convertir los valores.

Espero que esto te ayude a comenzar.

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

La etiqueta cfx_image puede resultarle útil.No lo he usado por un tiempo, pero recuerdo que tenía un montón de funciones.

Alternativamente, es posible que pueda programar 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

Sé que esta pregunta es antigua, pero todavía tengo problemas con las imágenes CMYK y ColdFusion.Sin embargo, acabo de leer una imagen JPEG CMYK usando ColdFusion 10 y la volví a guardar.La imagen guardada se pudo leer usando 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 la imagen de origen es El perfil de color es CMYK o no, ya que el perfil de color guardado todavía parece ser el mismo.

<cfset imgData = ImageRead(expandPath("./CMYK_image.jpg"))>
<cfset ImageWrite(imgData, expandPath("./Saved_image.jpg"))>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top