diff --git a/MagickCore/image.c b/MagickCore/image.c
index 0c7776f..b51c52d 100644
--- a/MagickCore/image.c
+++ b/MagickCore/image.c
@@ -1058,6 +1058,11 @@
   assert(source_image != (Image *) NULL);
   assert(geometry != (RectangleInfo *) NULL);
   assert(offset != (OffsetInfo *) NULL);
+  if ((geometry->width == 0) || (geometry->height == 0) || (offset->x < 0) ||
+      (offset->y < 0) || (offset->x >= (ssize_t) geometry->width) ||
+      (offset->y >= (ssize_t) geometry->height))
+    ThrowBinaryException(OptionError,"GeometryDoesNotContainImage",
+      image->filename);
   /*
     Copy image pixels.
   */
@@ -1067,9 +1072,9 @@
   image_view=AcquireAuthenticCacheView(image,exception);
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
   #pragma omp parallel for schedule(static,4) shared(progress,status) \
-    magick_threads(image,source_image,image->rows,1)
+    magick_threads(image,source_image,geometry->height,1)
 #endif
-  for (y=0; y < (ssize_t) image->rows; y++)
+  for (y=0; y < (ssize_t) geometry->height; y++)
   {
     MagickBooleanType
       sync;
@@ -1085,15 +1090,16 @@
 
     if (status == MagickFalse)
       continue;
-    p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
-    q=QueueCacheViewAuthenticPixels(source_view,0,y,source_image->columns,1,
-      exception);
+    p=GetCacheViewVirtualPixels(source_view,geometry->x,y+geometry->y,
+      geometry->width,1,exception);
+    q=QueueCacheViewAuthenticPixels(image_view,offset->x,y+offset->y,
+      geometry->width,1,exception);
     if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL))
       {
         status=MagickFalse;
         continue;
       }
-    for (x=0; x < (ssize_t) image->columns; x++)
+    for (x=0; x < (ssize_t) geometry->width; x++)
     {
       register ssize_t
         i;