2010-12-17 35 views
5

ứng dụng web của chúng tôi cho phép người dùng tải xuống các hình ảnh được tạo động theo các định dạng khác nhau (bmp, png và jpeg). Một số người dùng của chúng tôi tải xuống hình ảnh để in, do đó chúng tôi muốn cho phép họ chọn giữa RGB hoặc CMYK. Có cách nào để chỉ định mô hình màu khi tạo RenderedImage/BufferedImage không? Nếu không, mô hình màu mặc định là gì và tôi có thể thay đổi mô hình này bằng cách nào khác? Đoạn mã được hoan nghênh :)làm thế nào tôi có thể chuyển đổi một hình ảnh RGB sang CMYK và ngược lại trong Java?

Cảm ơn,

Olivier.

+0

Bất kỳ lý do gì khiến người dùng của bạn không thể in hình ảnh RGB? – jarnbjo

+0

có thể trùng lặp của [RGB to CMYK và thuật toán ngược] (http://stackoverflow.com/questions/4858131/rgb-to-cmyk-and-back-algorithm) –

Trả lời

0
+0

Tải lên một cấu hình màu có vẻ là một giải pháp tốt hơn, bởi vì tôi đã sử dụng một lớp đại diện cho một không gian màu CMYK nhưng hình ảnh kết quả có màu "sai", trong khi khi tôi tải một hồ sơ CMYK, hình ảnh kết quả có màu sắc tương đương với hình ảnh gốc. – Olivier

-2

Đề nghị sử dụng fromRGB() - xem http://download.oracle.com/javase/1.4.2/docs/api/java/awt/color/ColorSpace.html

Mẫu mã:

java.awt.color.ColorSpace 

ColorSpace cmyk = new ColorSpace(ColorSpace.TYPE_CMYK, 4); 
float[] values = cmyk.fromRGB(rgbFloatArray); 

public abstract float [] fromRGB (float [] rgbvalue)

Transforms một màu giá trị được giả định là trong CS_sRGB mặc định không gian màu vào không gian màu này.

Phương pháp này biến đổi các giá trị màu bằng cách sử dụng các thuật toán được thiết kế để tạo ra kết quả nhận thức tốt nhất giữa màu đầu vào và đầu ra. Để chuyển đổi màu giá trị màu, bạn nên sử dụng phương thức toCIEXYZ của không gian màu CS_sRGB để chuyển đổi đầu tiên từ không gian màu đầu vào sang không gian màu CS_CIEXYZ và sau đó sử dụng phương thức fromCIEXYZ của không gian màu này để chuyển đổi từ CS_CIEXYZ sang không gian màu đầu ra. Xem tociEXYZ và fromCIEXYZ để biết thêm thông tin.

+0

Không, bạn không thể làm điều đó. ColorSpace là một lớp trừu tượng! – dogbane

+1

oh blast, well spotted. Trong trường hợp đó, tôi đề nghị làm việc với một số ví dụ và mã từ luồng này: http://www.java.net/forum/topic/javadesktop/java-máy tính để bàn-công nghệ/jai-imageio/jai-imageio-covnert-cmyk-rgb-0 –

+0

Đánh dấu, chủ đề này thực sự đã giúp tôi rất nhiều sau khi tôi nghiên cứu các khóa học gazillion trong API JAI. Mã của tôi là nut làm việc cần một số dọn dẹp, tôi sẽ đăng nó khi nó được thực hiện. Cảm ơn. – Olivier

0

Một số định dạng hình ảnh không cho phép không gian màu CMYK (PNG, JPEG/JFIF, GIF ...) và cho người dùng bình thường in trong RGB là mong muốn.

Lý do bạn cần cung cấp hình ảnh CMYK cho khách hàng của mình là gì?

-1

Để chuyển đổi hình ảnh RGB thành hình ảnh CMYK bằng Java, một trong những cách dễ nhất là sử dụng JAI (Java Advanced Image).

Tải JAI: http://download.java.net/media/jai/builds/release/1_1_3/

DownLoad JAI ImageIO: http://download.java.net/media/jai-imageio/builds/release/1.1/

Đây là mã:

public static void rgbToCmyk() throws IOException{ 

    BufferedImage rgbImage = ImageIO.read(new File("C://Users//Public//Pictures//Sample Pictures//RGB_IMAGE.jpg")); 
    BufferedImage cmykImage = null; 
    ColorSpace cpace = new ICC_ColorSpace(ICC_Profile.getInstance(RbgToCmyk.class.getClassLoader().getResourceAsStream("ISOcoated.icc"))); 
    ColorConvertOp op = new ColorConvertOp(rgbImage.getColorModel().getColorSpace(), cpace, null);  
    cmykImage = op.filter(rgbImage, null); 

    JAI.create("filestore", cmykImage, "c:/tmp/CMYK_IMAGE.TIF", "TIFF"); 
} 

LƯU Ý: "ISOcoated.icc" là ICC profile của tôi. Bạn có thể lấy nó từ máy in của bạn hoặc ở một nơi khác.

Các vấn đề liên quan