Frage

Ich muss Bilder von CMYK in RGB konvertieren – nicht unbedingt wieder zurück, aber hey, wenn es möglich ist ...

Mit der Veröffentlichung von ColdFusion 8 haben wir das bekommen CFImage Tag, aber diese Konvertierung wird nicht unterstützt;und tut es auch nicht Image.cfc, oder Alagads Bildkomponente.

Allerdings sollte es in Java möglich sein;die wir durch CF nutzen können.So können Sie beispielsweise einen Java-Thread erstellen, um einen Prozess in den Ruhezustand zu versetzen:

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

Ich würde vermuten, dass eine ähnliche Methode verwendet werden könnte, um Java für diese Bildkonvertierung zu nutzen, aber da ich kein Java-Entwickler bin, habe ich keine Ahnung, wo ich anfangen soll.Kann hier jemand mithelfen?

War es hilfreich?

Lösung

Ich verwende die Java ImageIO-Bibliotheken (https://jai-imageio.dev.java.net).Sie sind nicht perfekt, können aber einfach sein und ihre Arbeit erledigen.Was die Konvertierung von CMYK in RGB angeht, ist hier das Beste, was mir einfallen konnte.

Laden Sie die ImageIO-JARs und nativen Bibliotheken für Ihre Plattform herunter und installieren Sie sie.Die nativen Bibliotheken sind unerlässlich.Ohne sie können die ImageIO-JAR-Dateien die CMYK-Bilder nicht erkennen.Ursprünglich hatte ich den Eindruck, dass die nativen Bibliotheken die Leistung verbessern würden, aber für keinerlei Funktionalität erforderlich seien.Ich hab mich geirrt.

Das Einzige, was mir sonst noch aufgefallen ist, ist, dass die konvertierten RGB-Bilder manchmal viel heller sind als die CMYK-Bilder.Wenn jemand weiß, wie man dieses Problem löst, wäre ich dankbar.

Nachfolgend finden Sie Code zum Konvertieren eines CMYK-Bildes in ein RGB-Bild eines beliebigen unterstützten Formats.

Danke schön,
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;
    }
}

Andere Tipps

Eine sehr einfache Formel für die Konvertierung von CMYK nach RGB unter Ignorierung aller Farbprofile lautet:

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

Dieser Code erfordert CMYK-Werte im Bereich von 0-255.Wenn Sie 0 bis 100 oder 0,0 bis 1,0 haben, müssen Sie die Werte umrechnen.

Ich hoffe, das wird Ihnen den Einstieg erleichtern.

Was die Java- und ColdFusion-Schnittstelle betrifft, tut es mir leid, aber ich habe keine Ahnung, wie das geht.

Der Tag cfx_image kann für Sie von Nutzen sein.Ich habe es eine Weile nicht benutzt, aber ich erinnere mich, dass es eine Menge Funktionen hatte.

Alternativ können Sie möglicherweise ein Skript für eine Windows-App wie Irfanview erstellen (über die Befehlszeile mit cfexecute), um Bilder zu verarbeiten.

Ich hoffe, das hilft

Ich weiß, dass diese Frage alt ist, aber ich habe immer noch Probleme mit CMYK-Bildern und ColdFusion.Allerdings habe ich gerade ein CMYK-JPEG-Bild mit ColdFusion 10 gelesen und es erneut gespeichert.Das gespeicherte Bild konnte mit ColdFusion 9 gelesen werden (das nur RGB-JPEGs lesen kann). Ich bin mir nicht sicher, ob diese Konvertierung beabsichtigt ist oder nicht, und ich habe derzeit keine Möglichkeit, festzustellen, ob es sich um das Quellbild handelt Ob das Farbprofil CMYK ist oder nicht, da das gespeicherte Farbprofil immer noch dasselbe zu sein scheint.

<cfset imgData = ImageRead(expandPath("./CMYK_image.jpg"))>
<cfset ImageWrite(imgData, expandPath("./Saved_image.jpg"))>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top