当前位置: 首页 > 面试题库 >

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

穆乐逸
2023-03-14
问题内容

我需要将图像从CMYK转换为RGB-不必再次返回,但是,嘿,如果可以的话…

随着ColdFusion
8的发布,我们获得了CFImage标签,但是它不支持这种转换。而且Image.cfc或Alagad的Image
Component
也不会。

但是,在Java中应该可以实现。我们可以通过CF加以利用。例如,以下是创建Java线程以使进程休眠的方法:

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

我猜想可以使用类似的方法来利用Java来完成图像转换,但是由于不是Java开发人员,所以我不知道从哪里开始。有人可以在这里伸出援手吗?


问题答案:

我使用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;
    }
}


 类似资料:
  • 问题内容: 如果我有RGB小数,例如,我该怎么做才能将其转换为CMYK? 例如: 问题答案: 这是Javascript实现的Python端口。

  • 问题内容: 我正在尝试实现一种解决方案,用于计算RGB和CMYK之间的转换,反之亦然。这是我到目前为止的内容: 问题答案: 正如Lea Verou所说,您应该利用色彩空间信息,因为没有从RGB映射到CMYK的算法。Adobe有一些ICC颜色配置文件可供下载1,但是我不确定它们是如何获得许可的。 获得颜色配置文件后,将执行以下操作:

  • 我正在尝试使用Latex创建PDF文件。但是,Latex不处理TIFF或任何其他能够同时透明和CMYK的图像格式。我认为我可以使用的唯一解决方案是将PNG图像转换为PDF并将其嵌入到文件中。 我对imagemagick有点熟悉,但是,我不知道如何将PNG(可能在RGB/SRGB颜色空间中)转换为CMYK颜色空间中的PDF。 我如何进行这种转换,使颜色正确,透明度保持不变?

  • 问题内容: 我试图用来读取RGB图像并将其转换为灰度。 在matlab中,我使用以下代码: 在matplotlib教程中,他们没有介绍。他们只是读了图像 然后将它们切成薄片,但这与根据我的理解将RGB转换为灰度不是同一回事。 我发现很难相信numpy或matplotlib没有将rgb转换为灰色的内置函数。这不是图像处理中的常见操作吗? 我写了一个非常简单的函数,可以在5分钟内使用导入的图像。这是非

  • 问题内容: 有谁知道如何将字符串从ISO-8859-1转换为UTF-8并重新转换为Java? 我从网络上获取一个字符串并将其保存在RMS(J2ME)中,但是我想保留特殊字符并从RMS中获取字符串,但要使用ISO-8859-1编码。我该怎么做呢? 问题答案: 通常,你无法执行此操作。UTF-8能够编码任何Unicode代码点。ISO-8859-1只能处理其中的一小部分。因此,从ISO-8859-1转

  • 问题内容: 我正在学习使用OpenCV进行实时应用程序的图像处理。我对图像进行了一些阈值处理,并希望将轮廓标记为绿色,但是由于我的图像是黑白图像,所以它们没有显示为绿色。 在程序的早期,我曾经将RGB转换为灰度,但是回过头来,我很困惑,该函数给出了: AttributeError:“模块”对象没有属性“ CV_GRAY2RGB”。 下面的代码似乎不是用绿色绘制轮廓。这是因为它是灰度图像吗?如果是这