AlphaBlend wie im Photoshop

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

AlphaBlend wie im Photoshop

Beitrag 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
PB 5.71 LTS Windows 10 Pro & Ubuntu 18.04.2 LTS & Linux Mint 19.3
-----------------------------------------------------
Alles ist, wie man glaubt, dass es ist!
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

Beitrag 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
Zuletzt geändert von legion am 28.03.2008 12:24, insgesamt 1-mal geändert.
PB 5.71 LTS Windows 10 Pro & Ubuntu 18.04.2 LTS & Linux Mint 19.3
-----------------------------------------------------
Alles ist, wie man glaubt, dass es ist!
Häns
Beiträge: 47
Registriert: 27.10.2007 14:30
Wohnort: Kölle

Beitrag 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
PB 5.6
Windows 7 Professional
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

Beitrag von legion »

Hallo Häns !

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

Lg. Legion
PB 5.71 LTS Windows 10 Pro & Ubuntu 18.04.2 LTS & Linux Mint 19.3
-----------------------------------------------------
Alles ist, wie man glaubt, dass es ist!
xperience2003
Beiträge: 972
Registriert: 04.10.2004 18:42
Computerausstattung: Amiga, LinuxMint, Windows7
Wohnort: gotha
Kontaktdaten:

Beitrag 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
amiga rulez...
Rebirth Software
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag von Vermilion »

An sich schicke Sache.
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

Beitrag 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
PB 5.71 LTS Windows 10 Pro & Ubuntu 18.04.2 LTS & Linux Mint 19.3
-----------------------------------------------------
Alles ist, wie man glaubt, dass es ist!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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"?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

Beitrag 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:
PB 5.71 LTS Windows 10 Pro & Ubuntu 18.04.2 LTS & Linux Mint 19.3
-----------------------------------------------------
Alles ist, wie man glaubt, dass es ist!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten