[bb] ARGB Converter by superStruct [ 1+ years ago ]

Started by BlitzBot, June 29, 2017, 00:28:38

Previous topic - Next topic

BlitzBot

Title : ARGB Converter
Author : superStruct
Posted : 1+ years ago

Description : These functions take the ARGB value that you get from the ReadPixel command and separates them into the alpha, red, green and blue values.

Code :
Code (blitzbasic) Select
Function Alpha(argb%)
temp$ = Bin(argb)
For i = 1 To 8
alpha% = Val(Right(Left(temp,i),1))*2^(8 - i) + alpha
Next
Return alpha
End Function

Function Red(argb%)
temp$ = Bin(argb)
For i = 1 To 8
red% = Val(Right(Left(temp,i+8),1))*2^(8 - i) + red
Next
Return red
End Function

Function Green(argb%)
temp$ = Bin(argb)
For i = 1 To 8
green% = Val(Right(Left(temp,i+16),1))*2^(8 - i) + green
Next
Return green
End Function

Function Blue(argb%)
temp$ = Bin(argb)
For i = 1 To 8
blue% = Val(Right(Left(temp,i+24),1))*2^(8 - i) + blue
Next
Return blue
End Function

Function Val#(StringNumeric$)

   Local Num# = 0
   Local Hex1 = ((Left$(StringNumeric$,1)="#") Or (Left$(StringNumeric$,1)="$"))
   Local Hex2 = (Left$(StringNumeric$,2)="0x")
   Local Binary = (Left$(StringNumeric$,1)="%")
   Local i,c
   
   If Hex1 Or Hex2
      StringNumeric$ = Upper(StringNumeric$)
      For i=(Hex1 + (Hex2 * 2) + 1) To Len(StringNumeric$)
      c = Asc(Mid$(StringNumeric$,i,1))
         Select True
            Case (c>=48 And c<=57)  ;0 through 9
               Num# = (Num# * 16) + c-48
            Case (c>=65 And c<=70)  ;A through F
               Num# = (Num# * 16) + c-55
            Default
               Return Num#                        
         End Select
      Next
   Else
      If Binary
         For i=2 To Len(StringNumeric$)
            Select Mid$(StringNumeric$,i,1)
               Case "1"
                  Num# = (Num# * 2) + 1
               Case "0"
                  Num# = (Num# * 2)
               Default
                  Return Num#                        
            End Select
         Next
      Else
         Num# = StringNumeric$
      EndIf
   EndIf
   Return Num#
   
End Function


Comments :


Matty(Posted 1+ years ago)

 What a horribly inefficient way of doing it - using strings!Just do this:(also this already exists in the code archives multiple times!)Please note it is even faster, when processing lots of pixels, to remove the function calls and perform the processing directly...calling functions tens of thousands of times will definitely be slower than simply performing the calculations below directly.

function Alpha(argb)
return (argb shr 24) and 255
end function

function Red(argb)
return (argb shr 16) and 255
end function

function Green(argb)
return (argb shr 8) and 255
end function

function Blue(argb)
return argb and 255
end function

function ARGB(red,green,blue,alpha)
return ((alpha and 255) shl 24) or  ((red and 255) shl 16) or ((green and 255) shl 8) or (blue and 255)
end function