January 15, 2021, 06:18:04 PM

Author Topic: [bmx] Image Hueing by plash [ 1+ years ago ]  (Read 591 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bmx] Image Hueing by plash [ 1+ years ago ]
« on: June 29, 2017, 12:28:38 AM »
Title : Image Hueing
Author : plash
Posted : 1+ years ago

Description : 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


Code :
Code: BlitzMax
  1. Function conv_UnCompRGBA(px:Int, r:Byte Var, g:Byte Var, b:Byte Var, a:Byte Var)
  2.         a = px Shr 24
  3.         r = px Shr 16
  4.         g = px Shr 8
  5.         b = px
  6.        
  7. End Function
  8.  
  9. Function conv_CompRGBA:Int(r:Int, g:Int, b:Int, a:Int = 255)
  10.         Return (a Shl 24 | r Shl 16 | g Shl 8 | b)
  11.        
  12. End Function
  13.  
  14. Function gfx_HueCoordArrayArea(pm:TPixmap Var, flurl:String, single:Int = 0)
  15.    Local flovl:TStream = ReadFile(flurl)
  16.     If Not flovl Return
  17.         If Not pm Then Return
  18.        
  19.         Local pm_format:Int = PixmapFormat(pm)
  20.          If (pm_format <> PF_RGBA8888) Then pm = ConvertPixmap(pm, PF_RGBA8888)
  21.          
  22.         Local CRGBA:Int
  23.         Local sea:Int, ser:Int, seg:Int, seb:Int
  24.          Local nr:Byte, ng:Byte, nb:Byte, na:Byte
  25.           Local cl_list:TList = CreateList()
  26.          
  27.            Local lnovl:String
  28.                 While Not Eof(flovl)
  29.                   lnovl = ReadLine(flovl)
  30.                        
  31.                         If Left(lnovl, 6) = "colid:"
  32.                        
  33.                                 CRGBA = Int(Right(lnovl, Len(lnovl) - 6))
  34.                                   Local px_x:Int, px_y:Int, ic:Int
  35.                                    Local px:Int, lr:Byte, lg:Byte, lb:Byte, la:Byte
  36.                                    
  37.                                     conv_UnCompRGBA CRGBA, nr, ng, nb, na
  38.                                          DebugLog nr + "," + ng + "," + nb + "," + na
  39.                                                
  40.                                          cl_list.AddLast(String(CRGBA))
  41.                                         While Not Eof(flovl)
  42.                                          lnovl = ReadLine(flovl)
  43.                                           ic = Instr(lnovl, ",")
  44.                                                
  45.                                                 If ic = 0 And single = 0
  46.                                                         CRGBA = Int(Right(lnovl, Len(lnovl) - 6))
  47.                                                        
  48.                                                         If cl_list.Contains(String(CRGBA)) = 0
  49.                                                                 conv_UnCompRGBA CRGBA, nr, ng, nb, na
  50.                                                                 cl_list.AddLast(String(CRGBA))
  51.                                                                
  52.                                                         EndIf
  53.                                                        
  54.                                                 ElseIf ic > 0
  55.                                                         px_x = Int(Left(lnovl, ic - 1))
  56.                                                         px_y = Int(Right(lnovl, Len(lnovl) - ic))
  57.                                                        
  58.                                                         px = ReadPixel(pm, px_x, px_y)
  59.                                                         conv_UnCompRGBA px, lr, lg, lb, la
  60.                                                        
  61.                                                         'DebugLog lr + "," + lg + "," + lb + "," + la
  62.                                                        
  63.                                                         sea = (na + la)
  64.                                                          If sea < 0 Then sea = 0
  65.                                                          If sea > 255 Then sea = 255
  66.                                                         ser = (nr + lr)
  67.                                                          If ser < 0 Then ser = 0
  68.                                                          If ser > 255 Then ser = 255
  69.                                                         seg = (ng + lg)
  70.                                                          If seg < 0 Then seg = 0
  71.                                                          If seg > 255 Then seg = 255
  72.                                                         seb = (nb + lb)
  73.                                                          If seb < 0 Then seb = 0
  74.                                                          If seb > 255 Then seb = 255
  75.                                                          
  76.                                                         WritePixel pm, px_x, px_y, Int(sea Shl 24 | ser Shl 16 | seg Shl 8 | seb)
  77.                                                        
  78.                                                 EndIf
  79.                                                
  80.                                         Wend
  81.                                        
  82.                                 EndIf
  83.                        
  84.                 Wend
  85.           CloseFile flovl
  86.          cl_list.Clear
  87.          
  88.         If (pm_format <> PF_RGBA8888) Then pm = ConvertPixmap(pm, pm_format)
  89.        
  90. End Function
  91.  
  92. Function dat_CreateHueCoordArray(url:String, ner:Int, neg:Int, neb:Int)
  93.   Local pm:TPixmap = LoadPixmap(url)
  94.    If Not pm Then Return
  95.    
  96.          If (PixmapFormat(pm) <> PF_RGBA8888) Then pm = ConvertPixmap(pm, PF_RGBA8888)
  97.        
  98.         Local flovl:TStream
  99.         Local fnm:String = Left(url, Len(url) - 3) + "ovl" ; DebugLog fnm
  100.        
  101.                 If FileType(fnm) = FILETYPE_FILE
  102.                         flovl = OpenStream(fnm)
  103.                         SeekStream(flovl, StreamSize(flovl))
  104.                         WriteLine flovl, "colid:" + (255 Shl 24 | ner Shl 16 | neg Shl 8 | neb)
  105.                        
  106.                 Else
  107.                         flovl = WriteFile(fnm)
  108.                         WriteLine flovl, "colid:" + (255 Shl 24 | ner Shl 16 | neg Shl 8 | neb)
  109.                        
  110.                 EndIf
  111.        
  112.         Local x:Int, y:Int
  113.         Local px:Int, olr:Byte, olg:Byte, olb:Byte
  114.        
  115.         For x = 0 To (pm.width - 1)
  116.                 For y = 0 To (pm.Height - 1)
  117.                
  118.                         px = ReadPixel(pm, x, y)
  119.                         olr = px Shr 16 ; olg = px Shr 8 ; olb = px
  120.                         'DebugLog olr + "," + olg + "," + olb + ";" + ner + "," + neg + "," + neb
  121.                                 If olr = ner And olg = neg And olb = neb
  122.                                         WriteLine flovl, x + "," + y
  123.                                        
  124.                                 EndIf
  125.                                
  126.                 Next
  127.         Next
  128.        
  129.    'WriteLine flovl, "endcolid:" + cid
  130.   CloseFile flovl
  131.  
  132. End Function
  133.  
  134. 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)
  135.  
  136.    If Not pm Then Return Null
  137.        
  138.         Local pm_format:Int = PixmapFormat(pm)
  139.          If (pm_format <> PF_RGBA8888) Then pm = ConvertPixmap(pm, PF_RGBA8888)
  140.        
  141.         Local x:Int, y:Int
  142.         Local sea:Int, ser:Int, seg:Int, seb:Int
  143.         Local px:Int, olr:Byte, olg:Byte, olb:Byte, ola:Byte
  144.        
  145.         If ula <> Null Then ola = Byte(ula)
  146.        
  147.         For x = 0 To (pm.width - 1)
  148.                 For y = 0 To (pm.Height - 1)
  149.                   px = ReadPixel(pm, x, y)
  150.                    If ula = Null Then ola = px Shr 24
  151.                    olr = px Shr 16 ; olg = px Shr 8 ; olb = px
  152.                        
  153.                         If rtp = 0 ' BY COLOR
  154.                                 If olr = rer And olg = reg And olb = reb
  155.                                     sea = (ola + Byte(ula))
  156.                                          If sea < 0 Then sea = 0
  157.                                          If sea > 255 Then sea = 255
  158.                                         ser = (ner + olr)
  159.                                          If ser < 0 Then ser = 0
  160.                                          If ser > 255 Then ser = 255
  161.                                         seg = (neg + olg)
  162.                                          If seg < 0 Then seg = 0
  163.                                          If seg > 255 Then seg = 255
  164.                                         seb = (neb + olb)
  165.                                          If seb < 0 Then seb = 0
  166.                                          If seb > 255 Then seb = 255
  167.                                          
  168.                                         WritePixel pm, x, y, Int(sea Shl 24 | ser Shl 16 | seg Shl 8 | seb)
  169.                                        
  170.                                 EndIf
  171.                                
  172.                         ElseIf rtp = 1 ' BY MASK
  173.                                 If olr <> rer And olg <> reg And olb <> reb
  174.                                     sea = (ola + Byte(ula))
  175.                                          If sea < 0 Then sea = 0
  176.                                          If sea > 255 Then sea = 255
  177.                                         ser = (ner + olr)
  178.                                          If ser < 0 Then ser = 0
  179.                                          If ser > 255 Then ser = 255
  180.                                         seg = (neg + olg)
  181.                                          If seg < 0 Then seg = 0
  182.                                          If seg > 255 Then seg = 255
  183.                                         seb = (neb + olb)
  184.                                          If seb < 0 Then seb = 0
  185.                                          If seb > 255 Then seb = 255
  186.                                          
  187.                                         WritePixel pm, x, y, Int(sea Shl 24 | ser Shl 16 | seg Shl 8 | seb)
  188.                                        
  189.                                 EndIf
  190.                                
  191.                         EndIf
  192.                        
  193.                 Next
  194.         Next
  195.        
  196.    If (pm_format <> PF_RGBA8888) Then pm = ConvertPixmap(pm, pm_format)
  197.    
  198.   Return pm
  199.    
  200. End Function
  201.  
  202. Function gfx_HuePixmapTC:TPixmap(pm:TPixmap Var, rer:Int, reg:Int, reb:Int, ner:Int, neg:Int, neb:Int, ula:Int = Null)
  203.  
  204.    If Not pm Then Return Null
  205.        
  206.         Local pm_format:Int = PixmapFormat(pm)
  207.          If (pm_format <> PF_RGBA8888) Then pm = ConvertPixmap(pm, PF_RGBA8888)
  208.        
  209.         Local x:Int, y:Int
  210.         Local px:Int, olr:Byte, olg:Byte, olb:Byte, ola:Byte
  211.        
  212.         If ula <> Null Then ola = Byte(ula)
  213.         'DebugLog ula + "," + ola + "," + ola Shl 24
  214.        
  215.         For x = 0 To (pm.width - 1)
  216.                 For y = 0 To (pm.Height - 1)
  217.                
  218.                         px = ReadPixel(pm, x, y)
  219.                         If ula = Null Then ola = px Shr 24
  220.                         olr = px Shr 16 ; olg = px Shr 8 ; olb = px
  221.                 'DebugLog ola
  222.                         If olr = rer And olg = reg And olb = reb
  223.                            Local sea:Int, ser:Int, seg:Int, seb:Int
  224.                             sea = (ola + Byte(ula))
  225.                                  If sea < 0 Then sea = ola
  226.                                 ser = (ner + olr)
  227.                                  If ser < 0 Then ser = olr
  228.                                  If ser > 255 Then ser = 255
  229.                                 seg = (neg + olg)
  230.                                  If seg < 0 Then seg = olg
  231.                                  If seg > 255 Then seg = 255
  232.                                 seb = (neb + olb)
  233.                                  If seb < 0 Then seb = olb
  234.                                  If seb > 255 Then seb = 255
  235.                                  
  236.                                 WritePixel pm, x, y, Int(ola Shl 24 | ner Shl 16 | neg Shl 8 | neb)
  237.                                
  238.                         EndIf
  239.                        
  240.                 Next
  241.         Next
  242.        
  243.    If (pm_format <> PF_RGBA8888) Then pm = ConvertPixmap(pm, pm_format)
  244.    
  245.   Return pm
  246.    
  247. End Function
  248.  
  249. Function gfx_HuePixmapRC:TPixmap(pm:TPixmap Var, rer:Int, reg:Int, reb:Int, ner:Int, neg:Int, neb:Int, ula:Int = Null)
  250.  
  251.    If Not pm Then Return Null
  252.        
  253.         Local pm_format:Int = PixmapFormat(pm)
  254.          If (pm_format <> PF_RGBA8888) Then pm = ConvertPixmap(pm, PF_RGBA8888)
  255.        
  256.         Local x:Int, y:Int
  257.         Local px:Int, olr:Byte, olg:Byte, olb:Byte, ola:Byte
  258.        
  259.         If ula <> Null Then ola = Byte(ula)
  260.         'DebugLog ula + "," + ola + "," + ola Shl 24
  261.        
  262.         For x = 0 To (pm.width - 1)
  263.                 For y = 0 To (pm.Height - 1)
  264.                
  265.                         px = ReadPixel(pm, x, y)
  266.                         If ula = Null Then ola = px Shr 24
  267.                         olr = px Shr 16 ; olg = px Shr 8 ; olb = px
  268.                 'DebugLog ola
  269.                         If olr = rer And olg = reg And olb = reb
  270.                                 WritePixel pm, x, y, Int(ola Shl 24 | ner Shl 16 | neg Shl 8 | neb)
  271.                                
  272.                         EndIf
  273.                        
  274.                 Next
  275.         Next
  276.        
  277.    If (pm_format <> PF_RGBA8888) Then pm = ConvertPixmap(pm, pm_format)
  278.    
  279.   Return pm
  280.    
  281. End Function


Comments :


Mauft(Posted 1+ years ago)

 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.


plash(Posted 1+ years ago)

 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.<div class="quote"> Though, I only wish it was turned into a properly documented module, as honestly speaking it is really difficult to get to understand it. </div>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.


tonyg(Posted 1+ years ago)

 Code <a href="../Community/posts55f4-2.html?topic=60695#677444" target="_blank"> here [/url] is good for changing the colour of an image.


Mauft(Posted 1+ years ago)

 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.


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal