我想在不丢失颜色的情况下在位图上应用浮雕和素描效果。我已经应用了颜色效果,但还没有使用浮雕的运气。
任何机构有解决方案吗?请帮忙
将其视为两个操作。首先,生成灰色浮雕图像(你说你已经实现了)然后制作彩色浮雕图像,你在原始图像和浮雕图像之间执行混合操作。对于使用何种操作形式,没有唯一正确的选择。这取决于您希望达到的效果。
如果您假设您有一个彩色图像(R,G,B)和一个灰色浮雕图像(E),每个组件都是一个字节。这为您(对于每个像素)提供了 0..255 范围内的 4 个值;
由于您可能希望浮雕的黑暗区域显示更暗,而明亮区域显示更亮,因此具有居中的灰度级很有用。
w=(E/128)-1; // convert 0..255 range to -1..1
现在 w 为负值的地方应该变得更暗,而 w 为正的地方 w 应该变得更亮。
outputR = R + (R*w);
outputG = G + (G*w);
outputB = B + (B*w);
这将为您提供黑色,其中 w 为 - 1。当 w 为 1 时,亮度加倍(R*2,G*2,B*2)。这将产生彩色浮雕效果。不要忘记将结果限制为 0..255。如果它的上限更高。如果 (x>255) x=255;
那应该可以很好地保留颜色,但可能不完全是您所追求的。如果您希望浮雕图像中的白色不仅仅是翻倍,那么您可以尝试不同的配方。
outputR = R * (10**w); // w==0 has no effect
outputG = G * (10**w); // w==1 is 10 times brighter
outputB = B * (10**w); // w==-1 is 0.1 brightness
还有很多很多的可能性。您可以将 RGB 转换为YUV,然后将浮雕更改直接应用于 Y 组件。然后转换回RGB。
正确的选择更多的是口味问题,而不是最佳正确的配方。
完成灰色浮雕后,您可以根据浮雕的结果设置图像像素的 alpha 值。
您可以在图像上应用高通滤波器。这意味着将一个像素的值替换为该像素与下一个像素之间的绝对差。
像这样的东西:
Bitmap img = new Bitmap(100, 100); //your image
Bitmap embossed = new Bitmap(img); //create a clone
for (int i = 0; i < img.Width; i++)
{
for (int j = 0; j < img.Height; j++)
{
Color c = img.GetPixel(i, j);
Color newColor;
if ((i == img.Width - 1))
{
newColor = Color.FromArgb(0, 0, 0);
}
else
{
Color next = img.GetPixel(x + 1, y);
newColor = Color.FromArgb(
Math.Abs((byte)((int)c.R - (int) next.R)),
Math.Abs((byte)((int)c.G - (int) next.G)),
Math.Abs((byte)((int)c.B - (int) next.B)));
}
embossed.SetPixel(i, j, newColor);
}
}