Seite 1 von 1

selbst erstelltes Image mit transparentem Hintergrund

Verfasst: 25.11.2010 00:13
von Sunny
Mahlzeit @all,
ich wollte mal fragen, wie es möglich ist ein selbst erstelltes Image mit einem transparentem Hintergrund zu speichern.

Ich hab hier bis jetzt folgenden Code...

Code: Alles auswählen

UsePNGImageDecoder()
UsePNGImageEncoder()

File$="C:\transparent.png"

CreateImage(0,240,240,32)

StartDrawing(ImageOutput(0))
  
  LineXY(10,10,10,220,RGB(0,255,255))
  LineXY(10,120,220,10,RGB(0,255,255))
  LineXY(10,120,220,220,RGB(0,255,255))

StopDrawing()
  
SaveImage(0,File$,#PB_ImagePlugin_PNG)
Bis jetzt hat das Bild allerdings nur einen schwarzen Hintergrund...
Was muss jetzt noch mit dazu kommen, damit der Hintergrund Transparent wird?

Hab schon in der PB-Hilfe nachgesehen, aber das hat mir irgendwie nicht weiter geholfen.

Re: selbst erstelltes Image mit transparentem Hintergrund

Verfasst: 25.11.2010 00:17
von STARGÅTE
Hab schon in der PB-Hilfe nachgesehen, aber das hat mir irgendwie nicht weiter geholfen.
Scheinbar sehr sehr oberflächlich ...
CreateImage()

Steht eindeutlig da:
Der 'Tiefe'-Wert kann mit #PB_Image_Transparent kombiniert werden (mit dem bitweisen oder dem '|' Operator), um ein Bild zu erstellen, bei dem der Alpha-Kanal auf völlige Transparenz gesetzt ist.

Re: selbst erstelltes Image mit transparentem Hintergrund

Verfasst: 25.11.2010 07:38
von Sunny
Naja, ich hab da schon so einiges aus der Hilfe ausprobiert, aber leider funktioniert nichts so, wie es soll...

Genau wie in diesem fall, denn wenn ich #PB_Image_Transparent nutze, dann wird das komplette Bild Transparent (d.h. auch die blauen Striche sind nicht mehr zu sehen).

Re: selbst erstelltes Image mit transparentem Hintergrund

Verfasst: 25.11.2010 08:18
von PureLust
Hi Sunny,

Du musst zuvor noch "DrawingMode(#PB_2DDrawing_AllChannels)" setzen, damit bei den gezeichneten Pixeln auch der AlphaChannel mit beschrieben wird.

Re: selbst erstelltes Image mit transparentem Hintergrund

Verfasst: 25.11.2010 10:46
von Thorium
PureLust hat geschrieben:Hi Sunny,

Du musst zuvor noch "DrawingMode(#PB_2DDrawing_AllChannels)" setzen, damit bei den gezeichneten Pixeln auch der AlphaChannel mit beschrieben wird.
Er legt doch garkeinen Alphawert fest. Er legt mit RGB einen Farbwert ohne Transparenzangabe fest. Damit kann PB logischerweise nur setzten das entweder komplett transparent ist oder garnicht.

Nutze nicht RGB, sondern direkt 4 bytes Hexwerte und damit dann auch den Alphakannal.

Re: selbst erstelltes Image mit transparentem Hintergrund

Verfasst: 25.11.2010 11:00
von PureLust
Thorium hat geschrieben:Er legt doch garkeinen Alphawert fest. Er legt mit RGB einen Farbwert ohne Transparenzangabe fest. Damit kann PB logischerweise nur setzten das entweder komplett transparent ist oder garnicht.
Nicht ganz. Siehe Doku zu DrawingMode():
PB Dokumentation hat geschrieben:#PB_2DDrawing_Default
Dies ist der Standard-Zeichenmodus, wenn das Zeichnen beginnt. Text wird mit festem Hintergrund dargestellt und Grafikflächen werden ausgefüllt. Wenn die aktuelle Ausgabe einen Alpha-Kanal hat, verändern die Zeichen-Operationen nur die Farb-Bestandteile und lassen den Alpha-Kanal unverändert.
Somit bleibt beim Default-Modus der Alpha-Kanal stets auf durchsichtig gesetzt.

Um auch in den Alpha-Kanal schreiben zu können muss DrawingMode() zuvor auf #PB_2DDrawing_AllChannels gesetzt werden.
Erst dann kann durch Angabe eines RGBA()-Farbwertes auch der Alpha-Kanal beschrieben werden.
PB-Dokumentation hat geschrieben:#PB_2DDrawing_AllChannels
Die Zeichenoperationen werden die Farb-Kanäle und den Alpha-Kanal der Zeichenausgabe verändern. Der Inhalt der Kanäle wird ohne jegliches Vermischen ("Blending") durch die Zeichenoperation ersetzt. Das Zeichnen in diesem Modus hat den gleichen Effekt, wie zuerst mittels dem #PB_2DDrawing_Default Modus zu zeichnen, und dann nochmals die gleiche Zeichenoperation mittels dem #PB_2DDrawing_AlphaChannel Modus. Wenn die Zeichenausgabe keinen Alpha-Kanal besitzt, dann entspricht dieser Modus dem #PB_2DDrawing_Default Modus.

Re: selbst erstelltes Image mit transparentem Hintergrund

Verfasst: 25.11.2010 22:28
von Riacon
ein kleines beispiel, um mal mit rumzuspielen:

Code: Alles auswählen

If CreateImage(1,700,500,32|#PB_Image_Transparent)
	StartDrawing(ImageOutput(1))
	DrawingMode(#PB_2DDrawing_AlphaBlend)
	For i=0 To 70
		For j=0 To 50
			Box(i*10,j*10,10,10,RGBA(i*3,j*5,0,2*(i+j)))
		Next
	Next	
	StopDrawing()
EndIf

OpenWindow(0,0,0,800,600,"test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ImageGadget(1,50,50,700,500,ImageID(1))
SetWindowColor(0, $123456) 

StartDrawing(WindowOutput(0))
	DrawImage(1,0,0,800,600)
StopDrawing()

Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow:End

Re: selbst erstelltes Image mit transparentem Hintergrund

Verfasst: 26.11.2010 14:39
von bobobo
#PB_2DDrawing_AlphaBlend kann durchaus mit #PB_2DDrawing_Gradient
verknüpft werden mit dem Effekt dass man sich das Boxgegurke sparen kann
also

Code: Alles auswählen

If CreateImage(1,700,500,32|#PB_Image_Transparent)
   StartDrawing(ImageOutput(1))
     DrawingMode(#PB_2DDrawing_Gradient|#PB_2DDrawing_AlphaBlend)      
      BackColor($0000FF00):   FrontColor($FF000000)
      LinearGradient(0,0,3500,2500)
      Box(10,10,680,480)
   StopDrawing()
EndIf

OpenWindow(0,0,0,800,600,"test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ImageGadget(1,50,50,700,500,ImageID(1))
SetWindowColor(0, $123456) ;Achtung !! kackefarben , blauer wär $654321

StartDrawing(WindowOutput(0))
   DrawImage(1,0,0,800,600)
StopDrawing()

Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow:End

Re: selbst erstelltes Image mit transparentem Hintergrund

Verfasst: 26.11.2010 16:05
von Häns
Danke, Bo³!

Du hast mir damit aus der Boxgegurge in dem Thread geholfen! :allright:

Häns