如何在Image GDI上应用渐变效果

时间:2014-09-21 11:05:44

标签: c#-4.0 gdi+

如何在c#中对此图像应用渐变效果。我有一个带有黑色绘图的透明图像我想在图像上应用2色渐变这是否可以在gdi?

这是我想要实现的效果 http://postimg.org/image/ikz1ie7ip/

1 个答案:

答案 0 :(得分:0)

您创建了一个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获取transferOneARGBChannelFromOneBitmapToAneother函数:

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

你就是。 : - )