Bitmap transparent malen, Hintergrundfarbe herausfinden ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Bitmap transparent malen, Hintergrundfarbe herausfinden ?

Beitrag von hjbremer »

Hab da mal eine Anfängerfrage. Irgendwie Brett vorm Kopf.

Um ein Bitmap transparent zu malen gibt es diverse Beispiele und davon gefällt mir TransparentBlt_ am besten. Aber irgendwie finde ich nix wie man die Hintergrundfarbe herausfindet. Wohl die falschen Suchbegriffe.

Habe es mit einem Dummy Createimage gelöst, welches gleich wieder gelöscht wird.

Aber das geht doch sicher einfacher oder ?

Hier mein Beispielcode:

Code: Alles auswählen

Prototype TransparentBlt(a,b,c,d,e,f,g,h,i,j,k) 
msimg32 = OpenLibrary(#PB_Any, "msimg32.dll") 
If msimg32 
  Global TransparentBlt_.TransparentBlt = GetFunction(msimg32, "TransparentBlt") 
EndIf 

Procedure Api_Farbverlauf(dc,br,hh,farbe0,farbe1,flag=1)

 ;http://msdn2.microsoft.com/en-us/library/ms532338(VS.85).aspx
 
 ;flag=0 = #GRADIENT_FILL_RECT_H          
 ;flag=1 = #GRADIENT_FILL_RECT_V  
    
  Dim t_vertex.TRIVERTEX(1) 
  
  ;t_vertex(0)\x + y ist eh immer null
  
  t_vertex(0)\Red   = Red(farbe0)  <<8
  t_vertex(0)\Green = Green(farbe0)<<8
  t_vertex(0)\Blue  = Blue(farbe0) <<8 
  t_vertex(1)\x     = br 
  t_vertex(1)\y     = hh 
  t_vertex(1)\Red   = Red(farbe1)  <<8 
  t_vertex(1)\Green = Green(farbe1)<<8 
  t_vertex(1)\Blue  = Blue(farbe1) <<8 

  g_rect.GRADIENT_RECT 
  g_rect\UpperLeft  = 0 
  g_rect\LowerRight = 1
  
  Gradientfill_(dc, @t_vertex(), 2, @g_rect, 1, flag) 

EndProcedure

;es geht los==============================================

bmpnr = LoadImage(#PB_Any, #PB_Compiler_Home+"\Examples\Sources\Data\purebasiclogo.bmp")
bmpid = ImageID(bmpnr)
bmpbr = ImageWidth(bmpnr)
bmphh = ImageHeight(bmpnr)

flag = #PB_Window_SystemMenu|1|#PB_Window_Invisible
hwnd = OpenWindow(0,0,0,400,400,"Test",flag) 
       CreateGadgetList(hwnd)
       
       ;nur um die Hintergrundfarbe herauszufinden  <------      
            CreateImage(0,bmpbr,bmphh)
            StartDrawing(ImageOutput(0))
                              
              DrawImage(bmpid,0,0)            
              HgFarbe = Point(0, 0)
            
            StopDrawing()
       
            FreeImage(0)        
       
       ;Logo mit neuem Hintergrund
       br1 = 350  
       hh1 = 100  

       id1 = CreateImage(1,br1,hh1)
       dc1 = StartDrawing(ImageOutput(1))
                              
            ;Box(0,0,br1,hh1,#Blue)
            ;oder
            Api_Farbverlauf(dc1,br1,hh1,#Blue,#Red)
            
            dcSource = CreateCompatibleDC_(dc) 
            SelectObject_(dcSource, bmpid) 
            
            ;TransparentBlt_(dc1, 0,0, bmpbr, bmphh, dcSource, 0, 0, bmpbr, bmphh, farbe)
            ;oder etwas versetzt 
            TransparentBlt_(dc1, 0,20, bmpbr, bmphh, dcSource, 30, 0, bmpbr-30, bmphh, HgFarbe) 
            
            DeleteObject_(dcSource)  ;wichtig ! wenn es nicht mehr gebraucht wird
                        
            StopDrawing()
            
       ImageGadget(1,10,90, 0,0,id1)
       
       ;Window anzeigen      
       HideWindow(0,0)
       
Repeat: event = WaitWindowEvent() 
   
  If Event = #PB_Event_Gadget Or Event = #PB_Event_Menu 
          
      welcherButton=EventGadget()  
      
      Select welcherButton
            Case 1: Debug "Button 1 gedrückt"
            Case 2: Debug "Button 2 gedrückt"
      EndSelect
            
  EndIf

Until event = #PB_Event_CloseWindow 

End 
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

Könnte Dir das hier weiterhelfen ?
http://msdn2.microsoft.com/en-us/library/ms534868.aspx
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

@scholly:
Nein, das ermittelt nur die Hintergrund Farbe für die GDI Zeichenbefehle.

@hjbremer:
Ich verstehe nicht wo das Problem ist. Was suchst du denn genau? Sowas wie einen FindeTransparenteFarbe() Befehl gibt es nicht. Woher soll man wissen welche Bereiche in einem Bild der Anwender als tranparent behandeln möchte?

Normalerweise geht man das auch anders an. Wenn z. B. ein Spiel programmiert und mehere transparent Bilder hat legt man die Frabe vorher fest. Außerdem funktioniert deine Methode nur wenn sich auf Position 0,0 auch tasächlich die transparent Farbe befindet.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: Bitmap transparent malen, Hintergrundfarbe herausfinden

Beitrag von PMV »

hjbremer hat geschrieben:Hab da mal eine Anfängerfrage. Irgendwie Brett vorm Kopf.

Um ein Bitmap transparent zu malen gibt es diverse Beispiele und davon gefällt mir TransparentBlt_ am besten. Aber irgendwie finde ich nix wie man die Hintergrundfarbe herausfindet. Wohl die falschen Suchbegriffe.
Transparente Farbe einer Bmp? :?
Eine Bmp hat als solche keine "transparente Farbe" definiert, die definiert
der Programmierer selber, so wie du es in deinem Beispiel gemacht hast.
Dort soll der erste Pixel 0,0 die transparente Farbe selber definieren ...

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ich muss euch in sofern korrigieren, dass es tatsächlich ein BMP-format gibt,
das eine farbe als transparenz trägt.
da waren bei beispielprogs vom VB4 oder so, BMPs dabei,
die eine transparente farbe hatten.
es gab auch im paint ein flag "transparent", das aber in win2k nicht mehr zu aktivieren war.
also ein format, das Billie ausgesondert hat, womöglich weil es zu viel möglichkeiten geboten hätte.

aber heute wird transparenz bei einer bitmap bei der darstellung festgelegt,
also eine bestimmte farbe als transparent definiert,
in so fern habt ihr recht.

.....wollte nur ma nen geschichts-exkurs einbringen... baba
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Re: Bitmap transparent malen, Hintergrundfarbe herausfinden

Beitrag von scholly »

hjbremer hat geschrieben:Habe es mit einem Dummy Createimage gelöst, welches gleich wieder gelöscht wird.

Aber das geht doch sicher einfacher oder ?
Ersetz doch einfach mal

Code: Alles auswählen

CreateImage(0,bmpbr,bmphh)
StartDrawing(ImageOutput(0))
DrawImage(bmpid,0,0)           
HgFarbe = Point(0, 0)
StopDrawing()
FreeImage(0)
durch

Code: Alles auswählen

StartDrawing(ImageOutput(bmpnr))
    HgFarbe = Point(0, 0)
StopDrawing()
Bei mir wird das Ergebnis gleich.

Und noch ne Frage: Wozu brauchts den code vor der proc ?
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

ja ja ich weiß das alles, mehr oder weniger

ich suche eine einfachere Möglichkeit auf Pixel 0,0 des geladenen BMPs zu zugreifen

also etwas was den folgenden Schnipsel ersetzt

Code: Alles auswählen

;nur um die Hintergrundfarbe herauszufinden  <------      
            CreateImage(0,bmpbr,bmphh)
            StartDrawing(ImageOutput(0))
                              
              DrawImage(bmpid,0,0)            
              HgFarbe = Point(0, 0)
            
            StopDrawing()
       
            FreeImage(0)  
das ist mir zu unprofessionell, sieht so komisch aus

und BMPs deswegen weil ich keine Lust habe diese in Icons umzuwandeln oder eine Imagelist anzulegen. Maskieren ist mir zu aufwändig. Der schwarze Hintergrund/Rahmen oder wie auch immer soll weg. und dazu brauche ich die Farbe von Pixel 0,0

Ein Beispiel:
Wenn ich mit Drawimage einen Kreis male, lege ich den Hintergrund mit Box() selbst fest. Ich speicher dieses Image.
Und wenn ich es wieder lade und auf einen Button mit einem x-beliebigen Hintergrund lege, muß der Hintergrund vom Image weg.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

Hat sich das überschnitten, weil Du meine Kürzung nicht ansprichst bzw meine Frage nicht beabtwortest?

Oder magst Du mich nich mehr? :cry:
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

Ah Scholly, eben sehe ich dein Code,

das ist eine Idee, echt gut, schon besser als mein Code.

Das ist die Sache mit den Bäumen und dem Wald.

Aber wie wärs mit einem kleinen Speichzugriff aufs geladene Bild als I-Tüpfelchen

Und der Code vor der Prozedur wird gebraucht, damit TransparentBlt_ korrekt funktioniert. Früher gingte das auch einfacher, aber mit PB 4.1 muß das wohl so eingebunden werden. Sonst gibts es bei mir Polink Errors. Denn TransparentBlt_ kennt PB sonst nicht.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

hjbremer hat geschrieben:ja ja ich weiß das alles, mehr oder weniger
Jaja heißt leck mich am Arsch. Bild
hjbremer hat geschrieben:ich suche eine einfachere Möglichkeit auf Pixel 0,0 des geladenen BMPs zu zugreifen
Der Dreizeiler von Scholly ist genau das was du suchst. Kürzer geht's kaum.
hjbremer hat geschrieben:das ist mir zu unprofessionell, sieht so komisch aus
Was genau ist daran unprofessionell?
Windows 10 Pro, 64-Bit / Outtakes | Derek
Antworten