Transparente Grafiken

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von BitBrösel.

    Transparente Grafiken

    Hallo,

    ich möchte Schachfiguren über ein Schachbrett ziehen wie auf stappenmethode.nl/de/aufgabe-montag.php (Figuren anklicken und mit gedrückter Maustaste übers Brett ziehen).
    Ich habe eine pgn-Datei, die das Brett darstellt (hell- und dunkelgraue Felder) und 12 pgn-Dateien für die Figuren (weiß bzw. schwarz mit blauem Hintergrund, blau ist die transparente Farbe bei den pgn-Dateien).
    Ich kann die Figuren über das Brett ziehen, aber es ist immer der blaue Hintergrund zu sehen.
    Wie schaffe ich es, dass nur die Figur zu sehen ist und der blaue Hintergrund transparent ist, sodass dahinter das Brett zu sehen ist, eben wie bei o.g. Webseite?

    Vielen Dank im Voraus
    @qetu7531 Willkommen im Forum. :thumbup:
    Wenn wir nicht wissen, wie Du was (falsch) machst, können wir nur raten und Spekulatius backen.
    In so einem Fall immer den relevanten Code oder das bereinigte Projekt hochladen (gezippt ohne bin, obj und vs-Verzeichnisse).
    Erweiterte Antwort => Dateianhänge => Hochladen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Erstmal vielen Dank für die schnellen Antworten

    @BitBrösel
    Es sind natürlich PNG-Dateien (PGN sind Schachdateien, hab mich vertippt)

    Das Ziehen der Schachfiguren ist kein Problem, es geht lediglich um die Darstellung.
    Eine PNG-Datei stellt das Brett dar, eine andere eine Figur.
    Die Figur soll VOR dem Brett zu sehen sein, aber eben nur die Figur, nicht der Rest des Bildes.

    Der Code

    VB.NET-Quellcode

    1. PictureBox1.Load("C:\Schach\Figuren\Brett.png")
    2. PictureBox2.Load("C:\Schach\Figuren\Turm - nicht transparent.png")
    3. PictureBox3.Load("C:\Schach\Figuren\Turm - transparent.png")


    führt zu dem Ergebnis, das in der Datei Ergebnis.png zu sehen ist.
    Bei dem Turm links wurde blau NICHT als transparente Farbe gespeichert, deswegen ist das blau zu sehen.
    Beim Turm rechts wurde blau als transparente Farbe gespeichert, da ist wegen der Transparenz die graue Form1 zu sehen, es soll aber das Schachbrett zu sehen sein.

    Ich hoffe, das reicht zum Verständnis.
    Vielen Dank schon Mal.

    *Code-Tag eingefügt*
    Bilder
    • Brett.png

      9,08 kB, 536×536, 81 mal angesehen
    • Ergebnis.png

      8,85 kB, 1.280×960, 82 mal angesehen
    • Turm - nicht transparent.png

      1,31 kB, 67×67, 423 mal angesehen
    • Turm - transparent.png

      1,32 kB, 67×67, 464 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    qetu7531 schrieb:

    Der Code
    So geht das nicht.
    Wenn Du zwei Bilder mit Transparenz übereinander darstellen willst, musst Du das mit OwnerDrawing tun, den entsprechenden Link hat Dir @HenryV in Post #3 gegeben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Es geht doch. Hab die Lösung auf
    Transparente Grafiken übereinander setzten und zueinander bewegen
    gefunden.

    Hier der Code. Alle 100ms (in Timer1 eingestellt) wird der Turm 5 Pixel nach rechts verschoben. Es ist nur der Turm zu sehen und dahinter das Schachbrett. Das Ziehen per Maus ist dann Formsache.
    Vielen Dank für eure Mühe.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim Bild_1 As Image = Image.FromFile("C:\Schach\Figuren\Brett.png")
    3. Dim Bild_2 As Image = Image.FromFile("C:\Schach\Figuren\Turm - transparent.png")
    4. Dim Bild_1X As Long = 50
    5. Dim Bild_1Y As Long = 50
    6. Dim Bild_2X As Long = 100
    7. Dim Bild_2Y As Long = 100
    8. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    9. Me.DoubleBuffered = True
    10. End Sub
    11. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    12. Bild_2X = Bild_2X + 5
    13. Refresh()
    14. End Sub
    15. Private Sub form1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles MyBase.Paint
    16. e.Graphics.DrawImage(Bild_1, Bild_1X, Bild_1Y)
    17. e.Graphics.DrawImage(Bild_2, Bild_2X, Bild_2Y)
    18. End Sub
    19. End Class

    *Code-Tag eingefügt*

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

    qetu7531 schrieb:

    Schade, ich dachte das wäre eine simple Standardaufgabe, die schon oft aufgetreten und leicht lösbar ist, wenn man weiß, wie.


    Das ist eine simple Sache. Du musst halt nur selbst die Bildchen malen, im Paint-Event eines Forms oder Controls. Arbeite das Material von ErfinderDesRades durch, oder lass die Figuren halt springen, wobei das aber nicht dein Problem mit dem Hintergrund löst, es kommt dann ein anderes hinzu, du erkennst die Feldfarbe nicht mehr, musst dann auf Bilder mit jeweils passenden Hintergrund ausweichen. Was dazu führt, das du doppelt so viele Bilder brauchst(1x schwarzer + 1x weißer Hintergrund) dazu wieder mehr Code zum laden, alles aufwendiger zu managen. Ich täte da lieber OwnerDrawing lernen, auch für nicht Profis ist das leicht zu lernen, wenn man bereits die Grundlagen beherrscht.

    Um nur 1 Bild auf ein Form oder ein Control zu malen + ein weiteres darüber sind keine 10-15 Zeilen Code nötig. Das Bewegen/Animieren der Figuren, bzw. entfernen oder hinzufügen von Figuren ist natürlich ein wenig mehr Arbeit. Aber besser als solch ein Gefecht mit PictureBoxen wäre, OOP zu arbeiten, Klasse "Schachfeld" anlegen von Control erben lassen, Paint-Event abonnieren/überschreiben, Klasse "Schachfigur" anlegen, in der Schachfeld-Klasse eine Liste [List(of SchachFigur)] nutzen für die Schachfiguren, im Paint-Event des Schachfeld-Controls dann das Feld und die Figuren malen.