diff --git a/bacteria.cabal b/bacteria.cabal
--- a/bacteria.cabal
+++ b/bacteria.cabal
@@ -1,5 +1,5 @@
 name:               bacteria
-version:            1.0
+version:            1.1
 synopsis:           braindead utility to compose Xinerama backgrounds
 description:        Compose a sequence of images by centering them on rectangles the size of the Xinerama screens available.  Supports jpg, png, and gif input, and produces png output.
 category:           Graphics
diff --git a/bacteria.hs b/bacteria.hs
--- a/bacteria.hs
+++ b/bacteria.hs
@@ -11,14 +11,20 @@
 bottom (Rectangle { rect_y = y, rect_height = h }) = fromIntegral y + fromIntegral h
 right  (Rectangle { rect_x = x, rect_width  = w }) = fromIntegral x + fromIntegral w
 
--- TODO: scale down if too large
 addImages background images rectangles = sequence_ $ zipWith (addImage background) (cycle images) rectangles
-addImage background image (Rectangle { rect_x = x, rect_y = y, rect_width = wr, rect_height = hr }) = do
+addImage background image (Rectangle { rect_x = xr', rect_y = yr', rect_width = wr', rect_height = hr' }) = do
     (wi, hi) <- imageSize image
-    copyRegion (0, 0) (wi, hi) image
-               (fromIntegral x + fromIntegral wr `div` 2 - fromIntegral wi `div` 2,
-                fromIntegral y + fromIntegral hr `div` 2 - fromIntegral hi `div` 2)
+    let w  = min wi wr -- center a screen-sized block of the image, if it's too large
+        h  = min hi hr
+        xi = max 0 ((wi - w) `div` 2)
+        yi = max 0 ((hi - h) `div` 2)
+    copyRegion (xi, yi) (w, h) image
+               (xr + wr `div` 2 - w `div` 2,
+                yr + hr `div` 2 - h `div` 2)
                background
+    where
+    [xr, yr] = map fromIntegral [xr', yr']
+    [wr, hr] = map fromIntegral [wr', hr']
 
 loadFile imageName = ($ imageName) $ case (take 4 &&& take 5) (reverse imageName) of
     ("gpj.",_)  -> loadJpegFile
