用c程序实现位图而不丢失颜色



我想在位图上应用浮雕和草图效果,而不会丢失其颜色。我已经应用了颜色效果,但在浮雕方面还没有运气。

有人能解决这个问题吗?请帮助

您可以对图像应用高通滤波器。这意味着用像素和下一个像素之间的绝对差替换像素的值。

类似这样的东西:

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

完成灰色浮雕时,可以根据浮雕的结果设置图像像素的alpha值。

将其视为两个操作。首先,生成灰色浮雕图像(你说你已经实现了),然后为了制作彩色浮雕图像,你在原始图像和浮雕图像之间进行混合操作。使用哪种操作形式没有唯一正确的选择。归根结底就是你希望达到什么样的效果。

如果你假设你有一个彩色图像(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。

正确的选择更多的是口味问题,而不是最佳的正确配方。

最新更新