0

あなたが私に提供できる助けを前もって感謝し、私の下手な英語で申し訳ありません.

このトピックについて多くの質問があることは知っていますが、すべてのインターネット (および StackOverflow も) をよく調べましたが、これに対する答えは見つかりませんでした...

4 つの画像があります。それらのそれぞれは、TYPE_BYTE_GRAY カラー モデルにあります。次のコードを使用して、これら 4 つの画像を読み込みました。

int numElems = 4;
BufferedImage[] img = new BufferedImage[numElems];
for(int i=0;i<numElems;i++){
    FileInputStream in = new FileInputStream(args[i]);
    img[i] = ImageIO.read(in);
    in.close();
}

ImageIO の読み取りのみ... 4 つの画像を 1 つの RGB 画像に「マージ」する必要があります...各画像は、CMYK 画像の 1 つのチャネルです。これらの画像はすべて同じ寸法です。次のコードを使用して、4 つの画像を 1 つの CMYK 画像に変換しました。

for(int j=0;j<img[0].getHeight();j++){
    //Read current point color...
    for(int k=0;k<numElems;k++){
        colPunto[k] = (img[k].getRGB(i, j) & 0xFF);
    }

    int colorPunto = convertComponentsRGB(colPunto);

    //Now, I set the point...
    out.setRGB(i, j, colorPunto);
    }
}

この関数「convertComponentsRGB」は、CMYK カラーを RGB カラーに変換する自然な計算です...

function convertComponentsRGB(int[] pointColor){
float cyan = (float)pointColor[0] / (float)255;
float magenta = (float)pointColor[1] / (float)255;
float yellow = (float)pointColor[2] / (float)255;
float black = (float)pointColor[3] / (float)255;

float c = min(1f,cyan * (1f - black) + black); //minimum value
float m = min(1f,magenta * (1f - black) + black); //minimum value
float y = min(1f, yellow * (1f - black) + black); //minimum value

result[0] = Math.round(255f*(1f - c));
result[1] = Math.round(255f*(1f - m));
result[2] = Math.round(255f*(1f - y));

    return (result[0]<<16) | (result[1]<<8) | result[2];
}

ここでの問題は...スピードです。各ピクセルを読み取り、各ピクセルを書き込む必要があるため、1 つの画像を処理するのに 12 秒かかります。また、"getRGB" および "setRGB" 関数はそれほど高速ではないと思います (または、これを達成するための最良の方法です)。 .

どうすればこれを達成できますか? 私は ColorModel やフィルターについて多くのことを読んできましたが、より良い時間でこれを達成する方法をまだ理解していません。

4

1 に答える 1

0

とを使用getDataして、 とsetDataに対してピクセルへのアクセスを高速化できgetRGBますsetRGB

CMYK を浮動小数点に変換して戻す必要はありません。ピクセル値を直接操作できます。

function convertComponentsRGB(int[] pointColor){
    int r = max(0, 255 - (pointColor[0] + pointColor[3]));
    int g = max(0, 255 - (pointColor[1] + pointColor[3]));
    int b = max(0, 255 - (pointColor[2] + pointColor[3]));

    return (r<<16) | (g<<8) | b;
}
于 2012-06-04T19:44:45.410 に答える