Timage/Pixmap einfärben (Teamfarben etc.)
Übersicht

RonnyBetreff: Timage/Pixmap einfärben (Teamfarben etc.) |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group