Timage/Pixmap einfärben (Teamfarben etc.)

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

 

Ronny

Betreff: Timage/Pixmap einfärben (Teamfarben etc.)

BeitragDi, März 06, 2007 8:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich schon Module anderer nutze, dann kann man ja auch kleine Funktionsspielereien aus eigener Hand als Dank anbieten.

Eventuell findet ja jemand noch ein paar Performanceschrauben oder Fehler.

Die unten aufgefuehrten Funktionen bieten die Moeglichkeit, graue Bestandteile von Bildern einzufaerben... genutzt werden kann dies beispielsweise fuer in die Sprite integrierte Teamfarben (also Fahnen, Uniformen, Symbole, etc.) Um dennoch "Grau" im Bild zu erlauben, einfach ein blaeuliches/roetliches grau (RGB bspweise 200,206,206) nutzen.

Die Funktion sollte nicht fuer Realtimenutzung eingeplant werden, da Pixel-Lese und -Schreibvorgaenge nicht die schnellsten sind, also immer fein im Vorhinein die entsprechenden Sprites erstellen lassen.

Code: [AUSKLAPPEN]

'Type TColorFunctions

Function ARGB_Alpha:Int(ARGB:Int)
 Return Int((ARGB & $FF000000:Int) / $1000000:Int)
End Function

Function ARGB_Red:Int(ARGB:Int)
 Return Int((ARGB & $00FF0000:Int) / $10000:Int)
End Function

Function ARGB_Green:Int(ARGB:Int)
 Return Int((ARGB & $0000FF00:Int) / $100:Int)
End Function

Function ARGB_Blue:Int(ARGB:Int)
 Return (ARGB & $000000FF:Int)
End Function

Function ARGB_Color:Int(alpha:Int,red:Int,green:Int,blue:Int)
 Return (Int(alpha*$1000000)+Int(blue*$10000)+Int(green*$100)+Int(RED))
End Function
             
'returns true if the given pixel is monochrome (grey)                     
Function isMonochrome(argb:Int)
Try
   Local alpha:Int = ARGB_Alpha(argb)
   Local red:Int = ARGB_Red(argb)
   Local green:Int = ARGB_Green(argb)
   Local blue:Int = ARGB_Blue(argb)
                                                           '250
   If (red = green) And (red = blue)And(alpha <> 0)And(red<250) Then Return green
   Return 0
Catch a$
   Print "abgefangen: "+a$
EndTry

End Function

'colorize an image with rgb-colors (bigger than 255 is no problem as long grey isn't 255
Function ColorizedImage:TImage(imagea:TImage,r:Float,g:Float,b:Float)
  Local mypixmap2:TPixmap=LockImage(imagea)
  UnlockImage(imagea)
  Local mypixelptr2:Int Ptr = Int Ptr(mypixmap2.PixelPtr(0,0))
  Local mypixelptr2backup:Int Ptr = mypixelptr2
  For Local my_x=0 To ((mypixmap2.width)*(mypixmap2.height))
 '   If Mypixelptr2[0] = Null Then Exit
     If isMonochrome(mypixelptr2[0]) > 0         
         If mypixelptr2[0] <> 0 Then mypixelptr2[0] = ARGB_Color(255,Int(isMonochrome(mypixelptr2[0])*r/100), Int(isMonochrome(mypixelptr2[0])*g/100), Int(isMonochrome(mypixelptr2[0])*b/100))
    EndIf
     mypixelptr2:+1
     If mypixelptr2 = mypixelptr2backup+(mypixmap2.pitch Shr 2)
         mypixelptr2backup=mypixelptr2
     EndIf
  Next                   
  mypixmap2.height = imagea.height                       
  mypixmap2.width = imagea.width                       
  Return LoadImage(mypixmap2)
End Function

