Hallo!
Ich nehme an, es handelt sich um eine WinForms-Anwendung.
1. Ursprünglichen Hintergrund in eine Bitmap laden (HG)
- Pixelformat 24 oder 32 Bit
2. HG auf Hintergrundbild einer Picturebox zuweisen
3. Kirche mit transparentem Hintergrund in eine Bitmap laden und
auf Image-Eigenschaft der Picturebox zuweisen.
4. Den neuen Hintergrund ebenfalls in eine Bitmap laden, diese Daten sperren
(lockbits/BitmapData) und die Daten in ein Array kopieren (Marshal.Copy).
5. HG-Bilddaten sperren, Daten in ein Array kopieren und die
Horizont-Linienzeile aus dem Array unter 2 in dieses HG-Array eintragen.
HG per unlockbits entsperren und auf Picturebox-Hintergrund zuweisen.
(Vorgang zeilenweise - nach oben laufender Index - wiederholen, bis der
gesamte Himmel ausgetauscht ist.)
Prinzip:
Public Class frmBackground
Dim pb As New PictureBox With _
{.Parent = Me, .Width = 210, .Height = 200}
Dim bmp As New Bitmap _
(200, 200, Imaging.PixelFormat.Format32bppArgb)
Dim bmpFront As New Bitmap(bmp.Width, bmp.Height)
Dim WithEvents tim As New Timer With _
{.Interval = 100, .Enabled = True}
Private Sub frmBackground_Load(sender As System.Object, _
e As System.EventArgs) Handles MyBase.Load
'Blauer Hintergrund
Using gr As Graphics = Graphics.FromImage(bmp)
gr.Clear(Color.Blue)
End Using
'Roter Vordergrund (teilweise transparent)
Using gr As Graphics = Graphics.FromImage(bmpFront)
gr.Clear(Color.Transparent)
Dim rect As New Rectangle(40, 60, 50, 50)
gr.FillRectangle(New SolidBrush(Color.Red), rect)
End Using
pb.BackgroundImageLayout = ImageLayout.None
pb.BackgroundImage = bmp
pb.Image = bmpFront
Me.Show()
End Sub
Private Sub tim_Tick(sender As Object, _
e As System.EventArgs) Handles tim.Tick
Static line As Integer = bmp.Height \ 2
'Zeilenindex
line -= 1
If line < 0 Then Exit Sub
'Bitmap sperren
Dim rect As New Rectangle(New Point(0, 0), bmp.Size)
Dim bd As Drawing.Imaging.BitmapData = _
bmp.LockBits(rect, Imaging.ImageLockMode.ReadWrite, _
Imaging.PixelFormat.Format32bppArgb)
'Bitmapdaten besorgen
Dim picdata(bd.Stride * bmp.Height - 1) As Byte
System.Runtime.InteropServices.Marshal.Copy _
(bd.Scan0, picdata, 0, picdata.Length)
'Eine Zeile übertragen: Blau wird Grau
Dim index As Integer = 0
For i As Integer = 0 To bd.Stride - 1 Step 4
index = bd.Stride * line
picdata(index + i) = 128 : picdata(index + i + 1) = 128
picdata(index + i + 2) = 128
picdata(index + i + 3) = 128
Next i
System.Runtime.InteropServices.Marshal.Copy _
(picdata, 0, bd.Scan0, picdata.Length)
bmp.UnlockBits(bd)
pb.Invalidate()
End Sub
End Class |