2011-04-01 133 views
2
g.DrawImage 

要..是的,在我的图片箱中画一幅图像。是否有可能给它一个不透明属性?我一直在看着其他版本的DrawImage,但找不到这样的事情!.DrawImage不透明度?

回答

6

您必须使用ColorMatrix来混合图像。这是我刚才写的一个C#控件,它向您展示了您需要的基本代码。不VB.NET代码,但是,嘿,你没有尝试真正的硬两种:

using System; 
using System.Drawing; 
using System.Drawing.Imaging; 
using System.Windows.Forms; 

public class BlendPanel : Panel { 
    public BlendPanel() { 
     DoubleBuffered = true; 
    } 
    public Image Image1 { 
     get { return mImg1; } 
     set { mImg1 = value; Invalidate(); } 
    } 
    public Image Image2 { 
     get { return mImg2; } 
     set { mImg2 = value; Invalidate(); } 
    } 
    public float Blend { 
     get { return mBlend; } 
     set { mBlend = value; Invalidate(); } 
    } 
    protected override void OnPaint(PaintEventArgs e) { 
     if (mImg1 == null || mImg2 == null) 
      e.Graphics.FillRectangle(new SolidBrush(this.BackColor), new Rectangle(0, 0, this.Width, this.Height)); 
     else { 
      Rectangle rc = new Rectangle(0, 0, this.Width, this.Height); 
      ColorMatrix cm = new ColorMatrix(); 
      ImageAttributes ia = new ImageAttributes(); 
      cm.Matrix33 = mBlend; 
      ia.SetColorMatrix(cm); 
      e.Graphics.DrawImage(mImg2, rc, 0, 0, mImg2.Width, mImg2.Height, GraphicsUnit.Pixel, ia); 
      cm.Matrix33 = 1F - mBlend; 
      ia.SetColorMatrix(cm); 
      e.Graphics.DrawImage(mImg1, rc, 0, 0, mImg1.Width, mImg1.Height, GraphicsUnit.Pixel, ia); 
     } 
     base.OnPaint(e); 
    } 
    private Image mImg1; 
    private Image mImg2; 
    private float mBlend; 
} 
1

感谢汉斯帕桑特 这是非常有用的!它救了我的时间

我已经转换你的代码到VB

Imports System.Drawing 
Imports System.Drawing.Imaging 
Imports System.Windows.Forms 

Public Class BlendPanel 
    Inherits Panel 
    Public Sub New() 
     DoubleBuffered = True 
    End Sub 
    Public Property Image1() As Image 
     Get 
      Return mImg1 
     End Get 
     Set 
      mImg1 = value 
      Invalidate() 
     End Set 
    End Property 
    Public Property Image2() As Image 
     Get 
      Return mImg2 
     End Get 
     Set 
      mImg2 = value 
      Invalidate() 
     End Set 
    End Property 
    Public Property Blend() As Single 
     Get 
      Return mBlend 
     End Get 
     Set 
      mBlend = value 
      Invalidate() 
     End Set 
    End Property 
    Protected Overrides Sub OnPaint(e As PaintEventArgs) 
     If mImg1 Is Nothing OrElse mImg2 Is Nothing Then 
      e.Graphics.FillRectangle(New SolidBrush(Me.BackColor), New Rectangle(0, 0, Me.Width, Me.Height)) 
     Else 
      Dim rc As New Rectangle(0, 0, Me.Width, Me.Height) 
      Dim cm As New ColorMatrix() 
      Dim ia As New ImageAttributes() 
      cm.Matrix33 = mBlend 
      ia.SetColorMatrix(cm) 
      e.Graphics.DrawImage(mImg2, rc, 0, 0, mImg2.Width, mImg2.Height, _ 
       GraphicsUnit.Pixel, ia) 
      cm.Matrix33 = 1F - mBlend 
      ia.SetColorMatrix(cm) 
      e.Graphics.DrawImage(mImg1, rc, 0, 0, mImg1.Width, mImg1.Height, _ 
       GraphicsUnit.Pixel, ia) 
     End If 
     MyBase.OnPaint(e) 
    End Sub 
    Private mImg1 As Image 
    Private mImg2 As Image 
    Private mBlend As Single 
End Class