【发布时间】:2011-11-29 02:57:35
【问题描述】:
我正在制作一个头像生成器,其中头像组件来自具有透明度的 PNG 文件。这些文件类似于body_1.png 或legs_5.png。透明度在零件周围但不在零件内,并且图像都是灰度的。零件分层很好,我可以得到一个灰度头像。
我希望能够为这些部分动态着色,但到目前为止我运气不佳。我尝试将像素数据从 RGB 转换为 HSL 并使用原始像素的 L 值,同时提供新颜色的 H 值,但结果并不好。
我看过Colorize grayscale image,但我似乎无法使他所说的在Java 中工作。我最终得到了一张到处都有相当明亮的霓虹色的图像。
我想要的是保持透明度,同时为灰度部分着色。黑色轮廓仍应为黑色,白色高光区域仍应为白色(我认为)。
有没有人有办法做到这一点?
编辑:
这是我可能会尝试着色的图像:
再次,我想保持灰度图像的亮度级别(这样轮廓保持黑暗,渐变可见,白色斑块是白色的)。
我已经能够让 LookupOp 在某种程度上基于Colorizing images in Java 工作,但颜色总是看起来单调和黑暗。
这是我的输出示例:
使用的颜色是这个(注意亮度差异):http://www.color-hex.com/color/b124e7
这是我的查找操作
protected LookupOp createColorizeOp(short R1, short G1, short B1) {
short[] alpha = new short[256];
short[] red = new short[256];
short[] green = new short[256];
short[] blue = new short[256];
//int Y = 0.3*R + 0.59*G + 0.11*B
for (short i = 0; i < 30; i++) {
alpha[i] = i;
red[i] = i;
green[i] = i;
blue[i] = i;
}
for (short i = 30; i < 256; i++) {
alpha[i] = i;
red[i] = (short)Math.round((R1 + i*.3)/2);
green[i] = (short)Math.round((G1 + i*.59)/2);
blue[i] = (short)Math.round((B1 + i*.11)/2);
}
short[][] data = new short[][] {
red, green, blue, alpha
};
LookupTable lookupTable = new ShortLookupTable(0, data);
return new LookupOp(lookupTable, null);
}
编辑 2:我将 LookupOp 更改为使用以下内容,并获得了更好看的颜色:
red[i] = (short)((R1)*(float)i/255.0);
green[i] = (short)((G1)*(float)i/255.0);
blue[i] = (short)((B1)*(float)i/255.0);
【问题讨论】:
-
如需尽快获得更好的帮助,请发帖SSCCE。在 SSCCE 中使用图像很棘手。您可以热链接到 Internet 上的图像,或在代码中生成。
标签: java image-processing