2008-08-22 32 views
8

我有一個需要圖片來自CMYK轉換爲RGB - 不一定再回來,但是,嘿,如果這是可以做到...如何在ColdFusion(Java)中將圖像在CMYK和RGB之間轉換?

使用ColdFusion 8的發佈,我們得到了CFImage標籤,但它不不支持這種轉換;並且Image.cfcAlagad's Image Component也不是。

但是,應該可以在Java中使用;我們可以通過CF來利用它。例如,這裏是你如何可以創建一個Java線程休眠過程:

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

我猜想類似的方法可以用來利用Java這樣做圖像轉換,而不是作爲一個Java開發人員,我不沒有線索從哪裏開始。任何人都可以在這裏幫忙嗎?

從CMYK轉換爲RGB忽略所有顏色配置文件
+0

此示例將具有介於0和255^2之間的值。所以這不是一個正確的轉換例子。 – 2011-03-15 18:23:03

回答

5

我使用Java的ImageIO庫(https://jai-imageio.dev.java.net)。他們並不完美,但可以很簡單,並完成工作。就從CMYK轉換到RGB而言,這是我所能想到的最好的。

爲您的平臺下載並安裝ImageIO JAR和本機庫。本地庫是必不可少的。沒有它們,ImageIO JAR文件將無法檢測到CMYK圖像。最初,我的印象是,本地庫會提高性能,但不需要任何功能。我錯了。

我注意到的唯一一件事是,轉換的RGB圖像有時比CMYK圖像輕得多。如果有人知道如何解決這個問題,我會很感激。

以下是將CMYK圖像轉換爲任何支持格式的RGB圖像的一些代碼。

謝謝
蘭迪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

我還沒有能夠測試這個,但它看起來像你在答案中做了很多工作。非常感謝你! – 2009-05-11 17:36:39

10

一個非常簡單的計算公式爲:

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

此代碼要求CMYK值是在0-255的憤怒。如果你有0到100或0.0到1.0,你將不得不轉換值。

希望這會讓你開始。

至於java和ColdFusion接口,我很抱歉,但我不知道該怎麼做。

1

標籤cfx_image可能對您有用。我有一段時間沒有使用它,但我記得它有很多功能。

或者,您可以編寫一個Windows應用程序,例如Irfanview(通過命令行使用cfexecute)來處理圖像。

希望幫助

0

我知道這個問題是舊的,但我還是會遇到問題CMYK圖像&的ColdFusion。不過,我只是使用ColdFusion 10讀取CMYK JPEG圖像並重新保存。已保存的圖像能夠使用ColdFusion 9(僅能夠讀取RGB JPEG)進行讀取。)我不確定此轉換是否有意爲之,並且目前我還沒有任何方法可以識別源圖像的顏色配置文件是否爲CMYK,因爲保存的顏色配置文件看起來仍然相同。

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