如何在winform中删除文本上的阴影。特别是,在位图对象上绘制文本。我知道我们可以用深色绘制该文本并将其带到正确的位置,使其像阴影一样。但这个阴影看起来如此苗条和坚实。我希望它更宽广,更模糊。我发现了一些可以模糊和成像的功能。但是当我申请我的情况时,它会将透明区域变为黑色。请给我一个指南。
答案 0 :(得分:5)
作为渲染模糊阴影的替代方法,一个更加性能友好的选项可能是渲染阴影向下和向右略微偏移(如您最初建议的那样),但使用 alpha-transparency 这样阴影看起来就不那么健康":
protected void RenderDropshadowText(
Graphics graphics, string text, Font font, Color foreground, Color shadow,
int shadowAlpha, PointF location)
{
const int DISTANCE = 2;
for (int offset = 1; 0 <= offset; offset--)
{
Color color = ((offset < 1) ?
foreground : Color.FromArgb(shadowAlpha, shadow));
using (var brush = new SolidBrush(color))
{
var point = new PointF()
{
X = location.X + (offset * DISTANCE),
Y = location.Y + (offset * DISTANCE)
};
graphics.DrawString(text, font, brush, point);
}
}
}
举例说明如何从代码中调用它,例如在OnPaint
方法中:
RenderDropshadowText(e.Graphics, "Dropshadow Text",
this.Font, Color.MidnightBlue, Color.DimGray, 64, new PointF(10, 10));
要稍微改善一下,并获得更有说服力的阴影效果,我们可以修改上面的函数来模拟模糊效果,方法是将文本略微增加α透明度,一次向左,稍微一次投影右侧:
if (offset > 0)
{
using (var blurBrush = new SolidBrush(Color.FromArgb((shadowAlpha / 2), color)))
{
graphics.DrawString(text, font, blurBrush, (point.X + 1), point.Y);
graphics.DrawString(text, font, blurBrush, (point.X - 1), point.Y);
}
}
以下是结果输出的屏幕截图:
答案 1 :(得分:1)
您可以尝试使用Path
(如果您可以通过文字生成路径?)和PathGradientBrush
using (PathGradientBrush brush = new PathGradientBrush(pathShadow))
{
ColorBlend blend = new ColorBlend();
blend.Colors = new Color[] { Color.Transparent, Color.Black };
blend.Positions = new float[] { 0.0f, 1.0f };
brush.InterpolationColors = blend;
graph.FillPath(brush, pathShadow);
}
或者你可以尝试用叠加图像做一些事情(这只是一个想法,这里是一个由path
定义发光的例子):
// inside OnPaint
// overlay
using (Bitmap bmp = new Bitmap(Width, Height, PixelFormat.Format32bppArgb))
{
using (Graphics gtemp = Graphics.FromImage(bmp))
{
// fake glowing
using (LinearGradientBrush brush = new LinearGradientBrush(ClientRectangle, Color.FromArgb(200, 255, 255, 255), Color.FromArgb(0, 0, 0, 0), LinearGradientMode.Vertical))
{
brush.SetBlendTriangularShape(0.5f, 1.0f);
gtemp.FillPath(brush, path);
}
// draw on screen
e.Graphics.DrawImage(bmp, 0, 0);
}
}
答案 2 :(得分:0)
我知道答案可能没有任何帮助,但如果它只是静态文本而是使用图像