[racket-dev] 2htdp/image Feature Suggestion

From: Matthias Felleisen (matthias at ccs.neu.edu)
Date: Sat Jun 21 18:22:36 EDT 2014

Thanks. We will need to figure out how to accommodate keywords in a teachpack. 

In the meantime, write frame like this: 

(define (frame-2 img 
                 #:frame-color (frame-color 'black)
                 #:background-color (background-color 'transparent)
                 #:frame-offset (frame-offset 0)
                 #:frame-x-offset (frame-x-offset frame-offset)
                 #:frame-y-offset (frame-y-offset frame-offset))
  (define width (+ (image-width img) frame-x-offset))
  (define height (+ (image-height img) frame-y-offset))
  (overlay (rectangle width height 'outline frame-color)
           (center-crop width height img)
           (rectangle width height 'solid background-color)))

Prefer define over let. -- Matthias



On Jun 21, 2014, at 2:42 PM, Kevin Forchione wrote:

> Hi guys,
> I’ve been working with 2htdp/image and been struck by its monitor-oriented coordinate system and its image-centric perspective, both of which have proven a rich bed for new tools. I’ve found these two functions have been useful to me and might be useful for others. I’ve particularly found them useful as my racket sessions use the “white on black” color schemes, and with my eyesight a pixel’s contrast makes a difference. 
> 
> The center-crop function facilitates the image-cntric perspective of the library by centering the cropping rectangle on the image center. The frame function replaces the library’s existing function with one that does the same thing, but also provides parameters for setting the pixel frame coloring, background coloring within the frame, and x/y offsets that work with center-crop to expand or shrink the framing of the image. 
> 
> ;; center-crop: width height image -> image?
> ;; crops image in a rectangle of width x height whose center is image center.
> (define (center-crop width height img)
>  (crop (- (quotient (image-width img) 2) (quotient width 2))
>        (- (quotient (image-height img) 2) (quotient height 2))
>        width
>        height
>        img))
> 
> ;; frame: image frame-option ... -> image?
> ;; Returns an image just like image, except with a frame-color'd, single pixel frame
> ;; around the bounding box of the image. The background-color indicates the color
> ;; inside the frame over which the image is laid. If an offset is provided it 
> ;; indicates a center-crop in that dimension. A positive value extends the crop
> ;; beyond the image bounding box, a negative value center-crops the image within
> ;; the bounding box.
> (define (frame img 
>               #:frame-color (frame-color 'black)
>               #:background-color (background-color 'transparent)
>               #:frame-offset (frame-offset 0)
>               #:frame-x-offset (frame-x-offset frame-offset)
>               #:frame-y-offset (frame-y-offset frame-offset))
>  (let ([width (+ (image-width img) frame-x-offset)]
>        [height (+ (image-height img) frame-y-offset)])
>    (overlay (rectangle width height 'outline frame-color)
>             (center-crop width height img)
>             (rectangle width height 'solid background-color))))
> 
> -Kevin
> _________________________
>  Racket Developers list:
>  http://lists.racket-lang.org/dev



Posted on the dev mailing list.