Download or view trs80ify.frink in plain text format
// This program takes an image and turns it into something that could display
// on a TRS-80 Model I,III,or 4. 128x48, black and white, baby.
//
// If passed an argument on the command-line, it will display the specified
// file or URL.
// You'll need the background image available at:
//
// https://futureboy.us/frinksamp/trs80iiib.jpg
//
bg = new image["file:trs80iiib.jpg"]
if (length[ARGS] > 0)
if (ARGS@0 =~ %r/^http/)
i = new image[ARGS@0]
else
i = new image["file:" + ARGS@0]
else
i = new image["https://futureboy.us/images/futureboydomethumb4.gif"]
w = i.getWidth[]
h = i.getHeight[]
pw = 128
ph = 48
xstep = w/pw
ystep = h/ph
ni = new image[pw,ph]
// Create a grayscale version of the image.
xx = 0
for x=0 to w-xstep step xstep
{
yy = 0
for y = 0 to h-ystep step ystep
{
[r,g,b,a] = i.averagePixels[x,y,x+xstep, y+ystep]
gray = (r+g+b)/3
ni.setPixel[xx,yy,gray,gray,gray,a]
yy = yy + 1
}
xx = xx + 1
}
rerror = 0
gerror = 0
berror = 0
gr = new graphics
gr.draw[bg, -75, -65, 364, 275]
gr.backgroundColor[0,0,0]
// Floyd-Steinberg dither.
for x = 0 to pw-1
for y = 0 to ph-1
{
[r,g,b,a] = ni.getPixel[x,y]
gray = (r+g+b) / 3
if gray > 1/2
{
c = 1
gr.color[1,1,1,.7]
gr.fillRectCenter[x,y*2,1,2]
} else
c = 0
ni.setPixel[x,y,c,c,c,a]
err = gray - c
addError[ni, x+1, y, 7/16, err]
addError[ni, x-1, y+1, 3/16, err]
addError[ni, x, y+1, 5/16, err]
addError[ni, x+1, y+1, 1/16, err]
}
gr.show[]
// Adds the error term to an existing pixel.
addError[image, x, y, mult, err] :=
{
if (x<0) || (y<0) || (x>=image.getWidth[]) || (y>=image.getHeight[])
return
[r,g,b,a] = image.getPixel[x,y]
r = clamp[r+mult*err]
g = clamp[g+mult*err]
b = clamp[b+mult*err]
image.setPixel[x,y,r,g,b,a]
}
clamp[v, min=0, max=1] :=
{
if v < min
min
else
if v > max
max
else
v
}
Download or view trs80ify.frink in plain text format
This is a program written in the programming language Frink.
For more information, view the Frink
Documentation or see More Sample Frink Programs.
Alan Eliasen was born 20145 days, 13 hours, 47 minutes ago.