Seite 1 von 2
(gelöst): Transparente Farbe
Verfasst: 25.06.2014 12:09
von Diogenes
Hallo,
wie teile ich PB mit, dass eine bestimmte Farbe hier rgb(255,0,255)
transparent sein soll.
Konkret:
Ich habe ein rechteckiges Bild eingelesen. Die Hintergrundfarbe des Rechtecks
ist pink - siehe oben. Der Vordergrund besteht aus Symbolen mit verschiedenen
Farben. Ich will das Bild jetzt mit DrawImage(drawimageID(bildnummer),x,y) darstellen,
so, dass der pinke Hintergrund des Bildes nicht mehr sichtbar ist.
Ich habe schon mit RGBA, Alpablend, usw rumprobiert, aber da habe ich noch nicht den
Durchblick.
Danke im voraus.
p.s. das Bild wird in einem Canvas dargstellt und es ist kein Sprite, wo man das mit
transparentSpriteColor oder so festlegen kann.
Re: Transparente Farbe
Verfasst: 25.06.2014 12:48
von STARGÅTE
Diese Funktion ist wie du schon selbst geschrieben hast, nur in Sprites verfügbar.
Wenn es möglich ist, solltest du ein 32-Bit Image verwenden und deine Farbe "echt" transparent machen.
Dann kannst du das Image mit DrawingMode(#PB_2DDrawing_AlphaBlend) auch transparent darstellen.
Andern Falls kannst du auch mit CustomFilterCallback arbeiten:
Code: Alles auswählen
EnableExplicit
Global TransparentDrawingColor.i
Procedure.i TransparentDrawingColor_Callback(X.i, Y.i, Front.i, Back.i)
If Front & $FFFFFF = TransparentDrawingColor
ProcedureReturn Back
Else
ProcedureReturn Front
EndIf
EndProcedure
Procedure TransparentDrawingColor(Color.i)
TransparentDrawingColor = Color & $FFFFFF
DrawingMode(#PB_2DDrawing_CustomFilter)
CustomFilterCallback(@TransparentDrawingColor_Callback())
EndProcedure
Enumeration
#Window
#Gadget
#Image
EndEnumeration
CreateImage(#Image, 128, 128, 24, $FF00FF) ; Pinker Hintergrund
If StartDrawing(ImageOutput(#Image))
Circle(64, 64, 48, $00FF00) ; grüner Kreis
StopDrawing()
EndIf
OpenWindow(#Window, 0, 0, 800, 600, "WindowTitle", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
CanvasGadget(#Gadget, 0, 0, WindowWidth(#Window), WindowHeight(#Window))
If StartDrawing(CanvasOutput(#Gadget))
DrawImage(ImageID(#Image), 64, 64)
TransparentDrawingColor($FF00FF) ; Pinkt transparent machen für alle folgenden Draws
DrawImage(ImageID(#Image), 256, 64)
StopDrawing()
EndIf
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Re: Transparente Farbe
Verfasst: 25.06.2014 13:04
von Diogenes
Hallo STARGÅTE,
danke, das ist genau das, was ich wollte. Ich werde versuchen,
Deinen Code für meine Zwecke anzupassen.
Bin Ich eigentlich nur so ein Wundertier oder ist PureBasic und seine Nutzer so seltsam ?
Alle Funktionen, die in anderen Sprachen gang und gäbe sind,
(Tastatursteuerung, Farbtransparenz) sind in PB nicht implementiert oder nur umständlich
zu erreichen. Ich fand PB am Anfang gerade wegen seiner Mächtigkeit und Nähe zur
WINApi gut. Mittlerweile merke ich aber, wie viele Probleme ich damit habe.
Ich werde weiter kämpfen. Danke schön auf jeden Fall.
Wenn es möglich ist, solltest du ein 32-Bit Image verwenden und deine Farbe "echt" transparent machen.
Wie mache ich denn eine Farbe echt transparent, wenn ich ein Bildchen mit Paint zeichne ??
Re: Transparente Farbe
Verfasst: 25.06.2014 13:26
von Bisonte
Als BMP speichern geht da schonmal nicht. PNG ist das Format, weil 32 Bit den Alphakanal beinhalten.
Diese sind auch mit dem entsprechenden Plugin leicht einzulesen. Allerdings weiss ich nicht wo man das bei Paint macht,
bzw. ob der ueberhaupt als PNG abspeichern kann.
Ich nutze Gimp. Kostenlos und hat soviel Funktionen, dass ich wohl noch 2 weitere Leben brauche um die alle zu entdecken

Re: Transparente Farbe
Verfasst: 25.06.2014 13:31
von STARGÅTE
Diogenes hat geschrieben:Alle Funktionen, die in anderen Sprachen gang und gäbe sind,(Tastatursteuerung, Farbtransparenz) sind in PB nicht implementiert oder nur umständlichzu erreichen. Ich fand PB am Anfang gerade wegen seiner Mächtigkeit und Nähe zur WINApi gut. Mittlerweile merke ich aber, wie viele Probleme ich damit habe. Ich werde weiter kämpfen. Danke schön auf jeden Fall.
Nun ich kann diesen Ball auch zurückspielen und dich fragen wieso du noch "umständliche" 24-Bit Images nutzt und nicht 32-Bit Images, die in zwischen "gang und gäbe" sind.
Eine Farbe als Transparent zu definieren ist veraltet!
Diogenes hat geschrieben:Wie mache ich denn eine Farbe echt transparent, wenn ich ein Bildchen mit Paint zeichne ??
Was ist "Paint"?
Wenn du ein richtiges Grafikprogramm (Photoshop, Gimp, Paint.net) nutzt, dann kannst du dort einen Alpha-Kanal hinzufügen.
Danach kannst du deine Bereiche Transparent machen, indem der Alpha-Wert dort 0 ist.
Re: Transparente Farbe
Verfasst: 25.06.2014 13:51
von TroaX
<OFFTOPIC>
Ich würde Paint.NET nehmen. GIMP ist dafür zu mächtig, was sich auch in der Laufzeitperformance niederschlägt. Auch wenn es gut ist. GIMP brauch wirklich lange beim Start, bis es verwendbar ist. Deswegen nutze ich Paint.NET für solche Kleinigkeiten. Gerade wenn man das mit mehreren Dateien machen muss

</OFFTOPIC>
Re: Transparente Farbe
Verfasst: 25.06.2014 15:06
von Diogenes
Hallo,
Eine Farbe als Transparent zu definieren ist veraltet!
Was ist "Paint"?
Kommt Ihr erst 'mal in meine Jahre (ü60), dann werden Eure Enkel genauso
über euch lachen
Ich habe also paint.net geladen, die pinken Bereiche übermalt mit AlphaChannel 0
(sieht aber immer noch pink aus), als 32 bit png abgespeichert , habe das png-plugin in
pb geladen und alle möglichen Drawing-Modes ausprobiert
Ergebnis alles bleibt schön pink mit Ausnahme von
DrawingMode(#PB_2DDrawing_AlphaChannel) , da verschwindet dann das ganze Bild.
Code: Alles auswählen
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure ZE_PUNKT(sp,nr,art)
; Stichpunkte anzeigen
; art 8=grau; 9=gelb als Stich
StartDrawing(CanvasOutput(#cv001))
;DrawingMode(#PB_2DDrawing_AlphaBlend)
;DrawingMode(#PB_2DDrawing_AllChannels)
DrawingMode(#PB_2DDrawing_AlphaClip)
;DrawingMode(#PB_2DDrawing_AlphaChannel)
;DrawingMode(#PB_2DDrawing_XOr)
;RGBA(255,0,255,0)
If sp=1
If nr=1 :DrawAlphaImage(ImageID(art),508,318):EndIf
If nr=2 :DrawImage(ImageID(art),618,318):EndIf
If nr=3 :DrawImage(ImageID(art),728,318):EndIf
If nr=4 :DrawImage(ImageID(art),838,318):EndIf
EndIf
; --
If sp=2
If nr=1 :DrawImage(ImageID(art),508,370):EndIf
If nr=2 :DrawImage(ImageID(art),618,370):EndIf
If nr=3 :DrawImage(ImageID(art),728,370):EndIf
If nr=4 :DrawImage(ImageID(art),838,370):EndIf
EndIf
StopDrawing()
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Und nu ??
p.s. kann mir auch noch bitte einer erklären, wie die danke-Funktion hier im Board funktioniert
Ich habe schon mehrfach bei verschiedenen Hilfestellern auf den Dabke-Knopf gedrückt, dann werdeich umgeleitet auf eine weiße Seite und sonst passiert nichts. Auch der Danke-Zähler bei
dem Betreffenden geht nicht rauf.
Re: Transparente Farbe
Verfasst: 25.06.2014 15:16
von STARGÅTE
Diogenes hat geschrieben:Ich habe also paint.net geladen, die pinken Bereiche übermalt mit AlphaChannel 0
Übermalen mit AlphaChannel 0 bingt nichts, denn dann malst du ja transparente Farbe auf dein Pink, also bleibts pink.
Wenn du dein Image geladen hast, musst du erst mal einen Alpha-Kanal hinzufügen (wir das Bild ja nicht von anfang an haben, wenns n BMP ist).
Dann kannst du deine pinken Bereiche auswählen (zB mit einem Zauberstift, der alle gleichen Farben umrandet).
Dann kannst du diese Bereiche löschen, dann sollte die Farbe komplett weg sein, und so n Schachbrett erscheinen:
Zum Dankezähler:
Warum du auf eine weiße Seite kommst weiß ich nicht, zählen tuts aber

Re: Transparente Farbe
Verfasst: 25.06.2014 16:03
von Diogenes
Hallo,
@STARGÅTE
jetzt hat's geklappt, wieder etwas gelernt, danke.
Re: (gelöst): Transparente Farbe
Verfasst: 27.07.2014 03:52
von NeoRon
Hallo, ich weis nicht obs dir was bringt oder ob ich nach dem der thread gelöst wurde total am Thema vorbeischieße aber es gibt auch noch diesen befehl der aber wiederum die Intensität des kompletten sprites ändert
DisplayTranslucentSprite(#Sprite, x, y, Intensitaet)
dort ist die Transparenz implementiert und ist kein drawingmode von nöten.