Seite 1 von 1

Farbenersetzung für Images

Verfasst: 23.04.2006 18:47
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