Question

J'ai besoin de convertir des images CMJN en RVB - pas nécessairement de nouveau, mais bon, si cela peut être fait...

Avec la sortie de ColdFusion 8, nous avons obtenu le CFImage balise, mais il ne prend pas en charge cette conversion ;et non plus Image.cfc, ou Composant d'image d'Alagad.

Cependant, cela devrait être possible en Java ;que nous pouvons exploiter grâce à CF.Par exemple, voici comment créer un thread Java pour mettre en veille un processus :

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

Je suppose qu'une méthode similaire pourrait être utilisée pour exploiter Java pour effectuer cette conversion d'image, mais n'étant pas un développeur Java, je ne sais pas par où commencer.Quelqu'un peut-il donner un coup de main ici ?

Était-ce utile?

La solution

J'utilise les bibliothèques Java ImageIO (https://jai-imageio.dev.java.net).Ils ne sont pas parfaits, mais peuvent être simples et faire le travail.En ce qui concerne la conversion de CMJN en RVB, voici le meilleur que j'ai pu proposer.

Téléchargez et installez les JAR ImageIO et les bibliothèques natives pour votre plateforme.Les bibliothèques natives sont indispensables.Sans eux, les fichiers ImageIO JAR ne pourront pas détecter les images CMJN.À l’origine, j’avais l’impression que les bibliothèques natives amélioreraient les performances mais n’étaient nécessaires pour aucune fonctionnalité.J'ai eu tort.

La seule autre chose que j'ai remarquée est que les images RVB converties sont parfois beaucoup plus claires que les images CMJN.Si quelqu'un sait comment résoudre ce problème, je l'apprécierais.

Vous trouverez ci-dessous un code pour convertir une image CMJN en une image RVB de n'importe quel format pris en charge.

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

Autres conseils

Une formule très simple pour convertir du CMJN en RVB en ignorant tous les profils de couleurs est la suivante :

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

Ce code nécessite que les valeurs CMJN soient comprises entre 0 et 255.Si vous avez 0 à 100 ou 0,0 à 1,0, vous devrez convertir les valeurs.

J'espère que cela vous aidera à démarrer.

En ce qui concerne l'interface Java et ColdFusion, je suis désolé, mais je ne sais pas comment procéder.

La balise cfx_image pourra vous être utile.Je ne l'ai pas utilisé depuis un moment mais je me souviens qu'il avait une tonne de fonctionnalités.

Alternativement, vous pourrez peut-être créer un script pour une application Windows telle que Irfanview (via la ligne de commande en utilisant cfexecute) pour traiter les images.

J'espère que cela pourra aider

Je sais que cette question est ancienne, mais je rencontre toujours des problèmes avec les images CMJN et ColdFusion.Cependant, je viens de lire une image JPEG CMJN à l'aide de ColdFusion 10 et de la réenregistrer.L'image enregistrée a pu être lue à l'aide de ColdFusion 9 (qui n'est capable de lire que les fichiers JPEG RVB.) Je ne sais pas si cette conversion est intentionnelle ou non et je n'ai actuellement aucun moyen d'identifier si l'image source est Le profil de couleur est CMJN ou non, car le profil de couleur enregistré semble toujours être le même.

<cfset imgData = ImageRead(expandPath("./CMYK_image.jpg"))>
<cfset ImageWrite(imgData, expandPath("./Saved_image.jpg"))>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top