Pergunta

Preciso converter imagens de CMYK para RGB - não necessariamente de volta, mas ei, se isso puder ser feito...

Com o lançamento do ColdFusion 8, obtivemos o CFImage tag, mas não oferece suporte a essa conversão;e nem faz Imagem.cfc, ou Componente de imagem de Alagad.

No entanto, deveria ser possível em Java;que podemos alavancar através da FC.Por exemplo, veja como você pode criar um thread Java para suspender um processo:

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

Eu acho que um método semelhante poderia ser usado para aproveitar o Java para fazer essa conversão de imagem, mas não sendo um desenvolvedor Java, não tenho ideia por onde começar.Alguém pode ajudar aqui?

Foi útil?

Solução

Eu uso as bibliotecas Java ImageIO (https://jai-imageio.dev.java.net).Eles não são perfeitos, mas podem ser simples e realizar o trabalho.No que diz respeito à conversão de CMYK para RGB, aqui está o melhor que consegui fazer.

Baixe e instale os JARs do ImageIO e as bibliotecas nativas para sua plataforma.As bibliotecas nativas são essenciais.Sem eles, os arquivos ImageIO JAR não serão capazes de detectar as imagens CMYK.Originalmente, tive a impressão de que as bibliotecas nativas melhorariam o desempenho, mas não eram necessárias para nenhuma funcionalidade.Eu estava errado.

A única outra coisa que notei é que as imagens RGB convertidas às vezes são muito mais claras que as imagens CMYK.Se alguém souber como resolver esse problema, eu ficaria grato.

Abaixo está um código para converter uma imagem CMYK em uma imagem RGB de qualquer formato suportado.

Obrigado,
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;
    }
}

Outras dicas

Uma fórmula muito simples para converter de CMYK para RGB ignorando todos os perfis de cores é:

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

Este código exige que os valores CMYK estejam na faixa de 0 a 255.Se você tiver de 0 a 100 ou de 0,0 a 1,0, terá que converter os valores.

Espero que isso ajude você a começar.

Quanto à interface java e ColdFusion, sinto muito, mas não tenho ideia de como fazer isso.

A tag cfx_image pode ser útil para você.Faz algum tempo que não o uso, mas lembro que tinha muitos recursos.

Alternativamente, você pode criar scripts para um aplicativo do Windows como o Irfanview (via linha de comando usando cfexecute) para processar imagens.

espero que ajude

Sei que essa pergunta é antiga, mas ainda encontro problemas com imagens CMYK e ColdFusion.No entanto, acabei de ler uma imagem CMYK JPEG usando ColdFusion 10 e salvei-a novamente.A imagem salva pôde ser lida usando o ColdFusion 9 (que só é capaz de ler JPEGs RGB). Não tenho certeza se essa conversão é intencional ou não e atualmente não tenho como identificar se a imagem de origem é O perfil de cores é CMYK ou não, pois o perfil de cores salvo ainda parece ser o mesmo.

<cfset imgData = ImageRead(expandPath("./CMYK_image.jpg"))>
<cfset ImageWrite(imgData, expandPath("./Saved_image.jpg"))>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top