Skip to content

Commit

Permalink
start adding xmp/icc/exif/etc. for IM
Browse files Browse the repository at this point in the history
needs to work for im6, im7 and gm, and it's not quite there yet :(
  • Loading branch information
jcupitt committed Feb 6, 2019
1 parent 10b3000 commit 90fef08
Show file tree
Hide file tree
Showing 6 changed files with 118 additions and 3 deletions.
10 changes: 10 additions & 0 deletions configure.ac
Expand Up @@ -762,6 +762,16 @@ if test x"$magick6" = x"yes"; then
LIBS="$save_LIBS" LIBS="$save_LIBS"
fi fi


if test x"$magick6" = x"yes"; then
# IM uses SetImageProfile() with StringInfo
save_LIBS="$LIBS"
LIBS="$LIBS $MAGICK_LIBS"
AC_CHECK_FUNCS(BlobToStringInfo,
AC_DEFINE(HAVE_BLOBTOSTRINGINFO,1,
[define if your magick has BlobToStringInfo().]))
LIBS="$save_LIBS"
fi

if test x"$magick6" = x"yes"; then if test x"$magick6" = x"yes"; then
# GM is missing InheritException # GM is missing InheritException
save_LIBS="$LIBS" save_LIBS="$LIBS"
Expand Down
35 changes: 35 additions & 0 deletions libvips/foreign/magick.c
Expand Up @@ -92,6 +92,21 @@ magick_set_property( Image *image, const char *property, const char *value,
(void) SetImageProperty( image, property, value, exception ); (void) SetImageProperty( image, property, value, exception );
} }


int
magick_set_profile( Image *image,
const char *name, const void *data, size_t length,
ExceptionInfo *exception )
{
StringInfo *string;
MagickBooleanType result;

string = BlobToStringInfo( data, length );
result = SetImageProfile( image, name, string, exception );
DestroyStringInfo( string );

return( result );
}

ExceptionInfo * ExceptionInfo *
magick_acquire_exception( void ) magick_acquire_exception( void )
{ {
Expand Down Expand Up @@ -227,6 +242,26 @@ magick_set_property( Image *image, const char *property, const char *value,
#endif /*HAVE_SETIMAGEPROPERTY*/ #endif /*HAVE_SETIMAGEPROPERTY*/
} }


int
magick_set_profile( Image *image,
const char *name, const void *data, size_t length,
ExceptionInfo *exception )
{
int result;

#ifdef HAVE_BLOBTOSTRINGINFO
StringInfo *string;

string = BlobToStringInfo( data, length );
result = SetImageProfile( image, name, string );
DestroyStringInfo( string );
#else /*HAVE_BLOBTOSTRINGINFO*/
result = SetImageProfile( image, name, data, length );
#endif /*HAVE_BLOBTOSTRINGINFO*/

return( result );
}

ExceptionInfo * ExceptionInfo *
magick_acquire_exception( void ) magick_acquire_exception( void )
{ {
Expand Down
5 changes: 4 additions & 1 deletion libvips/foreign/magick.h
Expand Up @@ -53,7 +53,10 @@ int magick_import_pixels( Image *image, const ssize_t x, const ssize_t y,
const StorageType type,const void *pixels, ExceptionInfo *exception ); const StorageType type,const void *pixels, ExceptionInfo *exception );
void *magick_images_to_blob( const ImageInfo *image_info, Image *images, void *magick_images_to_blob( const ImageInfo *image_info, Image *images,
size_t *length, ExceptionInfo *exception ); size_t *length, ExceptionInfo *exception );
void magick_set_property( Image *image, const char *property, const char *value, void magick_set_property( Image *image,
const char *property, const char *value, ExceptionInfo *exception );
int magick_set_profile( Image *image,
const char *name, const void *data, size_t length,
ExceptionInfo *exception ); ExceptionInfo *exception );
void magick_set_image_option( ImageInfo *image_info, void magick_set_image_option( ImageInfo *image_info,
const char *name, const char *value ); const char *name, const char *value );
Expand Down
5 changes: 5 additions & 0 deletions libvips/foreign/magick2vips.c
Expand Up @@ -444,6 +444,8 @@ parse_header( Read *read )
vips_buf_appendf( &name, VIPS_META_IPTC_NAME ); vips_buf_appendf( &name, VIPS_META_IPTC_NAME );
else if( strcmp( key, "icc" ) == 0 ) else if( strcmp( key, "icc" ) == 0 )
vips_buf_appendf( &name, VIPS_META_ICC_NAME ); vips_buf_appendf( &name, VIPS_META_ICC_NAME );
else if( strcmp( key, "exif" ) == 0 )
vips_buf_appendf( &name, VIPS_META_EXIF_NAME );
else else
vips_buf_appendf( &name, "magickprofile-%s", key ); vips_buf_appendf( &name, "magickprofile-%s", key );


Expand All @@ -452,6 +454,9 @@ parse_header( Read *read )
length = GetStringInfoLength( profile ); length = GetStringInfoLength( profile );
vips_image_set_blob_copy( im, vips_buf_all( &name ), vips_image_set_blob_copy( im, vips_buf_all( &name ),
data, length ); data, length );

if( strcmp( key, "exif" ) == 0 )
(void) vips__exif_parse( im );
} }
} }
#endif /*HAVE_RESETIMAGEPROFILEITERATOR*/ #endif /*HAVE_RESETIMAGEPROFILEITERATOR*/
Expand Down
5 changes: 5 additions & 0 deletions libvips/foreign/magick7load.c
Expand Up @@ -562,6 +562,8 @@ vips_foreign_load_magick7_parse( VipsForeignLoadMagick7 *magick7,
vips_buf_appendf( &name, VIPS_META_IPTC_NAME ); vips_buf_appendf( &name, VIPS_META_IPTC_NAME );
else if( strcmp( key, "icc" ) == 0 ) else if( strcmp( key, "icc" ) == 0 )
vips_buf_appendf( &name, VIPS_META_ICC_NAME ); vips_buf_appendf( &name, VIPS_META_ICC_NAME );
else if( strcmp( key, "exif" ) == 0 )
vips_buf_appendf( &name, VIPS_META_EXIF_NAME );
else else
vips_buf_appendf( &name, "magickprofile-%s", key ); vips_buf_appendf( &name, "magickprofile-%s", key );


Expand All @@ -570,6 +572,9 @@ vips_foreign_load_magick7_parse( VipsForeignLoadMagick7 *magick7,
length = GetStringInfoLength( profile ); length = GetStringInfoLength( profile );
vips_image_set_blob_copy( out, vips_buf_all( &name ), vips_image_set_blob_copy( out, vips_buf_all( &name ),
data, length ); data, length );

if( strcmp( key, "exif" ) == 0 )
(void) vips__exif_parse( im );
} }


