| |
VB.NET - Ein- und UmsteigerHintergrundgrafik zur Laufzeit ändern unter Berücksichtung der transparenz | | | Autor: Clichard | Datum: 12.12.12 13:18 |
| Hallo zusammen,
ich stehe bei folgendem Problem echt auf dem Schlauch und hoffe es kann jemand helfen:
1) Ein Panel enthält eine Grafik, deren obere Hälfte den Himmel, die untere Hälfte eine Landschaft zeigen.
2) Auf dieser Grafik liegen weitere Panel's (könnten auch Pictureboxen sein), welche Grafik1 als Hintergrund durchscheinen lassen.
Nun soll zur Laufzeit langsam ein neuer "Himmel" aufgezogen werden, wobei die vordergründigen Grafiken (Bäume, Gebäude etc.) nunmehr diesen, neuen Hintergrund durchscheinen lassen sollen.
Ich hoffe, ich habe das verständlich erklärt
Beitrag wurde zuletzt am 12.12.12 um 13:20:03 editiert. | |
Re: Hintergrundgrafik zur Laufzeit ändern unter Berücksichtung der transparenz | | | Autor: Manfred X | Datum: 12.12.12 20:04 |
| Hallo!
Verständlich? Nein!
Worum geht's tatsächlich?
Graphik in einen oberen und unteren Teil spalten und den oberen
sukzessive ersetzen (z.B. durch eine Bildfolge, im Sinne einer Animation)?
Verhältnis Vordergrund zu Hintergrund ändern, bzw. die Hintergrundgraphik
sukzessive durch ein zweites Bild überblenden?
Oder geht es um Transparenz? Transparente Gebäude????
Graphiksystem: GDI+, WPF, DirectX, Drittanbieter-Graphikengine?
MfG
Manfred
Beitrag wurde zuletzt am 12.12.12 um 20:06:56 editiert. | |
Re: Hintergrundgrafik zur Laufzeit ändern unter Berücksichtung der transparenz | | | Autor: Clichard | Datum: 13.12.12 10:07 |
| Erstmal danke für Deine Antwort.
Stell Dir eine Grafik vor, welche in der oberen Hälfte den Himmel abbildet und in der unteren Hälfte eine Landschaft. Darauf habe ich eine PictureBox mit transparenter Grafik gesetzt, genauer gesagt eine Kirche, deren Turm in den oberen Teil der Grafik, den Himmel ragt... bis dahin alles Bestens.
Nun soll der obere Teil der Hintergrundgrafik (der Himmel) durch einen anderen Himmel in einer separaten PictureBox zur Laufzeit getauscht werden, indem er langsam vom Horizont beginnend zum oberen Rand der Form aufgezogen wird.
Ergebnis: Die Kirche ist nunmehr, was den Hintergrund anbelangt zweigeteilt, d.h. auch der in den Himmel ragende Kirchturm erscheint weiterhin vor dem ursprünglichen Hintergrund.
Die Frage ist nun: Kann man und wie kann man diesen 3 "Schichten" eine Z-Order zuteilen, dass besagte Kirche teils vor dem ursprünglichen, teils vor dem neuen Hintergrund korrekt angezeigt wird? | |
Re: Hintergrundgrafik zur Laufzeit ändern unter Berücksichtung der transparenz | | | Autor: Manfred X | Datum: 13.12.12 11:26 |
| 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 | |
Re: Hintergrundgrafik zur Laufzeit ändern unter Berücksichtung der transparenz | | | Autor: Clichard | Datum: 21.12.12 11:29 |
| Vielen Dank für Deine detailierte Hilfe, werde ich nachher gleich mal ausprobieren.
lG Clichard | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats Neu! sevCommand 4.0
Professionelle Schaltflächen im modernen Design!
Mit nur wenigen Mausklicks statten auch Sie Ihre Anwendungen ab sofort mit grafischen Schaltflächen im modernen Look & Feel aus (WinXP, Office, Vista oder auch Windows 8), inkl. große Symbolbibliothek. Weitere Infos
|