gpt4 book ai didi

java - 在 Java 中为具有透明度的灰度图像着色的合适方法是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:30:22 25 4
gpt4 key购买 nike

我正在制作一个头像生成器,其中头像组件来自具有透明度的 PNG 文件。这些文件类似于 body_1.png 或 legs_5.png。透明度在零件周围但不在零件内部,并且图像都是灰度的。零件分层很好,我可以得到一个灰度头像。

我希望能够动态地为这些部分着色,但到目前为止我的运气并不好。我试过将像素数据从 RGB 转换为 HSL 并使用原始像素的 L 值,同时提供新颜色的 H 值,但结果不是很好。

我看过Colorize grayscale image但我似乎无法使他所说的在 Java 中起作用。我最终得到的图像到处都是相当明亮的霓虹色。

我想要的是保持透明度,同时对灰度部分进行着色。黑色轮廓应该仍然是黑色,白色高光区域应该仍然是白色(我认为)。

谁有好的方法吗?

编辑:

这是我可能要尝试着色的图像:Sample Body

同样,我想保持灰度图像的亮度级别(因此轮廓保持黑暗,渐变可见,白色 block 为白色)。

我已经能够让 LookupOp 在某种程度上基于 Colorizing images in Java 工作但颜色总是显得单调和黑暗。

这是我的输出示例:Sample Output

使用的颜色是这个(注意亮度差异):http://www.color-hex.com/color/b124e7

这是我的 lookupOp

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);

最佳答案

看起来对你有用的是这样的:

for each pixel
if pixel is white, black or transparent then leave it alone
else
apply desired H and S and make grayscale value the L
convert new HSL back to RGB

编辑:看到你的图片后我有几点评论:

似乎您想对较暗的色调进行特殊处理,因为您没有为低于 30 的任何颜色着色。按照相同的逻辑,您不应该也免除对较高值的着色吗?这将防止白色和接近白色的颜色变色。

您不应将 alpha 值与 RGB 一起设置。应始终保留原始图像的 alpha 值。您的查找表算法应该只影响 RGB。

虽然您说您尝试过 HSL,但这并不在您发布的代码中。您应该在 HSL 中进行着色,然后将生成的颜色转换为查找表的 RGB,因为这将保留灰度的原始亮度。您的查找表创建可能是这样的:

short H = ??; // your favorite hue
short S = ??; // your favorite saturation
for (short i = 0; i < 256; i++) {
if (i < 30 || i > 226) {
red[i] = green[i] = blue[i] = i; // don't do alpha here
}
else {
HSL_to_RGB(H, S, i, red[i], green[i], blue[i])
}
}

注意:必须提供HSL转RGB功能。在 Colorize grayscale image 上查看我的回答用于源代码链接。

关于java - 在 Java 中为具有透明度的灰度图像着色的合适方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7621774/

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