代码之家  ›  专栏  ›  技术社区  ›  Adam Tuttle

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

  •  8
  • Adam Tuttle  · 技术社区  · 18 年前

    我需要将图像从cmyk转换为rgb-不一定要再次返回,但嘿,如果可以的话…

    随着ColdFusion 8的发布,我们得到了 CFImage 标记,但它不支持此转换;也不支持 Image.cfc Alagad's Image Component .

    但是,Java应该是可能的,我们可以通过FF来使用它。例如,这里是如何创建一个Java线程来休眠进程:

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

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

    4 回复  |  直到 18 年前
        1
  •  5
  •   Randy Stegbauer    17 年前

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

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

    我注意到的另一件事是,转换后的RGB图像有时比CMYK图像轻得多。如果有人知道如何解决这个问题,我会感激的。

    下面是一些将CMYK图像转换为任何支持格式的RGB图像的代码。

    谢谢您,
    兰迪斯蒂格鲍尔

    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;
        }
    }
    
        2
  •  10
  •   Michał Piaskowski    18 年前

    忽略所有颜色配置文件从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和CaldFube接口,我很抱歉,但我不知道该怎么做。

        3
  •  1
  •   Jas Panesar    17 年前

    标记cfx_图像可能对您有用。我有一段时间没用了,但我记得它有很多特性。

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

    希望有所帮助

        4
  •  0
  •   James Moberg    13 年前

    我知道这个问题由来已久,但我仍然会遇到CMYK Images&ColdFusion的问题。不过,我只是用ColdFusion 10读取了一个CMYK JPEG图像,然后重新保存了它。保存的图像可以使用ColdFusion 9(它只能读取rgb jpegs)读取。我不确定此转换是否有意进行,目前我没有任何方法来识别源图像的颜色配置文件是否为cmyk,因为保存的颜色配置文件似乎仍然相同。

    <cfset imgData = ImageRead(expandPath("./CMYK_image.jpg"))>
    <cfset ImageWrite(imgData, expandPath("./Saved_image.jpg"))>
    
    推荐文章