.DrawImage with opacity?

2020-01-26 12:08发布

问题:

g.DrawImage

To.. yeah, draw an image in my picturebox. Is it possible to give it an opacity attribute? I have been looking at the other versions of DrawImage but couldn't find such thing!

回答1:

You have to use a ColorMatrix to blend images. Here's a C# control I wrote a while ago, it shows you the basic code you'll need. Not VB.NET code but, hey, you didn't try real hard either:

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


回答2:

Thanks Hans Passant It is very useful! It saved my time

I've converted you code into 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