2014-09-21 36 views

回答

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

,所有你需要做的就是把在阿爾法從原始圖像到新創建的圖像。我們可以從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); 

而且有你。 :-)

+0

它的圖像不是文字?我必須對圖像應用漸變效果。 – user964829 2014-09-22 15:54:22

+0

這更簡單。 – 2014-09-22 19:33:52

+0

其填充整個圖像的梯度我想知道需要得到不透明的areat graphicspath然後填充該路徑我不知道如何找到圖像上的非透明區域 – user964829 2014-09-23 15:44:56