diff --git a/coders/label.c b/coders/label.c
index 1055032..d89c0cd 100644
--- a/coders/label.c
+++ b/coders/label.c
@@ -130,37 +130,60 @@
   label=GetImageProperty(image,"label",exception);
   draw_info=CloneDrawInfo(image_info,(DrawInfo *) NULL);
   draw_info->text=ConstantString(label);
-  if (((image->columns != 0) || (image->rows != 0)) &&
-      (image_info->pointsize == 0.0))
+  if ((*label != '\0') && (image->rows != 0) && (image_info->pointsize == 0.0))
     {
+      double
+        high,
+        low;
+
       /*
-        Fit label to canvas size.
+        Auto fit text into bounding box.
       */
-      status=GetMultilineTypeMetrics(image,draw_info,&metrics,exception);
-      for ( ; status != MagickFalse; draw_info->pointsize*=2.0)
+      for ( ; ; )
       {
+        (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);
+        (void) status;
         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 (((image->columns != 0) && (width >= image->columns)) ||
-            ((image->rows != 0) && (height >= image->rows)))
+        if ((width > image->columns) && (height > image->rows))
           break;
-        status=GetMultilineTypeMetrics(image,draw_info,&metrics,exception);
+        draw_info->pointsize*=2.0;
       }
-      draw_info->pointsize/=2.0;
-      for ( ; status != MagickFalse; draw_info->pointsize--)
+      high=draw_info->pointsize/2.0;
+      low=high/2.0;
+      while ((high-low) > 1.0)
       {
+        draw_info->pointsize=(low+high)/2.0;
+        (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 ((image->columns != 0) && (width < image->columns) &&
-           ((image->rows == 0) || (height < image->rows)))
-          break;
-        if ((image->rows != 0) && (height < image->rows) &&
-           ((image->columns == 0) || (width < image->columns)))
-          break;
-        if (draw_info->pointsize < 2.0)
-          break;
-        status=GetMultilineTypeMetrics(image,draw_info,&metrics,exception);
+        if ((width <= image->columns) && (height <= image->rows))
+          low=draw_info->pointsize+1.0;
+        else
+          high=draw_info->pointsize-1.0;
       }
+      for (draw_info->pointsize=(low+high)/2.0; ; )
+      {
+        (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);
     }
   status=GetMultilineTypeMetrics(image,draw_info,&metrics,exception);
   if (status == MagickFalse)