TGC Codebase Backup



converts an image to grayscale by the_winch

22nd Apr 2004 15:56
Summary

Converts and image to grayscale using memblocks. Use in 32bit depth only.



Description



Code
                                    ` This code was downloaded from The Game Creators
                                    ` It is reproduced here with full permission
                                    ` http://www.thegamecreators.com
                                    
                                    function grayscale(in as integer,out as integer)
  `converts an image to greyscale 32bit only
  `in = input image #, out=output image #
  local mem_i as integer : local mem_o as integer
  local i as integer : local gray as integer
  local r as integer : local g as integer : local b as integer : local a as integer
  
  `input memblock
  mem_i = free_memblock()
  make memblock from image mem_i,in
  
  `output memblock
  mem_o = free_memblock()
  make memblock mem_o,get memblock size(mem_i)
  write memblock dword mem_o,0,memblock dword(mem_i,0) : `width
  write memblock dword mem_o,4,memblock dword(mem_i,4) : `height
  write memblock dword mem_o,8,32                      : `depth
  
  `go through each pixel and covert to greyscale
  for i = 12 to get memblock size(mem_i)-1 step 4
    `read
    b = memblock byte(mem_i,i)
    g = memblock byte(mem_i,i+1)
    r = memblock byte(mem_i,i+2)
    a = memblock byte(mem_i,i+3)
    `work out grey value
    gray = (0.3*r)+(0.59*g)+(0.11*b)
    gray = rgba(gray,gray,gray,a)
    `write
    write memblock dword mem_o,i,gray
  next i
  
  `create out image
  make image from memblock out,mem_o
  delete memblock mem_i
  delete memblock mem_o  
endfunction

function rgba(r as integer,g as integer,b as integer,a as integer)
  colour as dword
  colour = (b)+(g*256)+(r*65536)+(a*16777216)
endfunction colour

function free_memblock()
`finds a free memblock
local i as integer : local stop as integer
repeat
  inc i
  if memblock exist(i) = 0 then stop = 1
until stop = 1
endfunction i