Seite 1 von 1

Transparenz

Verfasst: 05.02.2009 22:32
von walter741
Hallo an alle Helfer in der Not

Sitze jetzt schon lange Zeit vor dem PC und durchforste dieses Forum.
Ich finde recht viel, lese recht viel und verstehe nichts.
Scheinbar bin ich zu doof dafür.

Ich lade ein Bild mit

LoadImage(22, GetGadgetItemText(#WE_ListIcon_1, GetGadgetState(#WE_ListIcon_1) , 1))

und zeige es mit

StartDrawing(WindowOutput(#Window_4))
DrawImage(ImageID(22), 60, 130 )
StopDrawing()

am Bildschirm an.

Das Bild ist ein bmp mit 100x60 Pixel
Da ist ein kleines Bild drauf. Der Hintergrund ist im Window-Grau.

Wird das Bild angezeigt so sehe ich nur das eigentliche Bild und der Hintergrung ist gleich dem Windows-Fenster.
Das Funktioniert alles sehr gut.

Wenn ich jetzt aber die Windows Darstellung zB auf Farbscheme Rosa umstelle, dann sieht man natürlich den gauen Hintergrund des Bildes.

Wie kann ich den Hintergrund Transparent machen.

Eine Idiotensichere Antwort wäre für mich vorteilhaft.

lg Walter

Verfasst: 05.02.2009 22:39
von Kaeru Gaman
schau dir mal DrawAlphaImage() an... ;)

... um das dann korrekt transparent zu bekommen,
musst du allerdings das Image in der richtige Format ändern,
also in nem Bildbearbeiter* den Hintergrund auf transparent ändern und als PNG speichern.

(* z.B. http://photofiltre.free.fr/ )

Verfasst: 05.02.2009 22:54
von man-in-black
naja, ich weis nicht, ob es was bringt,
aber du könntest auch gucken, welche Farbe das Fenster hat und das image dann mit fillarea() einfärben.

Dafür guckst du dir die Randfarbe des Images an und änderst sie jedesmal, wenn sich die Fensterfarbe ändert.

Code: Alles auswählen

...
if GetWindowColor(#Window) <> alte_fensterfarbe
  startdrawing(imageoutput(#Image))
     fillarea(1,1,-1,GetWindowColor(#Window))
  stopdrawing()
endif
...
muss aber wenn du es nimmst noch einiges anpassen,
doch damit dürften auch .bmp gehen. :allright:

Verfasst: 05.02.2009 23:03
von ts-soft
Hier eine Procedure von Mischa:

Code: Alles auswählen

Procedure DrawTransparentImage(TransImage.l, ZielImage.l, x.l, y.l, b.l, h.l, TransColor.l = #PB_Any) 
  Protected hdc.l, hzwischen.l, HdcTemp.l, obj.l, HdcBack.l, HdcObject.l, HdcMem.l, HdcSave.l
  Protected BmPAndBack.l, BmPAndObject.l, BmPAndMem.l, BmPSave.l, BmpBackOld.l, BmpObjectOld.l
  Protected BmpMemOld.l, BmpSaveOld.l, CColor.l, target.l
  
  ImageID(TransImage) : hdc = StartDrawing(ImageOutput(TransImage)) 
  hzwischen = CreateCompatibleBitmap_(hdc, b, h) : HdcTemp = CreateCompatibleDC_(hdc) 
  obj = SelectObject_(HdcTemp, hzwischen) : HdcBack = CreateCompatibleDC_(hdc) 
  HdcObject = CreateCompatibleDC_(hdc) : HdcMem = CreateCompatibleDC_(hdc) 
  HdcSave = CreateCompatibleDC_(hdc) : BmPAndBack = CreateBitmap_(b, h, 1, 1, 0) 
  BmPAndObject = CreateBitmap_(b, h, 1, 1, 0) : BmPAndMem = CreateCompatibleBitmap_(hdc, b, h) 
  BmPSave = CreateCompatibleBitmap_(hdc, b, h) : SetMapMode_(HdcTemp, GetMapMode_(hdc)) 
  BmpBackOld = SelectObject_(HdcBack, BmPAndBack) : BmpObjectOld = SelectObject_(HdcObject, BmPAndObject) 
  BmpMemOld = SelectObject_(HdcMem,BmPAndMem) : BmpSaveOld = SelectObject_(HdcSave, BmPSave) 
  SetStretchBltMode_(HdcTemp, #COLORONCOLOR) : StretchBlt_(HdcTemp, 0, 0, b, h, hdc, 0, 0, b, h, 13369376) 
  If TransColor = -1 : TransColor = GetPixel_(HdcTemp, (b - 1), 0) : EndIf 
  SetMapMode_(HdcTemp, GetMapMode_(hdc)) : BitBlt_(HdcSave, 0, 0, b, h, HdcTemp, 0, 0, $0CC0020) 
  CColor = SetBkColor_(HdcTemp, TransColor) : BitBlt_(HdcObject, 0, 0, b, h, HdcTemp, 0, 0, $0CC0020) 
  SetBkColor_(HdcTemp,RGB(255,255,255)) : Box(0, 0, b, h, GetSysColor_(#COLOR_BTNFACE))
  StopDrawing() : ImageID(ZielImage) : target = StartDrawing(ImageOutput(ZielImage)) 
  BitBlt_(HdcBack, 0, 0, b, h, HdcObject, 0, 0, $0330008) : BitBlt_(HdcMem, 0, 0, b, h, target, x, y, $0CC0020) 
  BitBlt_(HdcMem, 0, 0, b, h, HdcObject, 0, 0, $08800C6) : BitBlt_(HdcTemp, 0, 0, b, h, HdcBack, 0, 0, $08800C6) 
  BitBlt_(HdcMem, 0, 0, b, h, HdcTemp, 0, 0, $0EE0086) : BitBlt_(HdcTemp, 0, 0, b, h, HdcMem, 0, 0, $0CC0020) 
  BitBlt_(target, x, y, b, h, HdcTemp, 0, 0, $0CC0020) : StopDrawing() 
  DeleteObject_(obj) : DeleteObject_(BmpBackOld) : DeleteObject_(BmpObjectOld) : DeleteObject_(BmpMemOld) 
  DeleteObject_(BmpSaveOld) : DeleteDC_(HdcMem)  : DeleteDC_(HdcBack) : DeleteDC_(HdcObject) 
  DeleteDC_(HdcSave) : DeleteDC_(HdcTemp) : DeleteObject_(hzwischen) : DeleteObject_(BmPAndBack) 
  DeleteObject_(BmPAndObject) : DeleteObject_(BmPAndMem) : DeleteObject_(BmPSave) 
EndProcedure
Gruß
Thomas

Verfasst: 05.02.2009 23:11
von walter741
Ähhh Ja....

Danke für Eure Antworten und Codes.

Da bin ich die nächste Zeit mit Versuchen
eingedeckt.

Werde mal einiges testen.

Danke nochmals und einen schönen Abend noch!

lg Walter

Verfasst: 05.02.2009 23:14
von Kaeru Gaman
walter741 hat geschrieben:Ähhh Ja....
... war auch mein erster Gedanke beim Anblick von Mischas Code... :mrgreen:

ist halt nicht nett formatiert und kommentiert...
das wird der Funktionalität aber wohl keinen Abbruch tun.

Verfasst: 05.02.2009 23:17
von ts-soft
Kaeru Gaman hat geschrieben:
walter741 hat geschrieben:Ähhh Ja....
... war auch mein erster Gedanke beim Anblick von Mischas Code... :mrgreen:

ist halt nicht nett formatiert und kommentiert...
das wird der Funktionalität aber wohl keinen Abbruch tun.
Ich habe den Code schon nachformatiert, orginal sind die Variablen nicht
deklariert und es gibt keinerlei Spaces :mrgreen:
Trans- und Zielimage kann man ein und dasselbe nehmen, den letzten
parameter weglassen, dann sollte eigentlich jeder damit klarkommen :wink:

Verfasst: 06.02.2009 14:32
von walter741
Hallo

Dieses Ähhh Ja....

steht für den komplexen Code, den ich auch mit
optimaler Formatierung nicht sofort verstehen würde.

Ich bin ein Wochenendprogrammierer.
Mein derzeitiges Projekt hat erst 4.500 Codezeilen.
Ich werde noch einige Leben brauchen um Euch das Wasser reichen zu können.

Aber ich gebe sicher nicht auf und werde den Code von
Thomas testen.

Verfasst: 06.02.2009 15:41
von Andesdaf
> Mein derzeitiges Projekt hat erst 4.500 Codezeilen.
Soo wenig ist das ja auch nicht.