我试图用给定的颜色创建彩色灰色图像,但我总是失败。我知道我必须使用BufferedImage并将源图像的所有像素加载到数组中,但我不知道如何处理颜色值,因此在将源颜色和给定颜色相乘后总会出现一些奇怪的颜色(对于记录我来说)我得到了代码来获得颜色的int。)
感谢您的帮助。
答案 0 :(得分:0)
您是否尝试将图像灰色通道(白色 - 黑色)更改为(some_color-black)?
public void recolor(BufferedImage source, BufferedImage destination, int color) {
WritableRaster destinationRaster = destination.getRaster();
Raster sourceRaster = source.getRaster();
//red, green, blue
int channels = new int[]{color & 0xFF0000, color & 0xFF00, color & 0xFF};
for (int channel=0; channel<3; channel++){
for (int y=0; y<sourceRaster.getHeight(); y++) {
for (int x=0; x<rangeSlicer.getWidth(); x++) {
pixel = sourceRaster.getSample(x, y, channel);
pixel = Math.round((double)pixel/255.0 * channels[channel]);
destinationRaster.setSample(x, y, channel, pixel);
}
}
}
}
不确定是否编译,但想法是这样的。有关更有效的计划检查RescaleOp。
答案 1 :(得分:0)
我会定义一些alpha = 0.2
并执行:
given gray #777777
make redder with:
new red = 77 * (1.0 + alpha)
new green = blue = 77 * (1.0 - alpha)
实际上,你必须小心并确保截断(1 + alpha)和(1 - alpha),这样你才能使用0到1.0之间的值。 使用Math.min(0.0,1.0 - alpha)代替(1.0 - alpha)和Math.max(1.0,1.0 + alpha)代替(1.0 + alpha)。
使用此公式,如果您获得黑色(#000000),它将保持黑色。如果给你白色(#FFFFFF),它会变成粉红色(#FFCCCC)。如果设置alpha = 1.0,白色将结束纯红色(#FF0000)。
你可以想出不同的颜色缩放公式,但我想你应该确保你的变换总是保持黑色为纯黑色。