'colorize an TImage and return a pixmap
Function ColorizePixmap:TPixmap(_image:TImage,frame:Int,r:Float,g:Float,b:Float)
If _image <> Null
  Local mypixmap:TPixmap= LockImage(_image, frame)
  Local mypixmap2:TPixmap = TPixmap.Create(mypixmap.width,mypixmap.height, mypixmap.format,1)
  mypixmap2 = mypixmap.Copy()
  Local mypixelptr2:Int Ptr = Int Ptr(mypixmap2.PixelPtr(0,0))
  Local mypixelptr2backup:Int Ptr = mypixelptr2
  For Local my_x=0 To ((mypixmap2.width)*(mypixmap2.height))
  '  If Mypixelptr2[0] = Null Then Exit
     Local colortone:Int = isMonochrome(mypixelptr2[0])
     If colortone > 0 And mypixelptr2[0] <> 0         
       mypixelptr2[0] = ARGB_Color(ARGB_Alpha(mypixelptr2[0]),Int(colortone*r/255), Int(colortone*g/255), Int(colortone*b/255))
     EndIf
     mypixelptr2:+1
     If mypixelptr2 = mypixelptr2backup+(mypixmap2.pitch Shr 2)
         mypixelptr2backup=mypixelptr2
     EndIf
  Next       
  UnlockImage(_image, Frame)
  Return mypixmap2
EndIf 
End Function

'colorizing not animated images
Function ColorizeImage:TPixmap(imgpath:String, cr:Int,cg:Int,cb:Int)
  Local colorpixmap:TPixmap=LockImage(ColorizedImage(LoadImage(imgpath), cr,cg,cb))
  UnlockImage(ColorizedImage(LoadImage(imgpath), cr,cg,cb))
  Return colorpixmap   
End Function

'copies an TImage to not manipulate the source image
Function CopyImage:TImage(src:TImage)
   If src = Null Then Return Null
   
   Local dst:TImage = New TImage
   MemCopy(dst, src, SizeOf(dst))
   
   dst.pixmaps = New TPixmap[src.pixmaps.length]
   dst.frames = New TImageFrame[src.frames.length]
   dst.seqs = New Int[src.seqs.length]
   
   For Local i:Int = 0 To dst.pixmaps.length-1
      dst.pixmaps[i] = CopyPixmap(src.pixmaps[i])
   Next
   
   For Local i:Int = 0 To dst.frames.length-1
      dst.Frame(i)
   Next
   
   MemCopy(dst.seqs, src.seqs, SizeOf(dst.seqs))
   
   Return dst
End Function


'colorizes an TImage (may be an AnimImage when given cell_width and height)
Function ColorizeTImage:TImage(_image:TImage, r:Int,g:Int,b:Int, cell_width:Int=0,cell_height:Int=0,first_cell:Int=0,cell_count:Int=1, flag:Int=0)
If _image <> Null
  Local mypixmap:TPixmap=LockImage(_image)
  Local mypixmap2:TPixmap = TPixmap.Create(_image.width,_image.height, mypixmap.format,1)
  mypixmap2 = mypixmap.Copy()
  Local mypixelptr2:Int Ptr = Int Ptr(mypixmap2.PixelPtr(0,0))
  Local mypixelptr2backup:Int Ptr = mypixelptr2
  For Local my_x=0 To ((mypixmap2.width)*(mypixmap2.height))
 '   If Mypixelptr2[0] = Null Then Exit
     Local colortone:Int = isMonochrome(mypixelptr2[0])
     If colortone > 0 And mypixelptr2[0] <> 0         
       mypixelptr2[0] = ARGB_Color(ARGB_Alpha(mypixelptr2[0]),Int(colortone*r/255), Int(colortone*g/255), Int(colortone*b/255))
     EndIf
     mypixelptr2:+1
     If mypixelptr2 = mypixelptr2backup+(mypixmap2.pitch Shr 2)
         mypixelptr2backup=mypixelptr2
     EndIf
  Next       
  UnlockImage(_image)
  If cell_width > 0 And cell_count > 0 Then Return LoadAnimImage(mypixmap2, cell_width, cell_height, first_cell,cell_count, flag)
  Return LoadImage(mypixmap2)
EndIf
End Function
'End Type




bye Ron

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group