#http://mattmik.com/articles/ascii/ascii.html const chars = "~`!@#$%^&*()+-=[]\;',./_+{}|:" const block_width = 4 const block_height = 6 func calc_block(byref dat, h, y2, w, x2) local y,x,c,r,g,b,n n = 0 for y = 0 to h for x = 0 to w c = -dat[y2 + y, x2 + x] r = ((c band 0xff0000) rshift 16) g = ((c band 0xff00) rshift 8) b = (c band 0xff) n += (r + g + b) / 3 next x next y return n end func calc_color(byref dat, h, y2, w, x2) local y,x,c local r = 0 local g = 0 local b = 0 local wh = w * h for y = 0 to h for x = 0 to w c = -dat[y2 + y, x2 + x] rx = ((c band 0xff0000) rshift 16) gx = ((c band 0xff00) rshift 8) bx= (c band 0xff) r += ((c band 0xff0000) rshift 16) g += ((c band 0xff00) rshift 8) b += (c band 0xff) next x next y r = r / wh g = g / wh b = b / wh local minv = min(r,g,b) local maxv = max(r,g,b) if (minv < maxv) then local diff = iff(maxv - minv == 0, 1, maxv - minv) r = int(255 * (r - minv) / diff) g = int(255 * (g - minv) / diff) b = int(255 * (b - minv) / diff) return rgb(r,g,b) else r = min(255, r) return rgb(r,r,r) endif end func get_char(byref tbl, n) local r = tbl[n] if r > 0 then return r for sn in tbl.sorted if (sn > n) then ' round up to the nearest value tbl[n] = tbl[sn] return tbl[sn] endif next n return " " end # analyze the graphic data corresponding to each character in the character set. func create_table local img,dat,i,ch,x2,n local w = txtw(chars) local h = txth(chars) local cw = txtw("1") cls: print chars img = image(0, 0, w, h, 1) img.save(dat) cls: showpage local vals = [] local minv = maxint local maxv = 0 for i = 1 to len(chars) ch = mid(chars, i, 1) x2 = ((i - 1) * cw) n = calc_block(dat, h - 1, 0, cw - 1, x2) / (w * h) minv = min(minv, n) maxv = max(maxv, n) vals << n next i ' scale the values from 0:255 local tbl = {} for i = 1 to len(chars) ch = mid(chars, i, 1) diff = iff(maxv - minv == 0, 1, maxv - minv) n = 255 * (vals[i - 1] - minv) / diff vals[i - 1] = n tbl[n] = ch next i sort vals tbl["sorted"] = vals return tbl end sub imageToAscii(path) local img,dat,pic,bly,blx,y2,x2,n,minv,maxv,row local tbl = create_table() img = image(path) img.save(dat) local w = img.width local h = img.height local blw = w / block_width local blh = h / block_height local vals = [] local minv = maxint local maxv = 0 dim pic(blh, blw) for bly = 0 to blh - 1 for blx = 0 to blw - 1 y2 = bly * block_height x2 = blx * block_width n = calc_block(dat, block_height, y2, block_width - 1, x2) / (w * h) minv = min(minv, n) maxv = max(maxv, n) pic[bly,blx] = n next blx next bly for bly = 0 to blh - 1 for blx = 0 to blw - 1 diff = iff(maxv - minv == 0, 1, maxv - minv) n = 255 * (pic[bly, blx] - minv) / diff y2 = iff(bly==0,1,bly) * block_height x2 = iff(blx==0,1,blx) * block_width color calc_color(dat, block_height, y2, block_width - 1, x2) print get_char(tbl, n); next blx print next bly showpage end imageToAscii("tree.png")