From 34971b175628affdee000f14694cfe3084026f4a Mon Sep 17 00:00:00 2001 From: Thomas Barton Date: Thu, 19 May 2022 09:30:23 -0700 Subject: [PATCH] flag to save bmp with bitdepth 1 (#2) --- configure.ac | 2 +- libvips/foreign/magick.c | 10 ++++++++++ libvips/foreign/magick.h | 2 ++ libvips/foreign/vips2magick.c | 19 +++++++++++++++++++ meson.build | 2 +- 5 files changed, 33 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 3fdc143bf1..72c9aa057b 100644 --- a/configure.ac +++ b/configure.ac @@ -624,7 +624,7 @@ if test x"$magick6" = x"yes"; then LIBS="$LIBS $MAGICK_LIBS" CFLAGS="$CFLAGS $MAGICK_CFLAGS" - AC_CHECK_FUNCS([InheritException AcquireExceptionInfo SetImageProperty SetImageExtent AcquireImage GetVirtualPixels ResetImageProfileIterator ResetImageAttributeIterator ResetImagePropertyIterator MagickCoreGenesis SetImageOption BlobToStringInfo OptimizePlusImageLayers OptimizeImageTransparency]) + AC_CHECK_FUNCS([InheritException AcquireExceptionInfo SetImageProperty SetImageExtent AcquireImage GetVirtualPixels ResetImageProfileIterator ResetImageAttributeIterator ResetImagePropertyIterator MagickCoreGenesis SetImageOption BlobToStringInfo OptimizePlusImageLayers OptimizeImageTransparency SetImageType]) LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" diff --git a/libvips/foreign/magick.c b/libvips/foreign/magick.c index 177cc4e438..2d6776b1ad 100644 --- a/libvips/foreign/magick.c +++ b/libvips/foreign/magick.c @@ -846,4 +846,14 @@ magick_set_magick_profile( Image *image, return( 0 ); } +int +magick_set_image_type( Image *images, + ImageType image_type, ExceptionInfo *exception ) +{ +// SetImageDepth( images, 1, exception); + SetImageType( images, image_type, exception ); + + return( exception->severity == UndefinedException ); +} + #endif /*defined(HAVE_MAGICK6) || defined(HAVE_MAGICK7)*/ diff --git a/libvips/foreign/magick.h b/libvips/foreign/magick.h index 21b56bed02..d175a78d61 100644 --- a/libvips/foreign/magick.h +++ b/libvips/foreign/magick.h @@ -88,6 +88,8 @@ int magick_optimize_image_layers( Image **images, ExceptionInfo *exception ); int magick_optimize_image_transparency( const Image *images, ExceptionInfo *exception ); +int magick_set_image_type( Image *images, ImageType image_type, ExceptionInfo *exception ); + gboolean magick_ismagick( const unsigned char *bytes, size_t length ); #endif /*HAVE_MAGICK6*/ diff --git a/libvips/foreign/vips2magick.c b/libvips/foreign/vips2magick.c index 96cdcf6cf4..c5f6e7d6de 100644 --- a/libvips/foreign/vips2magick.c +++ b/libvips/foreign/vips2magick.c @@ -69,6 +69,7 @@ typedef struct _VipsForeignSaveMagick { char *filename; /* NULL during buffer output */ char *format; int quality; + gboolean bmp_bitdepth_1; gboolean optimize_gif_frames; gboolean optimize_gif_transparency; @@ -406,6 +407,17 @@ vips_foreign_save_magick_build( VipsObject *object ) return( -1 ); } } + + if( magick->bmp_bitdepth_1 ) { + if( !magick_set_image_type( magick->images, + BilevelType, magick->exception ) ) { + magick_inherit_exception( magick->exception, + magick->images ); + magick_vips_error( class->nickname, magick->exception ); + + return( -1 ); + } + } return( 0 ); } @@ -493,6 +505,13 @@ vips_foreign_save_magick_class_init( VipsForeignSaveMagickClass *class ) G_STRUCT_OFFSET( VipsForeignSaveMagick, optimize_gif_transparency ), FALSE ); + + VIPS_ARG_BOOL( class, "bmp_bitdepth_1", 6, + _( "BMP bithdepth 1" ), + _( "BMP file bitdepth 1`" ), + VIPS_ARGUMENT_OPTIONAL_INPUT, + G_STRUCT_OFFSET( VipsForeignSaveMagick, bmp_bitdepth_1 ), + FALSE ); } static void diff --git a/meson.build b/meson.build index 27160d02bc..64f742d6ff 100644 --- a/meson.build +++ b/meson.build @@ -186,7 +186,7 @@ if not get_option('magick').disabled() and magick_dep.found() if cc.has_member('struct _ImageInfo', 'number_scenes', prefix: '#include ', dependencies: magick_dep) cfg_var.set('HAVE_NUMBER_SCENES', '1') endif - func_names = [ 'InheritException', 'AcquireExceptionInfo', 'SetImageProperty', 'SetImageExtent', 'AcquireImage', 'GetVirtualPixels', 'ResetImageProfileIterator', 'ResetImageAttributeIterator', 'ResetImagePropertyIterator', 'MagickCoreGenesis', 'SetImageOption', 'BlobToStringInfo', 'OptimizePlusImageLayers', 'OptimizeImageTransparency' ] + func_names = [ 'InheritException', 'AcquireExceptionInfo', 'SetImageProperty', 'SetImageExtent', 'AcquireImage', 'GetVirtualPixels', 'ResetImageProfileIterator', 'ResetImageAttributeIterator', 'ResetImagePropertyIterator', 'MagickCoreGenesis', 'SetImageOption', 'BlobToStringInfo', 'OptimizePlusImageLayers', 'OptimizeImageTransparency', 'SetImageType' ] foreach func_name : func_names if cc.has_function(func_name, prefix: '#include ', dependencies: magick_dep) cfg_var.set('HAVE_' + func_name.to_upper(), '1')