给出一个白色和黑色的图像,没有灰色(在ARGB:0xFFFFFFFF
和0xFF000000
中),我想用一种特定的 colored颜色 给黑色上色,而用另一种特定的 colored颜色 给白色上色.
为此,我目前使用以下代码:
private LookupOp createLookupOp(Color foreground, Color background) {
var lookupTable = new byte[4][256];
var fg = foreground.getRGB();
Arrays.fill(lookupTable[0], (byte) (fg >> 16));
Arrays.fill(lookupTable[1], (byte) (fg >> 8));
Arrays.fill(lookupTable[2], (byte) (fg));
Arrays.fill(lookupTable[3], (byte) (fg >> 24));
var bg = background.getRGB();
lookupTable[0][0] = (byte) (bg >> 16);
lookupTable[1][0] = (byte) (bg >> 8);
lookupTable[2][0] = (byte) (bg);
lookupTable[3][0] = (byte) (bg >> 24);
return new LookupOp(new ByteLookupTable(0, lookupTable), null);
}
然后我可以这样使用它:
var lookup = lookups.computeIfAbsent(colorPair, colors -> createLookupOp(colors.foreground, colors.background));
var coloredImage = lookup.filter(originalImage, null);
graphics2d.drawImage(coloredImage, originalWidth, originalHeight, null);
它做到了这一点.但我对这个过程提出了质疑,因为它使用了大量的内存(每对 colored颜色 至少1KB),而且当我有数千张需要用不同 colored颜色 绘制的小图像时,创建它的速度相当慢.
为了加快速度,我将结果存储在 map 中,但即便如此,在应用程序运行结束时,我的 map 中仍有大约200,000个项目,也就是存储在 map 中的大约200 MB.
我想知道这LookupOp
有没有便宜又快的替代品.