Seite 2 von 2

Verfasst: 20.12.2005 23:43
von Mischa
Eine Kombination von rechteckigen Regionen als Resultat der
Bildanalyse auf Pixelbasis.

So funktionieren diese Routinen eigentlich alle. Auch die SkinWin
funktioniert so. Ich nehme an SkinWinFast wird bei der Masken-
Erstellung nach dem gleichen Schema verfahren. (Wobei dann das
Ergebnis allerdings gespeichert wird, also die Region. API bietet
da so Möglichkeiten)

Was die Analyse so langsam macht ist, das für jeden gefunden Pixel
eine kleine 1 Pixel-große Region erstellt und diese dann mit der
"Summen-Region" kombiniert wird.

Meine Funktion erstellt im Gegensatz dazu erst dann eine neue
"Zwischen"-Region, wenn die transparente Pixel-Folge unterbrochen wird.


Standard-Methode: ..... .... .....
Meine Methode: ___ __ __


Es gibt eine noch (wesentlich) schnellere Methode, wenn man nur eine Umriss-Region
erstellt. (Allerdings darf das Hintergrundbild dafür keine "Löcher" aufweisen.
Ein Beispiel dafür habe ich mal im Vor-Vor-Forum gepostet.
(Allerdings gibts dafür ja kein Archiv :cry: )

Hatte damals aber keinen so richtig interessiert (ausser Danilo), glaube. Falls jemand aber
heute an einer ultra-schnellen Maskierung dieser Art Interesse, hat würde ich
mal kramen und das mit in die Lib reintuen.

Gruß,
Mischa

Verfasst: 21.12.2005 00:17
von Lukaso
Ich glaube, dass ich genau das was ich brauche um meinen Player animierte und transparente Skins zu geben :mrgreen:

Danke, super sache, mehr gibts dazu nicht zu sagen :allright:

Lukas

Verfasst: 21.12.2005 14:30
von Danilo
Mischa hat geschrieben:Was die Analyse so langsam macht ist, das für jeden gefunden Pixel
eine kleine 1 Pixel-große Region erstellt und diese dann mit der
"Summen-Region" kombiniert wird.

Meine Funktion erstellt im Gegensatz dazu erst dann eine neue
"Zwischen"-Region, wenn die transparente Pixel-Folge unterbrochen wird.


Standard-Methode: ..... .... .....
Meine Methode: ___ __ __
Du kannst das doch auch direkt in PBOSL-SkinWin einbauen.
Also SkinWin() ändern/anpassen, anstatt jetzt extra eine
neue Lib zu machen mit SkinWindow().

Dafür müßte es nur kompatibel sein:
SkinWin(hWnd, hBitmap) ; Transparente Farbe ist Pixel 0,0
SkinWin(hWnd, hBitmap, x, y) ; Transparente Farbe ist Pixel x,y

Ich denke aber das ist kein Problem. Wenn Du jetzt die rechte
obere Ecke als Transparenzfarbe nimmst, passt Du es halt an
den Standard 0,0 an und erlaubst noch optional x,y.

Mich geht das eigentlich nichts an, aber ich finde es seltsam
das ihr als Community nicht etwas mehr zusammenarbeitet.
Jeder will sein eigenes Ding machen und es kommen 500 Mini-Libs
raus, anstatt ein großes Paket (wie PBOSL) zu schnüren.
Für den Endanwender ist es doch besser wenn er sich nicht
alle Libs zusammensuchen muß, sondern einfach ein Komplett-
paket benutzen kann, oder nicht?

Schöne Weihnachten und frohes Fest!

Verfasst: 21.12.2005 15:17
von bobobo
Die Dokumentation der Lib würde ich übernehmen ..
als Weihnachtsgeschenk sozusagen

hab das Hroudtwolfdemo mal etwas angepasst (nutzt nun auch test.bmp)
zum SpeedVergleich .. das "Hroudtwolfsche" ist auch 'n ganzen Zacken
fixer

Code: Alles auswählen

; Fenster anhand von transparenter Farbe zum Bitmap zuschneiden
; 2005 Hroudtwolf
; PureBasic-Lounge.de

Declare CutOnTransparenceColor(win.l,color.l)
#WS_EX_LAYERED = $00080000
Enumeration
  #Window
  #image
EndEnumeration

LoadImage(#image,"test.bmp")
StartDrawing(ImageOutput())
color=Point(1,1)
StopDrawing()

If OpenWindow(#Window, 0, 0, ImageWidth(), ImageHeight(), #PB_Window_ScreenCentered|#WS_POPUP, "Transparente Farbe")
  
  ;----------------------------------------------------------------
  ; Setzen des Hintergundbildes
  hBrush.l = CreatePatternBrush_(UseImage (#image))
  SetClassLong_(WindowID(#Window), #GCL_HBRBACKGROUND, hBrush.l)
  InvalidateRect_(WindowID(#Window), #Null, #True)
  ;----------------------------------------------------------------
  
  
  CutOnTransparenceColor(#Window,color) ; Die Farbe rgb (255,0,255) auf transparent setzen
  
  Repeat
    EventID = WaitWindowEvent()
    If eventID=#WM_LBUTTONDOWN
      SendMessage_(WindowID(#Window),#WM_NCLBUTTONDOWN, #HTCAPTION,0)
    EndIf
    If EventID = #PB_Event_CloseWindow  Or EventID=#WM_RBUTTONDOWN
      Quit = 1
    EndIf
  Until Quit = 1
EndIf
End


Procedure CutOnTransparenceColor(win.l,color.l)
  Library.l = LoadLibrary_("user32.dll")
  If Library.l
    adress.l = GetProcAddress_(Library.l ,"SetLayeredWindowAttributes")
    If adress.l
      SetWindowLong_(WindowID(win.l),#GWL_EXSTYLE,GetWindowLong_(WindowID(win.l),#GWL_EXSTYLE)|#WS_EX_LAYERED)
      CallFunctionFast(adress.l ,WindowID(win.l),color.l,0,1)
    EndIf
    FreeLibrary_(Library.l )
  EndIf
EndProcedure

Verfasst: 21.12.2005 17:37
von Mischa
@Danilo

Ein Problem ist schon mal, daß ich kein C kann.
(Die SkinWin Lib ist doch in C, oder?)

Und nein, ich werde jetzt nicht anfangen C zu lernen,
kann ja nicht mal ordentlich PureBasic bislang. :roll:

Wer kann also C und würde das einbauen?
(Denn Du hast ja recht, Danilo, aber ich kanns nun mal nicht selber)

@bobobo
Ja das Ding ist definitiv fixer, aber halt erst ab Win2000.
Das ist das Problem.

Gruß,
Mischa

Verfasst: 21.12.2005 17:56
von bobobo
Ein Problem ist das nur wenn man es nicht hat :)

Wollte den Code ja auch nur hier mit reinstellen weil er dazu passt.

Kommt das nu in PBOSL?

Verfasst: 21.12.2005 18:05
von ts-soft
>> Kommt das nu in PBOSL?
Wenn sich wer finded, der das nach C umschreibt?
Die SkinWin lib umfaßt ja noch mehr Funktionen, sonst hätte man das ja
TailBiten können.