]> granicus.if.org Git - imagemagick/commitdiff
(no commit message)
authorcristy <urban-warrior@git.imagemagick.org>
Sat, 28 Nov 2009 18:08:51 +0000 (18:08 +0000)
committercristy <urban-warrior@git.imagemagick.org>
Sat, 28 Nov 2009 18:08:51 +0000 (18:08 +0000)
ChangeLog
coders/jpeg.c

index df5e61f8e90640abd112824aedfd4948191d9fc4..c547d99bee0711cee160d83c5d19cf17169e531f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,6 @@
 2009-11-26  6.5.8-1 Chris Madison  <madisonblu@gmail...>
   * Eliminate bogus 'skip to sync byte' exception for PCD image format.
+  * Add -define jpeg:extent option to restrict the maximum JPEG image file size.
 
 2009-11-26  6.5.8-1 Dr. Ingo Bremer <bremer@wias-...>
   * Escape single quote in when writing the UIL format.
index 70c188b314072d49e0468b4e7a012bef25e4bd91..9df4e8e9d15d03f611d5b7364c9ed02ddee3be2a 100644 (file)
@@ -998,7 +998,7 @@ static Image *ReadJPEGImage(const ImageInfo *image_info,
       GeometryInfo
         geometry_info;
 
-      int
+      MagickStatusType
         flags;
 
       /*
@@ -1840,6 +1840,49 @@ static MagickBooleanType WriteJPEGImage(const ImageInfo *image_info,
     (void) LogMagickEvent(CoderEvent,GetMagickModule(),
       "Interlace: nonprogressive");
 #endif
+  option=GetImageOption(image_info,"jpeg:extent");
+  if (option != (const char *) NULL)
+    {
+      Image
+        *jpeg_image;
+
+      ImageInfo
+        *jpeg_info;
+
+      jpeg_info=CloneImageInfo(image_info);
+      jpeg_image=CloneImage(image,0,0,MagickTrue,&image->exception);
+      if (jpeg_image != (Image *) NULL)
+        {
+          MagickSizeType
+            extent;
+
+          size_t
+            max,
+            min;
+
+          /*
+            Search for compression quality that does not exceed image extent.
+          */
+          jpeg_info->quality=0;
+          extent=(MagickSizeType) StringToDouble(option,100.0);
+          (void) DeleteImageOption(jpeg_info,"jpeg:extent");
+          (void) AcquireUniqueFilename(jpeg_image->filename);
+          min=0;
+          for (max=100; (max-min) > 1; )
+          {
+            jpeg_image->quality=min+(max-min)/2;
+            status=WriteJPEGImage(jpeg_info,jpeg_image);
+            if (GetBlobSize(jpeg_image) < extent)
+              min=jpeg_image->quality+1;
+            else
+              max=jpeg_image->quality-1;
+          }
+          (void) RelinquishUniqueFileResource(jpeg_image->filename);
+          image->quality=max;
+          jpeg_image=DestroyImage(jpeg_image);
+        }
+      jpeg_info=DestroyImageInfo(jpeg_info);
+    }
   if ((image_info->compression != LosslessJPEGCompression) &&
       (image->quality <= 100))
     {