.DrawImage有不透明度?

时间:2011-04-01 23:35:52

标签: vb.net winforms visual-studio

g.DrawImage

要......是的,在我的图片框中画一幅图像。是否可以赋予它不透明度属性?我一直在寻找DrawImage的其他版本但却找不到这样的东西!

2 个答案:

答案 0 :(得分:7)

您必须使用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 :(得分:2)

感谢Hans Passant 这非常有用!它节省了我的时间

我已将您的代码转换为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