Domanda

Ho bisogno di convertire le immagini da CMYK a RGB, non necessariamente viceversa, ma ehi, se è possibile farlo...

Con il rilascio di ColdFusion 8, abbiamo ottenuto il CFImage tag, ma non supporta questa conversione;e nemmeno Immagine.cfc, O Componente immagine di Alagad.

Tuttavia, dovrebbe essere possibile in Java;che possiamo sfruttare tramite CF.Ad esempio, ecco come potresti creare un thread Java per sospendere un processo:

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

Immagino che un metodo simile potrebbe essere utilizzato per sfruttare Java per eseguire questa conversione di immagini, ma non essendo uno sviluppatore Java, non ho la minima idea da dove cominciare.Qualcuno può dare una mano qui?

È stato utile?

Soluzione

Utilizzo le librerie Java ImageIO (https://jai-imageio.dev.java.net).Non sono perfetti, ma possono essere semplici e portare a termine il lavoro.Per quanto riguarda la conversione da CMYK a RGB, ecco il meglio che sono riuscito a trovare.

Scarica e installa i JAR ImageIO e le librerie native per la tua piattaforma.Le librerie native sono essenziali.Senza di essi i file JAR ImageIO non saranno in grado di rilevare le immagini CMYK.Inizialmente, avevo l'impressione che le librerie native avrebbero migliorato le prestazioni ma non erano necessarie per alcuna funzionalità.Mi sbagliavo.

L'unica altra cosa che ho notato è che le immagini RGB convertite a volte sono molto più chiare delle immagini CMYK.Se qualcuno sa come risolvere il problema gli sarei grato.

Di seguito è riportato del codice per convertire un'immagine CMYK in un'immagine RGB di qualsiasi formato supportato.

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

Altri suggerimenti

Una formula molto semplice per convertire da CMYK a RGB ignorando tutti i profili colore è:

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

Questo codice richiede che i valori CMYK siano compresi tra 0 e 255.Se hai un valore compreso tra 0 e 100 o tra 0,0 e 1,0 dovrai convertire i valori.

Spero che questo ti aiuterà a iniziare.

Per quanto riguarda l'interfaccia Java e ColdFusion, mi dispiace, ma non ho idea di come farlo.

Il tag cfx_image potrebbe esserti utile.Non lo uso da un po' ma ricordo che aveva tantissime funzionalità.

In alternativa, potresti essere in grado di creare script di un'app Windows come Irfanview (tramite riga di comando utilizzando cfexecute) per elaborare le immagini.

Spero possa aiutare

So che questa domanda è vecchia, ma riscontro ancora problemi con le immagini CMYK e ColdFusion.Tuttavia, ho appena letto un'immagine JPEG CMYK utilizzando ColdFusion 10 e l'ho salvata di nuovo.È stato possibile leggere l'immagine salvata utilizzando ColdFusion 9 (che è in grado di leggere solo JPEG RGB). Non sono sicuro che questa conversione sia intenzionale o meno e al momento non ho alcun modo per identificare se l'immagine sorgente è il profilo colore è CMYK o meno poiché il profilo colore salvato sembra essere ancora lo stesso.

<cfset imgData = ImageRead(expandPath("./CMYK_image.jpg"))>
<cfset ImageWrite(imgData, expandPath("./Saved_image.jpg"))>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top