ColdFusion (Java) でイメージを CMYK と RGB 間で変換するにはどうすればよいですか?
-
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 などの Windows アプリのスクリプトを (cfexecute を使用したコマンドライン経由で) 作成して画像を処理できる場合もあります。
お役に立てば幸いです
この質問が古いことは承知していますが、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"))>