none
Hintergrundbild verdunkeln RRS feed

  • Frage

  • Hallo,
    Wie kann man das Hintergrunds Bild verdunkeln während man über ein Objekt fährt.

    Ich bekomme das irgendwie nicht hin

    PS: Also es soll eine Funktion sein die Universal eingesetzt werden kann denn sonst könnte ich das auch selber mittels Photoshop etc.

    Sonntag, 10. November 2013 16:52

Antworten

  • Hallo,

    was für ein Hintergrundbild meinst du denn?

    Die wohl allgemein anwendbarste Methode wäre das Bild mit GDI+ zu zeichnen und dann eine ColorMatrix anzuwenden.

    Nachfolgend ein kommentiertes Beispiel, was ich meine:

    Imports System.Drawing.Imaging
    
    Public Class Form1
    
        Private Sub Panel1_Paint(sender As Object, e As PaintEventArgs) Handles Panel1.Paint 'Paint-Event des COntrols abfangen'
            Dim img = New Bitmap("B:\Austausch\Facebook\background.png") 'Bild laden'
            Dim imageAttributes As New ImageAttributes()
            imageAttributes.SetColorMatrix(cm) 'ColorMatrix als Attribut setzen'
            e.Graphics.DrawImage(img, New Rectangle(0, 0, img.Width, img.Height), 0, 0, Width, Height, GraphicsUnit.Pixel, imageAttributes) 'Bild zeichnen'
        End Sub
    
        Private Sub Panel1_MouseEnter(sender As Object, e As EventArgs) Handles Panel1.MouseEnter
            Dim b As Single = 0.5 'Helligkeit'
            Dim c As Single = 1 'Kontrast'
            cm = New ColorMatrix({ _
               New Single() {c, 0, 0, 0, 0}, _
               New Single() {0, c, 0, 0, 0}, _
               New Single() {0, 0, c, 0, 0}, _
               New Single() {0, 0, 0, 1, 0}, _
               New Single() {b, b, b, 0, 1}}) 'Alles zurück setzen'
            'Zeilen: RotateFlipType, Grün, Blau, Alpha, Helligkeit'
            'Alles im Bereich von 0 bis 1'
            Panel1.Invalidate() 'Panel neu zeichnen'
        End Sub
    
        Dim cm As New ColorMatrix()
    
        Private Sub Panel1_MouseLeave(sender As Object, e As EventArgs) Handles Panel1.MouseLeave
            cm = New ColorMatrix() 'Alles zurück setzen'
            Panel1.Invalidate() 'Panel neu zeichnen'
        End Sub
    End Class

    Viel mehr ist unter Windows Forms auch nicht möglich.

    PS: In meinem Beispiel wird das Bild aufgehellt. Setze b auf 1 und c auf kleiner 1 um das Bild abzudunkeln.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.



    Sonntag, 10. November 2013 17:18
    Moderator
  • Ist 2 Minuten Google benutzen zuviel verlangt?

    ...siehe hier.

    Und eigentlich habe ich alles wichtige geschrieben. Wenn dir Grundwissen zu GDI+ (oder sonst was) fehlt, dann suche danach.

    WPF ist komplex und im Nachhinein weiß ich nicht ob du dir das antun solltest...

    Wie du schon geschrieben hast:

    DEIN CODE Funktioniert soweit allerdings macht der nicht da weiter wo das Panel die Picture Box bedeckt sondern zeigt das Bild von vorne an

    Dann passe meinen Code eben an!


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Sonntag, 10. November 2013 19:20
    Moderator