magick7->n_pages = GetImageListLength( GetFirstImageInList( image ) ); magick7->n_pages = GetImageListLength( GetFirstImageInList( image ) );
Expand Down
61 changes: 59 additions & 2 deletions libvips/foreign/magicksave.c
Expand Up @@ -89,12 +89,59 @@ vips_foreign_save_magick_dispose( GObject *gobject )
dispose( gobject ); dispose( gobject );
} }


static void typedef struct {
VipsForeignSaveMagick *magick;
Image *image;
} CopyProfileInfo;

static void *
vips_foreign_save_magick_copy_profile( VipsImage *im,
const char *name, GValue *value, CopyProfileInfo *info )
{
char txt[256];
VipsBuf buf = VIPS_BUF_STATIC( txt );
const void *data;
size_t length;
int result;

if( strcmp( name, VIPS_META_XMP_NAME ) == 0 )
vips_buf_appendf( &buf, "xmp" );
else if( strcmp( name, VIPS_META_IPTC_NAME ) == 0 )
vips_buf_appendf( &buf, "iptc" );
else if( strcmp( name, VIPS_META_ICC_NAME ) == 0 )
vips_buf_appendf( &buf, "icc" );
else if( strcmp( name, VIPS_META_EXIF_NAME ) == 0 )
vips_buf_appendf( &buf, "exif" );
else if( vips_isprefix( "magickprofile-", name ) )
vips_buf_appendf( &buf,
"%s", name + strlen( "magickprofile-" ) );

if( vips_buf_is_empty( &buf ) )
return( NULL );
if( !vips_image_get_typeof( im, name ) )
return( NULL );
if( vips_image_get_blob( im, name, &data, &length ) )
return( im );

result = magick_set_profile( info->image,
vips_buf_all( &buf ), data, length, info->magick->exception );
if( !result ) {
VipsObjectClass *class = VIPS_OBJECT_GET_CLASS( info->magick );

magick_vips_error( class->nickname, info->magick->exception );
return( im );
}

return( NULL );
}

static int
vips_foreign_save_magick_set_properties( VipsForeignSaveMagick *magick, vips_foreign_save_magick_set_properties( VipsForeignSaveMagick *magick,
Image *image, VipsImage *im ) Image *image, VipsImage *im )
{ {
int number; int number;
const char *str; const char *str;
CopyProfileInfo info;


if( vips_image_get_typeof( im, "gif-delay" ) && if( vips_image_get_typeof( im, "gif-delay" ) &&
!vips_image_get_int( im, "gif-delay", &number ) ) !vips_image_get_int( im, "gif-delay", &number ) )
Expand All @@ -107,6 +154,15 @@ vips_foreign_save_magick_set_properties( VipsForeignSaveMagick *magick,
if( vips_image_get_typeof( im, "gif-comment" ) && if( vips_image_get_typeof( im, "gif-comment" ) &&
!vips_image_get_string( im, "gif-comment", &str ) ) !vips_image_get_string( im, "gif-comment", &str ) )
magick_set_property( image, "comment", str, magick->exception ); magick_set_property( image, "comment", str, magick->exception );

info.magick = magick;
info.image = image;
if( vips_image_map( im,
(VipsImageMapFn) vips_foreign_save_magick_copy_profile,
&info ) )
return( -1 );

return( 0 );
} }


static int static int
Expand Down Expand Up @@ -155,7 +211,8 @@ vips_foreign_save_magick_create_one( VipsForeignSaveMagick *magick,
if( !magick_set_image_size( image, im->Xsize, im->Ysize, if( !magick_set_image_size( image, im->Xsize, im->Ysize,
magick->exception ) ) magick->exception ) )
return( -1 ); return( -1 );
vips_foreign_save_magick_set_properties( magick, image, im ); if( vips_foreign_save_magick_set_properties( magick, image, im ) )
return( -1 );


magick->current_image = image; magick->current_image = image;
status = vips_sink_disc( im, magick_write_block, magick ); status = vips_sink_disc( im, magick_write_block, magick );
Expand Down

0 comments on commit 90fef08

Please sign in to comment.