2008-08-22 6 views
8

ich ein Bedürfnis haben, zu konvertieren Bilder von CMYK in RGB - nicht unbedingt wieder zurück, aber hey, wenn es ... getan werden kannWie konvertiere ich Bilder zwischen CMYK und RGB in ColdFusion (Java)?

Mit der Veröffentlichung von Coldfusion 8, haben wir die CFImage Tag, aber es doesn unterstütze diese Umwandlung nicht; und auch nicht Image.cfc oder Alagad's Image Component.

Allerdings sollte es in Java möglich sein; die wir durch CF nutzen können. Zum Beispiel, hier ist, wie Sie einen Java-Thread erstellen könnten einen Prozess schlafen:

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

Ich würde ein ähnliches Verfahren erraten verwendet werden könnte, Java nutzen diese Bildumwandlung zu tun, aber nicht ein Java-Entwickler zu sein, ich don Ich habe keine Ahnung, wo ich anfangen soll. Kann hier jemand helfen?

+0

Dieses Beispiel hat Werte zwischen 0 und 255^2. Es ist also kein korrektes Beispiel für eine Konvertierung. –

Antwort

5

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

Laden Sie die ImageIO JARs und nativen Bibliotheken für Ihre Plattform herunter und installieren Sie sie. Die nativen Bibliotheken sind essentiell. 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 keine Funktionalität benötigt wurde. Ich habe mich geirrt.

Die einzige andere Sache, die ich bemerkte, ist, dass die konvertierten RGB-Bilder manchmal viel heller sind als die CMYK-Bilder. Wenn jemand weiß, wie er dieses Problem lösen kann, wäre ich dankbar.

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

Danke,
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

Ich konnte das noch nicht testen, aber es sieht so aus, als hättest du viel Arbeit in die Antwort gesteckt. Vielen Dank! –

+0

Hey Randy, ich habe versucht, diesen Code auszuführen, aber es hat nur ein JPG von 0kb produziert. Nicht sicher warum. Irgendwelche Ideen? –

10

Eine sehr einfache Formel von CMYK für die Umwandlung in RGB alle Farbprofile zu ignorieren ist:

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

Dieser Code CMYK-Werte erfordert in Wut von 0-255 zu sein. Wenn Sie 0 bis 100 oder 0.0 bis 1.0 haben, müssen Sie die Werte konvertieren.

Hoffe, das wird Ihnen helfen.

Wie für die Java und ColdFusion-Schnittstelle, tut mir leid, aber ich habe keine Ahnung, wie das geht.

1

Das Tag cfx_image kann für Sie von Nutzen sein. Ich habe es seit einer Weile nicht mehr benutzt, aber ich erinnere mich, dass es eine Menge Features hatte.

Alternativ können Sie eine Windows-App wie Irfanview (über die Befehlszeile mit cfexecute) zum Verarbeiten von Bildern scripten.

Hoffnung, die

0

Ich weiß, dass diese Frage ist alt, aber ich immer noch Probleme mit CMYK-Bildern & Coldfusion begegnen. Ich lese gerade ein CMYK-JPEG-Bild mit ColdFusion 10 und speicherte es erneut. Das gespeicherte Bild konnte mit ColdFusion 9 (das nur RGB-JPEGs lesen kann) gelesen werden.) Ich bin mir nicht sicher, ob diese Konvertierung beabsichtigt ist oder nicht und ich habe derzeit keine Möglichkeit festzustellen, ob das Farbprofil des Quellbildes CMYK ist oder nicht, da das gespeicherte Farbprofil immer noch das gleiche zu sein scheint.

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