SkinWindow (optimierte Methode)

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
Mischa
Beiträge: 152
Registriert: 29.08.2004 06:52
Wohnort: Hellhorst

Beitrag 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
Benutzeravatar
Lukaso
Beiträge: 720
Registriert: 08.09.2004 18:51
Wohnort: Oberkirch
Kontaktdaten:

Beitrag 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
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag 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!
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag 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
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Mischa
Beiträge: 152
Registriert: 29.08.2004 06:52
Wohnort: Hellhorst

Beitrag 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
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag 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?
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten