(gelöst): Transparente Farbe

Anfängerfragen zum Programmieren mit PureBasic.
Diogenes
Beiträge: 91
Registriert: 05.06.2014 10:52

(gelöst): Transparente Farbe

Beitrag 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.
Zuletzt geändert von Diogenes am 25.06.2014 18:54, insgesamt 1-mal geändert.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Transparente Farbe

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Diogenes
Beiträge: 91
Registriert: 05.06.2014 10:52

Re: Transparente Farbe

Beitrag 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 ??
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Transparente Farbe

Beitrag 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 ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Transparente Farbe

Beitrag 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"? :lol:

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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
TroaX
Beiträge: 684
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: Transparente Farbe

Beitrag 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>
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: Fritz.Box 5690 Pro (Nur für Keepass-DB)
Coding: Purebasic, Spiderbasic, GDevelop, Javascript/Node
Diogenes
Beiträge: 91
Registriert: 05.06.2014 10:52

Re: Transparente Farbe

Beitrag von Diogenes »

Hallo,
Eine Farbe als Transparent zu definieren ist veraltet!
Was ist "Paint"? :lol:
Kommt Ihr erst 'mal in meine Jahre (ü60), dann werden Eure Enkel genauso
über euch lachen :D

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.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Transparente Farbe

Beitrag 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:
Bild

Zum Dankezähler:
Warum du auf eine weiße Seite kommst weiß ich nicht, zählen tuts aber ;-)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Diogenes
Beiträge: 91
Registriert: 05.06.2014 10:52

Re: Transparente Farbe

Beitrag von Diogenes »

Hallo,
@STARGÅTE

jetzt hat's geklappt, wieder etwas gelernt, danke.
Benutzeravatar
NeoRon
Beiträge: 67
Registriert: 22.03.2013 18:56

Re: (gelöst): Transparente Farbe

Beitrag 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.
The World is Cyber
Antworten