【问题标题】:How do I convert images between CMYK and RGB in ColdFusion (Java)?如何在 ColdFusion (Java) 中在 CMYK 和 RGB 之间转换图像?
【发布时间】:2010-09-06 13:11:34
【问题描述】:

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

随着ColdFusion 8 的发布,我们得到了CFImage 标签,但它不支持这种转换; Image.cfcAlagad's Image Component 也没有。

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

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

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

【问题讨论】:

  • 这个例子的值在 0 到 255^2 之间。所以这不是一个正确的转换例子。

标签: java image coldfusion


【解决方案1】:

忽略所有颜色配置文件从 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 的接口,对不起,我不知道该怎么做。

【讨论】:

    【解决方案2】:

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

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

    希望有帮助

    【讨论】:

      【解决方案3】:

      我使用 Java ImageIO 库 (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;
          }
      }
      

      【讨论】:

      • 我还无法对此进行测试,但看起来您在答案中投入了很多工作。非常感谢!
      • 嘿兰迪,我尝试运行这段代码,但它只生成了 0kb 的 JPG。不知道为什么。有什么想法吗?
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-25
        • 2020-07-03
        • 1970-01-01
        • 2012-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-04
        相关资源
        最近更新 更多