如何在ColdFusion(Java)中在CMYK和RGB之间转换图像?

我需要将图像从CMYK转换为RGB – 不一定要再回来了,但是嘿,如果可以的话……

随着ColdFusion 8的发布,我们获得了CFImage标签,但它不支持这种转换; Image.cfc或Alagad的图像组件也没有。

但是,应该可以用Java; 我们可以通过CF来利用它。 例如,以下是创建Java线程以hibernate进程的方法:

  

我猜可以使用类似的方法来利用java来进行这种图像转换,但不是Java开发人员,我不知道从哪里开始。 有人可以帮忙吗?

我使用Java ImageIO库( https://jai-imageio.dev.java.net )。 它们并不完美,但可以很简单并完成工作。 至于从CMYK转换为RGB,这是我能够想到的最好的。

下载并安装适用于您的平台的ImageIO JAR和本机库。 本地库是必不可少的。 没有它们,ImageIO JAR文件将无法检测CMYK图像。 最初,我的印象是本机库可以提高性能,但不需要任何function。 我错了。

我注意到的另一件事是转换的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; } } 

从CMYK转换为RGB的非常简单的公式忽略所有颜色配置文件:

     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接口,我很抱歉,但我不知道该怎么做。

标签cfx_image可能对您有用。 我有一段时间没用过它,但我记得它有很多function。

或者,您可以编写一个Windows应用程序脚本,例如Irfanview(通过使用cfexecute的命令行)来处理图像。

希望有所帮助

我知道这个问题很老,但我仍然遇到CMYK图像和ColdFusion的问题。 但是,我只是使用ColdFusion 10读取了CMYK JPEG图像并重新保存。 保存的图像能够使用ColdFusion 9(只能读取RGB JPEG)来读取。我不确定这种转换是否是有意的,我目前没有任何方法来识别源图像是否颜色配置文件是否为CMYK,因为保存的颜色配置文件看起来仍然相同。