diff --git a/coders/caption.c b/coders/caption.c
index 1a29559..cca4c52 100644
--- a/coders/caption.c
+++ b/coders/caption.c
@@ -209,7 +209,25 @@
         else
           high=draw_info->pointsize-1.0;
       }
-      draw_info->pointsize--;
+      for (draw_info->pointsize=(low+high)/2.0; ; )
+      {
+        text=AcquireString(caption);
+        i=FormatMagickCaption(image,draw_info,MagickFalse,&metrics,&text,
+          exception);
+        (void) CloneString(&draw_info->text,text);
+        text=DestroyString(text);
+        (void) FormatLocaleString(geometry,MaxTextExtent,"%+g%+g",
+          -metrics.bounds.x1,metrics.ascent);
+        if (draw_info->gravity == UndefinedGravity)
+          (void) CloneString(&draw_info->geometry,geometry);
+        status=GetMultilineTypeMetrics(image,draw_info,&metrics,exception);
+        width=(size_t) floor(metrics.width+draw_info->stroke_width+0.5);
+        height=(size_t) floor(metrics.height+draw_info->stroke_width+0.5);
+        if ((width <= image->columns) && (height <= image->rows))
+          break;
+        draw_info->pointsize--;
+      }
+      draw_info->pointsize=floor(draw_info->pointsize);
     }
   i=FormatMagickCaption(image,draw_info,MagickTrue,&metrics,&caption,exception);
   if (image->rows == 0)