【问题标题】:how to apply gradient effect on Image GDI如何在图像 GDI 上应用渐变效果
【发布时间】:2014-10-26 23:32:30
【问题描述】:

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

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

【问题讨论】:

    标签: c#-4.0 gdi+


    【解决方案1】:

    您创建一个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 );
    

    你来了。 :-)

    【讨论】:

    • 图片不是文字??我必须在图像上应用渐变效果。
    • 它用渐变填充整个图像我想知道需要获得非透明区域图形路径然后填充该路径我不知道如何找到图像上的非透明区域
    • 它完全按照我想要的方式工作,非常感谢 Dan Bystrom
    猜你喜欢
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 2017-09-10
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    相关资源
    最近更新 更多