colorillusion.frink

View or download colorillusion.frink in plain text format


use Writer.frink

// This program generates color illusions like this:
// http://www.johnsadowski.com/big_spanish_castle.php

inputURL = "file:DSC_0077.JPG"
img_in = new image[inputURL]

// Get file part of URL to use for output files.
origFile = urlFile[inputURL]
greyFile = origFile
greyFile =~  %s/(.*)\.\w+$/$1grey.jpg/
colorFile = origFile
colorFile =~ %s/(.*)\.\w+$/$1colors.jpg/
htmlFile = origFile
htmlFile  =~ %s/(.*)\.\w+$/$1.html/

Width = img_in.getWidth[]
Height = img_in.getHeight[]


reverseImg = new image[Width, Height]
greyImg = new image[Width, Height]

for w = 0 to Width-1
{
   for h = 0 to Height-1
   {
      [r,g,b] = img_in.getPixel[w, h]
      // This converts to YUV space using the BT. 709 definition used in
      // HDTV.  See http://en.wikipedia.org/wiki/YUV
      y =  0.2126  r + 0.7152  g + 0.0722  b
      u = -0.09991 r - 0.33609 g + 0.436   b
      v =  0.615   r - 0.55861 g - 0.05639 b

      // Write out the grayscale levels.
      greyImg.setPixel[w, h, y, y, y]

      // Now we're going the throw away the Y (luminance) component
      // and replace it with a constant 0.5.  Then we're going to go back to
      // RGB space and reverse the colors.  We could simplify these equations
      // but it's kinda nice to see them in this form.
      y = 0.5
      r = y +       0 u + 1.28033 v
      g = y - 0.21482 u - 0.38059 v
      b = y + 2.12798 u -       0 v
      reverseImg.setPixel[w, h, 1-r, 1-g, 1-b]
   }
}

g = new graphics
g.fitCenter[reverseImg, 0, 0, 1, 1]
g.drawEllipseCenter[0,0,0.005, 0.005]
//win = g.show[Width, Height]
g.write[colorFile, Width, Height]


g1 = new graphics
g1.fitCenter[greyImg, 0, 0, 1, 1]
g1.drawEllipseCenter[0,0,0.005, 0.005]
g1.write[greyFile, Width, Height]

// Render an interactive HTML file
println["htmlFile is $htmlFile"]
html = new Writer[htmlFile]
html.write["""<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<HTML LANG="en">
 <HEAD>
  <TITLE>$htmlFile</TITLE>
 </HEAD>
 <BODY>
  <CENTER>
   <P>
    Stare at the dot for 30 seconds, then move your mouse over the image.
   </P>

   <P>
   <IMG NAME="i1" SRC="$colorFile" onMouseOver="document.i1.src='$greyFile'" onMouseOut="document.i1.src='$colorFile'">
   </P>
  </CENTER>
 </BODY>
</HTML>"""]
html.close[]

println["Interactive file rendered to $htmlFile"]

// Start the interactive HTML file in the browser.
browse[htmlFile]

/*for i = 1 to 10
{
   win.replaceGraphics[g1]
   sleep[5 s]
   win.replaceGraphics[g]
   sleep[30 s]
}*/





View or download colorillusion.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 17649 days, 5 hours, 42 minutes ago.