2008-08-22 12 views
8

mam potrzeby konwertowania obrazów CMYK na RGB - niekoniecznie z powrotem, ale hej, jeśli można to zrobić ...Jak przekonwertować obrazy między CMYK i RGB w ColdFusion (Java)?

Wraz z wydaniem ColdFusion 8, mamy tag CFImage, ale to nie robi wspiera tę konwersję; ani nie jest to Image.cfc ani Image.cfc lub Image.cfc.

Jednak powinno być możliwe w Javie; które możemy wykorzystać poprzez CF. Na przykład, oto jak można utworzyć wątku Java spać proces:

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

Przypuszczam podobny sposób mogą być wykorzystane na wykorzystanie Java to zrobić konwersję obrazu, ale nie będąc programistą Java, I don nie mają pojęcia, od czego zacząć. Czy ktoś może tu podać pomocną dłoń?

+0

Ten przykład będzie miał wartości od 0 do 255^2. Więc nie jest to właściwy przykład nawrócenia. –

Odpowiedz

5

używam biblioteki Java ImageIO (https://jai-imageio.dev.java.net). Nie są doskonałe, ale mogą być proste i wykonać zadanie. Jeśli chodzi o konwersję z CMYK na RGB, oto najlepsze, co udało mi się wymyślić.

Pobierz i zainstaluj pliki JAR ImageIO i biblioteki macierzyste dla swojej platformy. Biblioteki natywne są niezbędne. Bez nich pliki JAR ImageIO nie będą w stanie wykryć obrazów CMYK. Początkowo miałem wrażenie, że biblioteki natywne poprawiłyby wydajność, ale nie były wymagane dla żadnej funkcjonalności. Myliłem się.

Jedyną rzeczą, którą zauważyłem jest to, że przekonwertowane obrazy RGB są czasami dużo jaśniejsze niż obrazy CMYK. Jeśli ktoś wie, jak rozwiązać ten problem, byłbym wdzięczny.

Poniżej znajduje się kod do konwersji obrazu CMYK na obraz RGB dowolnego obsługiwanego formatu.

Dziękuję
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

Nie udało mi się jeszcze tego przetestować, ale wygląda na to, że włożyłeś dużo pracy w odpowiedź. Dziękuję Ci bardzo! –

+0

Hej Randy, próbowałem uruchomić ten kod, ale wyprodukowało tylko JPG 0kb. Nie pewny dlaczego. Jakieś pomysły? –

10

bardzo prosty wzór konwersji CMYK do RGB ignorując wszystkie profile barwne jest:

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

Ten kod wartości CMYK być wściekłości 0-255. Jeśli masz 0 do 100 lub 0.0 do 1.0, będziesz musiał przekonwertować wartości.

Mam nadzieję, że to się zacznie.

Jeśli chodzi o interfejs Java i ColdFusion, przepraszam, ale nie mam pojęcia, jak to zrobić.

1

Znacznik cfx_image może być dla Ciebie przydatny. Nie używałem go od jakiegoś czasu, ale pamiętam, że miał mnóstwo funkcji.

Alternatywnie możesz napisać aplikację Windows, taką jak Irfanview (przy użyciu linii poleceń, używając cfexecute), aby przetwarzać obrazy.

nadzieję, że pomoże

0

Wiem, że to pytanie jest stary, ale wciąż występują problemy z CMYK obrazów & ColdFusion. Jednak po prostu odczytałem obraz CMYK JPEG za pomocą ColdFusion 10 i zapisałem go ponownie. Zapisany obraz można było odczytać za pomocą ColdFusion 9 (który jest w stanie odczytać tylko pliki RGB JPEG).) Nie jestem pewien, czy ta konwersja jest zamierzona czy nie i nie mam obecnie żadnego sposobu na określenie, czy profil koloru obrazu źródłowego jest CMYK czy nie, ponieważ zapisany profil kolorów nadal wydaje się być taki sam.

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