2008-08-22 39 views
8

tôi có nhu cầu chuyển đổi hình ảnh từ CMYK để RGB - không nhất thiết phải trở lại một lần nữa, nhưng hey, nếu nó có thể được thực hiện ...Làm thế nào để chuyển đổi hình ảnh giữa CMYK và RGB trong Coldfusion (Java)?

Với việc phát hành ColdFusion 8, chúng tôi đã nhận thẻ CFImage, nhưng nó doesn không hỗ trợ chuyển đổi này; và cũng không Image.cfc hoặc Alagad's Image Component.

Tuy nhiên, có thể thực hiện được trong Java; mà chúng ta có thể tận dụng thông qua CF. Ví dụ, dưới đây là cách bạn có thể tạo một sợi Java để ngủ một quá trình:

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

tôi sẽ đoán một phương pháp tương tự có thể được sử dụng để tận dụng java để làm hình ảnh này chuyển đổi, nhưng không phải là một nhà phát triển Java, tôi don không có đầu mối bắt đầu từ đâu. Có ai có thể giúp một tay ở đây không?

+0

Ví dụ này sẽ có giá trị từ 0 đến 255^2. Vì vậy, nó không phải là một ví dụ chính xác về chuyển đổi. –

Trả lời

5

Tôi sử dụng thư viện Java ImageIO (https://jai-imageio.dev.java.net). Chúng không hoàn hảo, nhưng có thể đơn giản và hoàn thành công việc. Theo như chuyển đổi từ CMYK sang RGB, đây là điều tốt nhất tôi có thể nghĩ ra.

Tải xuống và cài đặt các JAR ImageIO và thư viện gốc cho nền tảng của bạn. Các thư viện bản địa là rất cần thiết. Nếu không có chúng, các tệp JAR ImageIO sẽ không thể phát hiện các hình ảnh CMYK. Ban đầu, tôi đã được ấn tượng rằng các thư viện bản địa sẽ cải thiện hiệu suất nhưng không cần thiết cho bất kỳ chức năng nào. Tôi đã sai.

Điều duy nhất mà tôi nhận thấy là hình ảnh RGB được chuyển đổi đôi khi nhẹ hơn nhiều so với hình ảnh CMYK. Nếu có ai biết cách giải quyết vấn đề đó, tôi sẽ đánh giá cao.

Dưới đây là một số mã để chuyển đổi hình ảnh CMYK thành hình ảnh RGB của bất kỳ định dạng được hỗ trợ nào.

Cảm ơn bạn,
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

Tôi chưa thể thử nghiệm điều này, nhưng có vẻ như bạn đã đặt rất nhiều công việc vào câu trả lời. Cảm ơn nhiều! –

+0

Hey Randy, tôi đã thử chạy mã này nhưng nó chỉ tạo ra JPG là 0kb. Không chắc chắn lý do tại sao. Bất kỳ ý tưởng? –

10

Một công thức rất đơn giản để chuyển đổi từ CMYK để RGB bỏ qua tất cả cấu hình màu sắc là:

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

Mã này đòi hỏi các giá trị CMYK để tạo nên cơn sốt của 0-255. Nếu bạn có 0 đến 100 hoặc 0.0 đến 1.0, bạn sẽ phải chuyển đổi các giá trị.

Hy vọng điều này sẽ giúp bạn bắt đầu.

Đối với giao tiếp java và Coldfusion, tôi xin lỗi, nhưng tôi không biết làm cách nào để thực hiện điều đó.

1

Thẻ cfx_image có thể được sử dụng cho bạn. Tôi đã không sử dụng nó trong một thời gian nhưng tôi nhớ nó có rất nhiều tính năng.

Ngoài ra, bạn có thể tạo một ứng dụng cửa sổ như Irfanview (thông qua dòng lệnh sử dụng cfexecute) để xử lý hình ảnh.

Hy vọng rằng sẽ giúp

0

Tôi biết rằng câu hỏi này là cũ, nhưng tôi vẫn gặp phải vấn đề với hình ảnh CMYK & ColdFusion. Tuy nhiên, tôi chỉ đọc một hình ảnh JPEG CMYK sử dụng ColdFusion 10 và lưu lại nó. Hình ảnh đã lưu có thể đọc được bằng ColdFusion 9 (chỉ có khả năng đọc RGB JPEG).) Tôi không chắc liệu chuyển đổi này có chủ ý hay không và hiện tại tôi không có bất kỳ cách nào để xác định liệu hồ sơ màu của hình ảnh nguồn là CMYK hay không như hồ sơ màu đã lưu vẫn có vẻ giống nhau.

<cfset imgData = ImageRead(expandPath("./CMYK_image.jpg"))> 
<cfset ImageWrite(imgData, expandPath("./Saved_image.jpg"))> 
Các vấn đề liên quan