examples/iron-puzzle/iron-puzzle.rkt
#lang planet dyoo/whalesong/base
(require (planet dyoo/whalesong/resource)
         (planet dyoo/whalesong/image))

;; The Iron Image Puzzle
;; Part of the Nifty Assignments page by Nick Parlante.
;; http://nifty.stanford.edu/2011/parlante-image-puzzle/

;; To run this program locally on your machine under Google Chrome, you'll
;; probably need to use --allow-file-access-from-files to get around
;; the same-origin policy.  The program should run normally if served on
;; a web server

(define-resource iron-puzzle.png)

 
;; First, grab the image by its url.
(define distorted-image iron-puzzle.png)


distorted-image              
(image-width distorted-image)
(image-height distorted-image)

;; We will want to decompose the image into its individual pixels.  We can use
;; image->color-list to do this.
;; To make experimenting with the pixels an easy thing to do, let?s write
;; a function that will let us ?map? across the pixels of an image
;; to get another image.
(define (image-transform an-image a-pixel-transform)
  (local [(define colors (image->color-list an-image))
          (define new-colors (map a-pixel-transform colors))]
    (color-list->image new-colors
                       (image-width an-image)
                       (image-height an-image)
                       0
                       0)))


;; With image-transform in hand, we can apply a filter,
;; such as zeroing out the blue and green components like this:
(define (zero-blue-green a-color)
  (make-color (color-red a-color)
              0
              0))
(define dark-image
  (image-transform distorted-image zero-blue-green))

dark-image


;; The image is still a bit darkened.  Let?s bump up the red component
;; by a factor of ten.
(define (red*10 a-color)
  (make-color (* (color-red a-color) 10)
              (color-green a-color)
              (color-blue a-color)))
(define red-eye-image
  (image-transform dark-image red*10))

;; And now we should be able to look at red-eye-image and recognize
;; the landmark.

red-eye-image
(image-width red-eye-image)
(image-height red-eye-image)