Code archives/Graphics/Image Hueing
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
The code below is just a showcase of the functions that are used, if you want to try things out download this (includes tools): http://files.filefront.com/ovl+allzip/;9972923;/fileinfo.html Sorry no comments :P | |||||
Function conv_UnCompRGBA(px:Int, r:Byte Var, g:Byte Var, b:Byte Var, a:Byte Var) a = px Shr 24 r = px Shr 16 g = px Shr 8 b = px End Function Function conv_CompRGBA:Int(r:Int, g:Int, b:Int, a:Int = 255) Return (a Shl 24 | r Shl 16 | g Shl 8 | b) End Function Function gfx_HueCoordArrayArea(pm:TPixmap Var, flurl:String, single:Int = 0) Local flovl:TStream = ReadFile(flurl) If Not flovl Return If Not pm Then Return Local pm_format:Int = PixmapFormat(pm) If (pm_format <> PF_RGBA8888) Then pm = ConvertPixmap(pm, PF_RGBA8888) Local CRGBA:Int Local sea:Int, ser:Int, seg:Int, seb:Int Local nr:Byte, ng:Byte, nb:Byte, na:Byte Local cl_list:TList = CreateList() Local lnovl:String While Not Eof(flovl) lnovl = ReadLine(flovl) If Left(lnovl, 6) = "colid:" CRGBA = Int(Right(lnovl, Len(lnovl) - 6)) Local px_x:Int, px_y:Int, ic:Int Local px:Int, lr:Byte, lg:Byte, lb:Byte, la:Byte conv_UnCompRGBA CRGBA, nr, ng, nb, na DebugLog nr + "," + ng + "," + nb + "," + na cl_list.AddLast(String(CRGBA)) While Not Eof(flovl) lnovl = ReadLine(flovl) ic = Instr(lnovl, ",") If ic = 0 And single = 0 CRGBA = Int(Right(lnovl, Len(lnovl) - 6)) If cl_list.Contains(String(CRGBA)) = 0 conv_UnCompRGBA CRGBA, nr, ng, nb, na cl_list.AddLast(String(CRGBA)) EndIf ElseIf ic > 0 px_x = Int(Left(lnovl, ic - 1)) px_y = Int(Right(lnovl, Len(lnovl) - ic)) px = ReadPixel(pm, px_x, px_y) conv_UnCompRGBA px, lr, lg, lb, la 'DebugLog lr + "," + lg + "," + lb + "," + la sea = (na + la) If sea < 0 Then sea = 0 If sea > 255 Then sea = 255 ser = (nr + lr) If ser < 0 Then ser = 0 If ser > 255 Then ser = 255 seg = (ng + lg) If seg < 0 Then seg = 0 If seg > 255 Then seg = 255 seb = (nb + lb) If seb < 0 Then seb = 0 If seb > 255 Then seb = 255 WritePixel pm, px_x, px_y, Int(sea Shl 24 | ser Shl 16 | seg Shl 8 | seb) EndIf Wend EndIf Wend CloseFile flovl cl_list.Clear If (pm_format <> PF_RGBA8888) Then pm = ConvertPixmap(pm, pm_format) End Function Function dat_CreateHueCoordArray(url:String, ner:Int, neg:Int, neb:Int) Local pm:TPixmap = LoadPixmap(url) If Not pm Then Return If (PixmapFormat(pm) <> PF_RGBA8888) Then pm = ConvertPixmap(pm, PF_RGBA8888) Local flovl:TStream Local fnm:String = Left(url, Len(url) - 3) + "ovl" ; DebugLog fnm If FileType(fnm) = FILETYPE_FILE flovl = OpenStream(fnm) SeekStream(flovl, StreamSize(flovl)) WriteLine flovl, "colid:" + (255 Shl 24 | ner Shl 16 | neg Shl 8 | neb) Else flovl = WriteFile(fnm) WriteLine flovl, "colid:" + (255 Shl 24 | ner Shl 16 | neg Shl 8 | neb) EndIf Local x:Int, y:Int Local px:Int, olr:Byte, olg:Byte, olb:Byte For x = 0 To (pm.width - 1) For y = 0 To (pm.Height - 1) px = ReadPixel(pm, x, y) olr = px Shr 16 ; olg = px Shr 8 ; olb = px 'DebugLog olr + "," + olg + "," + olb + ";" + ner + "," + neg + "," + neb If olr = ner And olg = neg And olb = neb WriteLine flovl, x + "," + y EndIf Next Next 'WriteLine flovl, "endcolid:" + cid CloseFile flovl End Function Function gfx_HuePixmapTintA:TPixmap(pm:TPixmap Var, rer:Int, reg:Int, reb:Int, ner:Int, neg:Int, neb:Int, ula:Int = Null, rtp:Int = 0) If Not pm Then Return Null Local pm_format:Int = PixmapFormat(pm) If (pm_format <> PF_RGBA8888) Then pm = ConvertPixmap(pm, PF_RGBA8888) Local x:Int, y:Int Local sea:Int, ser:Int, seg:Int, seb:Int Local px:Int, olr:Byte, olg:Byte, olb:Byte, ola:Byte If ula <> Null Then ola = Byte(ula) For x = 0 To (pm.width - 1) For y = 0 To (pm.Height - 1) px = ReadPixel(pm, x, y) If ula = Null Then ola = px Shr 24 olr = px Shr 16 ; olg = px Shr 8 ; olb = px If rtp = 0 ' BY COLOR If olr = rer And olg = reg And olb = reb sea = (ola + Byte(ula)) If sea < 0 Then sea = 0 If sea > 255 Then sea = 255 ser = (ner + olr) If ser < 0 Then ser = 0 If ser > 255 Then ser = 255 seg = (neg + olg) If seg < 0 Then seg = 0 If seg > 255 Then seg = 255 seb = (neb + olb) If seb < 0 Then seb = 0 If seb > 255 Then seb = 255 WritePixel pm, x, y, Int(sea Shl 24 | ser Shl 16 | seg Shl 8 | seb) EndIf ElseIf rtp = 1 ' BY MASK If olr <> rer And olg <> reg And olb <> reb sea = (ola + Byte(ula)) If sea < 0 Then sea = 0 If sea > 255 Then sea = 255 ser = (ner + olr) If ser < 0 Then ser = 0 If ser > 255 Then ser = 255 seg = (neg + olg) If seg < 0 Then seg = 0 If seg > 255 Then seg = 255 seb = (neb + olb) If seb < 0 Then seb = 0 If seb > 255 Then seb = 255 WritePixel pm, x, y, Int(sea Shl 24 | ser Shl 16 | seg Shl 8 | seb) EndIf EndIf Next Next If (pm_format <> PF_RGBA8888) Then pm = ConvertPixmap(pm, pm_format) Return pm End Function Function gfx_HuePixmapTC:TPixmap(pm:TPixmap Var, rer:Int, reg:Int, reb:Int, ner:Int, neg:Int, neb:Int, ula:Int = Null) If Not pm Then Return Null Local pm_format:Int = PixmapFormat(pm) If (pm_format <> PF_RGBA8888) Then pm = ConvertPixmap(pm, PF_RGBA8888) Local x:Int, y:Int Local px:Int, olr:Byte, olg:Byte, olb:Byte, ola:Byte If ula <> Null Then ola = Byte(ula) 'DebugLog ula + "," + ola + "," + ola Shl 24 For x = 0 To (pm.width - 1) For y = 0 To (pm.Height - 1) px = ReadPixel(pm, x, y) If ula = Null Then ola = px Shr 24 olr = px Shr 16 ; olg = px Shr 8 ; olb = px 'DebugLog ola If olr = rer And olg = reg And olb = reb Local sea:Int, ser:Int, seg:Int, seb:Int sea = (ola + Byte(ula)) If sea < 0 Then sea = ola ser = (ner + olr) If ser < 0 Then ser = olr If ser > 255 Then ser = 255 seg = (neg + olg) If seg < 0 Then seg = olg If seg > 255 Then seg = 255 seb = (neb + olb) If seb < 0 Then seb = olb If seb > 255 Then seb = 255 WritePixel pm, x, y, Int(ola Shl 24 | ner Shl 16 | neg Shl 8 | neb) EndIf Next Next If (pm_format <> PF_RGBA8888) Then pm = ConvertPixmap(pm, pm_format) Return pm End Function Function gfx_HuePixmapRC:TPixmap(pm:TPixmap Var, rer:Int, reg:Int, reb:Int, ner:Int, neg:Int, neb:Int, ula:Int = Null) If Not pm Then Return Null Local pm_format:Int = PixmapFormat(pm) If (pm_format <> PF_RGBA8888) Then pm = ConvertPixmap(pm, PF_RGBA8888) Local x:Int, y:Int Local px:Int, olr:Byte, olg:Byte, olb:Byte, ola:Byte If ula <> Null Then ola = Byte(ula) 'DebugLog ula + "," + ola + "," + ola Shl 24 For x = 0 To (pm.width - 1) For y = 0 To (pm.Height - 1) px = ReadPixel(pm, x, y) If ula = Null Then ola = px Shr 24 olr = px Shr 16 ; olg = px Shr 8 ; olb = px 'DebugLog ola If olr = rer And olg = reg And olb = reb WritePixel pm, x, y, Int(ola Shl 24 | ner Shl 16 | neg Shl 8 | neb) EndIf Next Next If (pm_format <> PF_RGBA8888) Then pm = ConvertPixmap(pm, pm_format) Return pm End Function |
Comments
| ||
Very interesting, I bet it will come in handy when doing stuff like Frozen enemies in Metroid, or Bosses getting "redder" when they lose HP, like in Metroid too :). Though, I only wish it was turned into a properly documented module, as honestly speaking it is really difficult to get to understand it. |
| ||
It simply adds to or subtracts the given RGB values against each designated pixel. There are a lot of different algorithms you could pull on an image or set of pixels to do hueing. Though, I only wish it was turned into a properly documented module, as honestly speaking it is really difficult to get to understand it. I may eventually find the time to properly introduce it, just too busy right now. This code is quite old too, since then my more unusual coding habits have been forgotten. |
| ||
Code here is good for changing the colour of an image. |
| ||
tonyg: That code is nice, but what I have in mind is code to, more like, "changes palette" though that's not exactly the best name. Plash: Fortunately I won't need it anytime soon, but for sure I will keep my eyes open to it. |
Code Archives Forum