Seite 1 von 2

AlphaBlend wie im Photoshop

Verfasst: 03.06.2007 16:55
von legion
Hallo !

Arbeite soeben an meiner Vista-Toolbar.dll mit fading Buttons.
Musste mich deswegen mit Alphablend herumschlagen.
Habe hier ein kleines Beispiel extrahiert, vielleicht kann es wer brauchen.

Lg. Legion

Download:AlphaBlend.zip

Bild

Verfasst: 26.03.2008 12:30
von legion
Probleme mit "Alphablend" der "msimg32.dll" ab PB4.10.
Habe das Beispiel auf "Prototype AlphaBlend" umgestellt damit es auch
unter neueren PB-Versionen funktioniert.

Lg. Legion

EDIT#

Code: Alles auswählen

Prototype AlphaBlend(DestDC,x1,y1,w1,h1,SourceDC,x2,y2,w2,h2,BF)
Msimg32 = OpenLibrary(#PB_Any, "msimg32.dll")
If Msimg32
 Global AlphaBlend_.AlphaBlend = GetFunction(msimg32, "AlphaBlend")
Else
 MessageRequester("Fehler!","Kann msimg32.dll nicht öffnen !",#MB_ICONERROR)
 Goto EXIT
EndIf 

#AC_SRC_OVER  = 0  ;Die Quelle wird über dem Ziel gezeichnet
#AC_SRC_ALPHA = 1  ;Das Quellbitmap enthält bereits einen Alphawert

Enumeration
  #Window_0
  #Gadget_1
  #Gadget_2
EndEnumeration

Enumeration
  #Image_0
  #Image_1
EndEnumeration

Global Kanal.b 

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 197, 203, 400, 360, "AlphaBlend",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar |#PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget)
    If CreateGadgetList(WindowID(#Window_0))
    CheckBoxGadget(#Gadget_1, 150, 310, 100,25,"Mit Alphakanal") 
    TrackBarGadget(#Gadget_2, 10, 330, 370, 25, 0, 255 )          
    EndIf
  EndIf
EndProcedure

Procedure BlendImages(Image1,Image2,AlphaWert,AlphaFormat)
 Protected BackImageID,NewImageHDC,BF,*BF.BLENDFUNCTION = @BF  
  *BF\BlendOp = #AC_SRC_OVER
  *BF\BlendFlags = 0
  *BF\SourceConstantAlpha = AlphaWert
  *BF\AlphaFormat = AlphaFormat
  WinHDC = GetDC_(WindowID(#Window_0)) : TempDC = CreateCompatibleDC_(WinHDC) 
  BackImageID = CreateImage(#PB_Any,ImageWidth(Image1),ImageHeight(Image1)) 
  NewImageHDC = StartDrawing(ImageOutput(BackImageID))
  SelectObject_(TempDC,ImageID(Image1))
  BitBlt_(NewImageHDC,0,0,ImageWidth(Image1),ImageHeight(Image1),TempDC,0,0,#SRCCOPY)  
  SelectObject_(TempDC,ImageID(Image2))
  AlphaBlend_(NewImageHDC,0,0,ImageWidth(Image1),ImageHeight(Image1),TempDC,0,0,ImageWidth(Image2),ImageHeight(Image2),BF)  
  StopDrawing()  
  SelectObject_(TempDC,ImageID(BackImageID))
  BitBlt_(WinHDC,0,0,ImageWidth(Image1),ImageHeight(Image1),TempDC,0,0,#SRCCOPY)
  ReleaseDC_(WindowID(#Window_0),WinHDC) : DeleteDC_(TempDC) : FreeImage(BackImageID)
EndProcedure

CatchImage(#Image_0,?UFO1)
CatchImage(#Image_1,?UFO2)
Open_Window_0()
BlendImages(#Image_0,#Image_1,GetGadgetState(#Gadget_2),0) 

Repeat
  
  Event = WaitWindowEvent()
  WindowID = EventWindow()
  GadgetID = EventGadget()
  EventType = EventType()
  
  If Event = #PB_Event_Gadget
   If     GadgetID = #Gadget_1 
    Kanal = GetGadgetState(#Gadget_1)
    If Kanal = 0 : BlendImages(#Image_0,#Image_1,GetGadgetState(#Gadget_2),0)
    Else : BlendImages(#Image_0,#Image_1,GetGadgetState(#Gadget_2),#AC_SRC_ALPHA) : EndIf  
   EndIf
   
   If GadgetID = #Gadget_2 
    If Kanal = 0 : BlendImages(#Image_0,#Image_1,GetGadgetState(#Gadget_2),0)
    Else : BlendImages(#Image_0,#Image_1,GetGadgetState(#Gadget_2),#AC_SRC_ALPHA)
    EndIf 
   EndIf
  EndIf

Until Event = #PB_Event_CloseWindow
  
FreeImage(#Image_0)
FreeImage(#Image_1)

EXIT:
DataSection
UFO1: IncludeBinary "Mein Pfad\UFO1.bmp"
UFO2: IncludeBinary "Mein Pfad\UFO3.bmp" 
EndDataSection

Verfasst: 26.03.2008 15:55
von Häns
@Legion: :allright: Klasse, kann man immer gebrauchen!

Wenn ich Dir ein Vorschlag machen darf:

Code: Alles auswählen

If Event = #PB_Event_Gadget
   
If GadgetID = #Gadget_1
    Kanal = GetGadgetState(#Gadget_1)
    If Kanal = 0
     BlendImages(#Image_0,#Image_1,GetGadgetState(#Gadget_2),0)
    Else
     BlendImages(#Image_0,#Image_1,GetGadgetState(#Gadget_2),#AC_SRC_ALPHA)
    EndIf
...
dann zeigt dein AlpahBlend beim Klick auf dem CheckBox direkt entweder mit oder ohne Alphakanal.

Gruß, Häns

Verfasst: 28.03.2008 12:26
von legion
Hallo Häns !

Danke für dein Feedback ! :allright:
Habe deinen Vorschlag umgesetzt !

Lg. Legion

Verfasst: 28.03.2008 19:20
von xperience2003
AlphaBlend wie im Photoshop
..und wie kommst du dabei auf photoshop?
ich mein da gibts darken, lighten, screen, multiply und so weiter
ganz zu schweigen von masken und stufenweisen blenden

Verfasst: 28.03.2008 19:36
von Vermilion
An sich schicke Sache.

Verfasst: 29.03.2008 11:15
von legion
xperience2003 hat geschrieben:
AlphaBlend wie im Photoshop
..und wie kommst du dabei auf photoshop?
ich mein da gibts darken, lighten, screen, multiply und so weiter
ganz zu schweigen von masken und stufenweisen blenden
Du hast die Antwort bereits selbst geschrieben. :wink:
Photoshop nützt Alphakanäle für Masken und kann stufenlos überblenden.
Natürlich hätte man auch etliche andere Programme nennen können, aber
Photoshop ist halt ein Begriff.

Lg. Legion

Verfasst: 29.03.2008 12:15
von Kaeru Gaman
yo, fast schon ein schimpfwort.

ehrlich gesagt mag ich den Namen garnicht mehr.
Leute, die den benutzen, sind meistens Snobs, weil sie sich ihn leisten können,
oder Diebe, weil sie ihn benutzen ohne ihn sich leisten zu können.
die wenigsten haben ihn, weil sie ihn beruflich nutzen.

...und dann zu einem nahezu mittellosen Kleinkünstler wie mir zu sagen "nimm doch Photoshop",
ist praktisch schon eine Beleidigung.

und ehrlich, ich hab keine ahnung wie der aussieht und was der kann, woher auch.
also ist "wie in Photoshop" für Leute wie mich nur heiße Luft.
warum schreibst du nicht "wie in GIMP"?

Verfasst: 29.03.2008 13:00
von legion
@Kaeru Gaman

Schön langsam fällst du mir auf mit deiner Photoshop-Paranoia.
Photoshop ist eben State of the Art und ideal für einen Vergleich.

Das du mich deswegen als Snob und Dieb bezeichnest hätte ich von dir nicht erwartet ! :cry:

Verfasst: 29.03.2008 14:54
von Kaeru Gaman
> Das du mich deswegen als Snob und Dieb bezeichnest hätte ich von dir nicht erwartet !

>> Leute, die den benutzen, sind meistens...
>> die wenigsten haben ihn, weil sie ihn beruflich nutzen.

ob du dir den "meistens" schuh dann anziehst, ist deine sache.

und das ist keine Paranoia, mit geht Photoshop einfach aufn Sack.
mich nervt ganz einfach, dass alle PS so hochleben lassen.
das teil kostet immernoch über 500,- €, und das kann ich mir einfach nicht leisten.

am liebsten würde ich mir Maya kaufen, und dann erzähl ich immer zu
allen passenden und unpassenden gelegenheiten, wie man das und das
mit Maya macht, und was man alles mit Maya machen kann, und dann
musst du eben Maya nehmen, und wieso hast du das nicht und soweiter.