gpt4 book ai didi

java - 从 RGB 转换为 CMYK 的任何更快的算法

转载 作者:行者123 更新时间:2023-11-29 05:22:48 24 4
gpt4 key购买 nike

这就是我使用更“正确”的方式将 RGB 转换为 CMYK 的方式 - 即使用 ICC 颜色配置文件。

// Convert RGB to CMYK with level shift (minus 128)
private void RGB2CMYK(int[] rgb, float[][] C, float[][] M, float[][] Y, float[][] K, int imageWidth, int imageHeight) throws Exception {
ColorSpace instance = new ICC_ColorSpace(ICC_Profile.getInstance(JPEGWriter.class.getResourceAsStream(pathToCMYKProfile)));
float red, green, blue, cmyk[];
//
for(int i = 0, index = 0; i < imageHeight; i++) {
for(int j = 0; j < imageWidth; j++, index++) {
red = ((rgb[index] >> 16) & 0xff)/255.0f;
green = ((rgb[index] >> 8) & 0xff)/255.0f;
blue = (rgb[index] & 0xff)/255.0f;
cmyk = instance.fromRGB(new float[] {red, green, blue});
C[i][j] = cmyk[0]*255.0f - 128.0f;
M[i][j] = cmyk[1]*255.0f - 128.0f;
Y[i][j] = cmyk[2]*255.0f - 128.0f;
K[i][j] = cmyk[3]*255.0f - 128.0f;
}
}
}

我的问题是:考虑到大图像,它的速度太慢了。在一个案例中,我花了大约 104 秒而不是通常的 2 秒来将数据写入 JPEG 图像。事实证明,上面的转换是最耗时的部分。

我想知道有没有办法让它更快。 注意:我不会使用可以从网络上找到的廉价转换算法。

更新:根据haraldK的建议,修改后的版本如下:

private void RGB2CMYK(int[] rgb, float[][] C, float[][] M, float[][] Y, float[][] K, int imageWidth, int imageHeight) throws Exception {
if(cmykColorSpace == null)
cmykColorSpace = new ICC_ColorSpace(ICC_Profile.getInstance(JPEGWriter.class.getResourceAsStream(pathToCMYKProfile)));
DataBuffer db = new DataBufferInt(rgb, rgb.length);
WritableRaster raster = Raster.createPackedRaster(db, imageWidth, imageHeight, imageWidth, new int[] {0x00ff0000, 0x0000ff00, 0x000000ff}, null);
ColorSpace sRGB = ColorSpace.getInstance(ColorSpace.CS_sRGB);

ColorConvertOp cco = new ColorConvertOp(sRGB, cmykColorSpace, null);

WritableRaster cmykRaster = cco.filter(raster, null);
byte[] o = (byte[])cmykRaster.getDataElements(0, 0, imageWidth, imageHeight, null);

for(int i = 0, index = 0; i < imageHeight; i++) {
for(int j = 0; j < imageWidth; j++) {
C[i][j] = (o[index++]&0xff) - 128.0f;
M[i][j] = (o[index++]&0xff) - 128.0f;
Y[i][j] = (o[index++]&0xff) - 128.0f;
K[i][j] = (o[index++]&0xff) - 128.0f;
}
}
}

更新:我还发现在 BufferedImage 而不是 Raster 上进行过滤要快得多。看到这个帖子:ARGB int array to CMYKA byte array convertion

最佳答案

您应该摆脱最内层循环中的内存分配。 new 是一个非常昂贵的操作。它还可能会启动垃圾收集器,这会增加进一步的惩罚。

关于java - 从 RGB 转换为 CMYK 的任何更快的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23999442/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com