Farbenersetzung für Images

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
FGK
Beiträge: 249
Registriert: 09.01.2005 14:02
Computerausstattung: i5-4430 CPU / 8GB RAM
GeForce GT630
Windows 10 Home / 64-bit
Wohnort: Augsburg

Farbenersetzung für Images

Beitrag von FGK »

Hallo Leute,

weil es im "Allgemein Forum" nicht so ganz gut passt dachte ich mir
poste ich es hier für Euch

Eine Procedure mit der man in einem Image eine Farbe gegen ne andere
tauschen kann - entstanden durch eine Frage hier im Board
Die Grundlage habe ich aus dem Archiv von einem Post von Mischa
Wäre ev. ja was fürs Codearchiv?
Zur Geschwindigkeit nur soviel absolut flugs!! *ggg

Viel Spaß damit

FGK

Code: Alles auswählen

;Beispiel zum Erstetzen einer Farbe in einem Image
;04/2006  von FGK

Procedure ReplaceImageColor(Image,OldColor,NewColor) 
    UseImage(Image)
    hdc=StartDrawing(ImageOutput()) 
      b=ImageWidth():h=ImageHeight()
      hzwischen=CreateCompatibleBitmap_(hdc,b,h) 
      HdcTemp=CreateCompatibleDC_(hdc) 
      obj=SelectObject_(HdcTemp,hzwischen) 
      HdcBack=CreateCompatibleDC_(hdc) 
      HdcObject=CreateCompatibleDC_(hdc) 
      HdcMem=CreateCompatibleDC_(hdc) 
      HdcSave=CreateCompatibleDC_(hdc) 
      BmPAndBack=CreateBitmap_(b,h,1,1,0) 
      BmPAndObject=CreateBitmap_(b,h,1,1,0) 
      BmPAndMem=CreateCompatibleBitmap_(hdc,b,h) 
      BmPSave=CreateCompatibleBitmap_(hdc,b,h) 
      BmpBackOld=SelectObject_(HdcBack,BmPAndBack) 
      BmpObjectOld=SelectObject_(HdcObject,BmPAndObject) 
      BmpMemOld=SelectObject_(HdcMem,BmPAndMem) 
      BmpSaveOld=SelectObject_(HdcSave,BmPSave) 
      BitBlt_(HdcTemp,0,0,b,h,hdc,0,0,#SRCCOPY) 
      BitBlt_(HdcSave,0,0,b,h,HdcTemp,0,0,#SRCCOPY) 
      CColor=SetBkColor_(HdcTemp,OldColor) 
      BitBlt_(HdcObject,0,0,b,h,HdcTemp,0,0,#SRCCOPY) 
      SetBkColor_(HdcTemp,CColor) 
    StopDrawing() 
    ColorImage=CreateImage(#PB_Any,b,h)
    UseImage(Image)
    target=StartDrawing(ImageOutput()) 
    Box(0,0,b,h,NewColor)
    BitBlt_(HdcBack,0,0,b,h,HdcObject,0,0,#NOTSRCCOPY) 
    BitBlt_(HdcMem,0,0,b,h,target,x,y,#SRCCOPY) 
    BitBlt_(HdcMem,0,0,b,h,HdcObject,0,0,#SRCAND) 
    BitBlt_(HdcTemp,0,0,b,h,HdcBack,0,0,#SRCAND) 
    BitBlt_(HdcMem,0,0,b,h,HdcTemp,0,0,#SRCPAINT) 
    BitBlt_(HdcTemp,0,0,b,h,HdcMem,0,0,#SRCCOPY) 
    BitBlt_(target,0,0,b,h,HdcTemp,0,0,#SRCCOPY) 
    StopDrawing()
    UseImage(Image)
    StartDrawing(ImageOutput()) 
      DrawImage(ColorImage,0,0)
    StopDrawing()
  ;Cleanup Handles  
  DeleteObject_(obj):DeleteObject_(BmpBackOld) 
  DeleteObject_(BmpObjectOld):DeleteObject_(BmpMemOld) 
  DeleteObject_(BmpSaveOld):DeleteDC_(HdcMem) 
  DeleteDC_(HdcBack):DeleteDC_(HdcObject) 
  DeleteDC_(HdcSave):DeleteDC_(HdcTemp) 
  DeleteObject_(hzwischen):DeleteObject_(BmPAndBack) 
  DeleteObject_(BmPAndObject):DeleteObject_(BmPAndMem) 
  DeleteObject_(BmPSave) 
EndProcedure 

LoadImage(1, "C:\Develop\PureBasic3-92\Examples\Sources\Data\Purebasic.bmp") ;<-Pfad/Name anpassen 
CopyImage(1,2)
ReplaceImageColor(1,RGB(87,109,131),RGB(0,255,255)) 
OpenWindow(0,0,0,400,400,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"ImageColorReplace") 
CreateGadgetList(WindowID()) 
ImageGadget(0, 0, 0, 400, 200, UseImage(2)) 
ImageGadget(1, 0, 200, 400, 200, UseImage(1)) 
Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow