2008-08-22 10 views
8

J'ai besoin de convertir des images de CMJN en RVB - pas nécessairement sauvegarder à nouveau, mais bon, si on peut le faire ...Comment convertir des images entre CMJN et RVB dans ColdFusion (Java)?

Avec la sortie de ColdFusion 8, nous avons obtenu l'étiquette CFImage, mais il doesn ne supporte pas cette conversion; et non plus Image.cfc, ou Alagad's Image Component.

Cependant, cela devrait être possible en Java; que nous pouvons tirer parti de CF. Par exemple, voici comment vous pouvez créer un fil Java pour dormir un processus:

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

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

+0

Cet exemple aura des valeurs entre 0 et 255^2. Ce n'est donc pas un exemple correct de conversion. –

Répondre

5

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 trouver.

Téléchargez et installez les JAR ImageIO et les bibliothèques natives pour votre plate-forme. Les bibliothèques natives sont essentielles. Sans eux, les fichiers JAR ImageIO ne seront pas en mesure de détecter les images CMJN. À l'origine, j'avais l'impression que les bibliothèques natives amélioreraient les performances, mais n'étaient requises pour aucune fonctionnalité. J'avais tort.

La seule autre chose que j'ai remarquée est que les images RVB converties sont parfois beaucoup plus légères que les images CMJN. Si quelqu'un sait comment résoudre ce problème, je serais reconnaissant. Ci-dessous figure un code permettant de convertir une image CMJN en une image RVB de n'importe quel format supporté.

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; 
    } 
} 
+0

Je n'ai pas encore pu tester cela, mais il semble que vous ayez mis beaucoup de travail dans la réponse. Merci beaucoup! –

+0

Hey Randy, j'ai essayé d'exécuter ce code mais il a seulement produit un JPG de 0kb. Pas certain de pourquoi. Des idées? –

10

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

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

Ce code requiert des valeurs CMJN être en rage de 0-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 n'ai aucune idée de comment faire cela.

1

La balise cfx_image peut 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 pourriez écrire une application Windows comme Irfanview (via la ligne de commande en utilisant cfexecute) pour traiter les images.

espoir qui aide

0

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

<cfset imgData = ImageRead(expandPath("./CMYK_image.jpg"))> 
<cfset ImageWrite(imgData, expandPath("./Saved_image.jpg"))>