8

画像を CMYK から RGB に変換する必要があります - 必ずしも元に戻す必要はありませんが、できれば...

ColdFusion 8 のリリースで、CFImageタグが追加されましたが、この変換はサポートされていません。Image.cfcAlagad の Image Componentも同様です。

ただし、Java では可能なはずです。CFを通じて活用できます。たとえば、プロセスをスリープ状態にする Java スレッドを作成する方法を次に示します。

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

Java を利用してこの画像変換を行うために同様の方法を使用できると思いますが、Java 開発者ではないので、どこから始めればよいかわかりません。ここで手を貸してくれる人はいますか?

4

4 に答える 4

11

すべてのカラー プロファイルを無視して 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 のインターフェースについては、申し訳ありませんが、その方法がわかりません。

于 2008-08-22T21:41:48.323 に答える
6

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;
    }
}
于 2009-05-11T15:01:05.827 に答える
1

タグ cfx_image が役立つ場合があります。しばらく使っていませんでしたが、たくさんの機能があったことを覚えています。

または、(cfexecute を使用したコマンドライン経由で) Irfanview などの Windows アプリをスクリプト化して、画像を処理することもできます。

それが役立つことを願っています

于 2008-11-09T05:57:59.157 に答える
0

この質問が古いことは知っていますが、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"))>
于 2013-07-06T00:07:06.810 に答える