Alle Antworten

  • Hallo,

    was für ein Hintergrundbild meinst du denn?

    Die wohl allgemein anwendbarste Methode wäre das Bild mit GDI+ zu zeichnen und dann eine ColorMatrix anzuwenden.

    Nachfolgend ein kommentiertes Beispiel, was ich meine:

    Imports System.Drawing.Imaging
    
    Public Class Form1
    
        Private Sub Panel1_Paint(sender As Object, e As PaintEventArgs) Handles Panel1.Paint 'Paint-Event des COntrols abfangen'
            Dim img = New Bitmap("B:\Austausch\Facebook\background.png") 'Bild laden'
            Dim imageAttributes As New ImageAttributes()
            imageAttributes.SetColorMatrix(cm) 'ColorMatrix als Attribut setzen'
            e.Graphics.DrawImage(img, New Rectangle(0, 0, img.Width, img.Height), 0, 0, Width, Height, GraphicsUnit.Pixel, imageAttributes) 'Bild zeichnen'
        End Sub
    
        Private Sub Panel1_MouseEnter(sender As Object, e As EventArgs) Handles Panel1.MouseEnter
            Dim b As Single = 0.5 'Helligkeit'
            Dim c As Single = 1 'Kontrast'
            cm = New ColorMatrix({ _
               New Single() {c, 0, 0, 0, 0}, _
               New Single() {0, c, 0, 0, 0}, _
               New Single() {0, 0, c, 0, 0}, _
               New Single() {0, 0, 0, 1, 0}, _
               New Single() {b, b, b, 0, 1}}) 'Alles zurück setzen'
            'Zeilen: RotateFlipType, Grün, Blau, Alpha, Helligkeit'
            'Alles im Bereich von 0 bis 1'
            Panel1.Invalidate() 'Panel neu zeichnen'
        End Sub
    
        Dim cm As New ColorMatrix()
    
        Private Sub Panel1_MouseLeave(sender As Object, e As EventArgs) Handles Panel1.MouseLeave
            cm = New ColorMatrix() 'Alles zurück setzen'
            Panel1.Invalidate() 'Panel neu zeichnen'
        End Sub
    End Class

    Viel mehr ist unter Windows Forms auch nicht möglich.

    PS: In meinem Beispiel wird das Bild aufgehellt. Setze b auf 1 und c auf kleiner 1 um das Bild abzudunkeln.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.



    Sonntag, 10. November 2013 17:18
    Moderator
  • Entweder mache ich was falsch oder dein Code entspricht nicht ganz meinen Vorstellungen.

    Also mein Plan ist es Ein Panel über einer Picture Box nur dann anzuzeigen wenn man darüber fährt und das Panel sollte Durchsichtig sein also Transparent und im Panel soll dann die Area des Bildes von der Picture Box verdunkelt angezeigt werden welche das Panel bedeckt.

    Anderes Gesagt so eine Sache wie bei vielen Video Playern die Timeline wird ja auch hin und wieder aus oder eingeblendet wenn man was bestimmtest tut. Das selbe möchte ich auch machen Allerdings so, dass das Bild noch zu sehen ist allerdings man auch durch die Verdunklung im Panel erkennen kann , dass da was ist.

    PS: Geht es, dass man das ausblenden etwas ausfaden kann wenn du verstehst was ich meine

    DEIN CODE Funktioniert soweit allerdings macht der nicht da weiter wo das Panel die Picture Box bedeckt sondern zeigt das Bild von vorne an 



    • Bearbeitet Tobpy Sonntag, 10. November 2013 18:09
    Sonntag, 10. November 2013 18:04
  • Entweder mache ich was falsch oder dein Code entspricht nicht ganz meinen Vorstellungen.

    So ist es, wenn man nicht sagt was man will.

    Also mein Plan ist es Ein Panel über einer Picture Box nur dann anzuzeigen wenn man darüber fährt und das Panel sollte Durchsichtig sein also Transparent und im Panel soll dann die Area des Bildes von der Picture Box verdunkelt angezeigt werden welche das Panel bedeckt.

    Anderes Gesagt so eine Sache wie bei vielen Video Playern die Timeline wird ja auch hin und wieder aus oder eingeblendet wenn man was bestimmtest tut. Das selbe möchte ich auch machen Allerdings so, dass das Bild noch zu sehen ist allerdings man auch durch die Verdunklung im Panel erkennen kann , dass da was ist.

    Da es Grafisch eher aufwendig ist, würde ich das Panel komplett weg lassen und nur über GDI+ arbeiten. In meinem Code helle ich das Bild auf, sobald die Maus in die Grenzen des Panels eintritt. Beim austreten setze ich das Bild wieder zurück.  Bestimmte Bereiche kann man damit nicht ausschließen, du kannst höchstens, zusätzlich mit der FillRectangle-Methode ein halbtransparentes Viereck über das Bild zeichnen. Dadurch kannst du verschiedene Bereiche unterschiedlich behandeln.

    Wenn das Bild Standardmäßig leicht sichtbar sein soll, dann setze die Helligkeit und Kontrast herab um das Bild abgedunkelt darzustellen. Sobald die Maus darüber fährt stellst du es wieder normal dar.

    PS: Geht es, dass man das ausblenden etwas ausfaden kann wenn du verstehst was ich meine

    Das geht, beispielsweise über einen Timer der Schrittweiße den Kontrast bzw. die Helligkeit verändert. Das ist aber vergleichsweise aufwendig. Wenn deine Anwendung extrem viele solche Effekte etc. haben soll, dann siehe dir mal WPF an. Dort wäre soetwas in wenigen Zeilen abgetan.

    DEIN CODE Funktioniert soweit allerdings macht der nicht da weiter wo das Panel die Picture Box bedeckt sondern zeigt das Bild von vorne an

    Darum rate ich dir von dem Panel über der PictureBox ab. Besonders bei Transparenz hackt es des öfteren. Wenn du alles in GDI+ zeichnest (bzw. auf WPF setzt) hast du damit garantiert keine Probleme mehr. Wie gesagt, zeichne mit e.Graphics.FilleRectangle ein Halbtransparentes Rechteck anstelle des Panels.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Sonntag, 10. November 2013 18:34
    Moderator
  • Und wie mache ich sowas ??
    Sonntag, 10. November 2013 18:41
  • Ist 2 Minuten Google benutzen zuviel verlangt?

    ...siehe hier.

    Und eigentlich habe ich alles wichtige geschrieben. Wenn dir Grundwissen zu GDI+ (oder sonst was) fehlt, dann suche danach.

    WPF ist komplex und im Nachhinein weiß ich nicht ob du dir das antun solltest...

    Wie du schon geschrieben hast:

    DEIN CODE Funktioniert soweit allerdings macht der nicht da weiter wo das Panel die Picture Box bedeckt sondern zeigt das Bild von vorne an

    Dann passe meinen Code eben an!


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Sonntag, 10. November 2013 19:20
    Moderator