【发布时间】:2014-10-26 23:32:30
【问题描述】:
如何在 c# 中对像此图像这样的图像应用渐变效果。我有一个带有黑色绘图的透明图像我想在图像上应用 2 色渐变这在 gdi 中是否可行?
这是我想要达到的效果 http://postimg.org/image/ikz1ie7ip/
【问题讨论】:
如何在 c# 中对像此图像这样的图像应用渐变效果。我有一个带有黑色绘图的透明图像我想在图像上应用 2 色渐变这在 gdi 中是否可行?
这是我想要达到的效果 http://postimg.org/image/ikz1ie7ip/
【问题讨论】:
您创建一个PathGradientBrush,然后使用该画笔绘制文本。
要创建一个填充了渐变画笔的位图,您可以执行以下操作:
public Bitmap GradientImage(int width, int height, Color color1, Color color2, float angle)
{
var r = new Rectangle(0, 0, width, height);
var bmp = new Bitmap(width, height);
using (var brush = new LinearGradientBrush(r, color1, color2, angle, true))
using (var g = Graphics.FromImage(bmp))
g.FillRectangle(brush, r);
return bmp;
}
现在您有了一个带有渐变的图像,您所要做的就是将原始图像中的 Alpha 通道引入到新创建的图像中。我们可以从a blog post I once wrote获取transferOneARGBChannelFromOneBitmapToAnother函数:
public enum ChannelARGB
{
Blue = 0,
Green = 1,
Red = 2,
Alpha = 3
}
public static void transferOneARGBChannelFromOneBitmapToAnother(
Bitmap source,
Bitmap dest,
ChannelARGB sourceChannel,
ChannelARGB destChannel )
{
if ( source.Size!=dest.Size )
throw new ArgumentException();
Rectangle r = new Rectangle( Point.Empty, source.Size );
BitmapData bdSrc = source.LockBits( r, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb );
BitmapData bdDst = dest.LockBits( r, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb );
unsafe
{
byte* bpSrc = (byte*)bdSrc.Scan0.ToPointer();
byte* bpDst = (byte*)bdDst.Scan0.ToPointer();
bpSrc += (int)sourceChannel;
bpDst += (int)destChannel;
for ( int i = r.Height * r.Width; i > 0; i-- )
{
*bpDst = *bpSrc;
bpSrc += 4;
bpDst += 4;
}
}
source.UnlockBits( bdSrc );
dest.UnlockBits( bdDst );
}
现在您可以执行以下操作:
var newImage = GradientImage( original.Width, original.Height, Color.Yellow, Color.Blue, 45 );
transferOneARGBChannelFromOneBitmapToAnother( original, newImage, ChannelARGB.Alpha, ChannelARGB.Alpha );
你来了。 :-)
【讨论】: