ColdFusion(Java)에서 CMYK와 RGB 간에 이미지를 어떻게 변환합니까?

StackOverflow https://stackoverflow.com/questions/22409

  •  09-06-2019
  •  | 
  •  

문제

이미지를 CMYK에서 RGB로 변환해야 합니다. 반드시 다시 되돌릴 필요는 없지만 가능하다면...

ColdFusion 8이 출시되면서 우리는 CF이미지 태그가 있지만 이 변환을 지원하지 않습니다.그리고 그렇지도 않다 이미지.cfc, 또는 Alagad의 이미지 구성요소.

그러나 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 이미지로 변환하는 일부 코드입니다.

감사합니다,
랜디 스테그바우어

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 태그가 유용할 수 있습니다.한동안 사용하지 않았지만 많은 기능이 있었던 것으로 기억합니다.

또는 Irfanview(cfexecute를 사용하는 명령줄을 통해)와 같은 Windows 앱을 스크립팅하여 이미지를 처리할 수도 있습니다.

도움이 되었기를 바랍니다

이 질문은 오래된 질문이라는 것을 알고 있지만 여전히 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"))>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top