From 2575d963bd66078f81045efd252f41dafd915310 Mon Sep 17 00:00:00 2001 From: John Cupitt Date: Sat, 20 Mar 2021 12:16:10 +0000 Subject: [PATCH] add jp2k tests and buffer load/save --- ChangeLog | 3 +- libvips/foreign/foreign.c | 4 + libvips/foreign/jp2kload.c | 115 ++++++++++++++++++++++++++++- libvips/foreign/jp2ksave.c | 112 ++++++++++++++++++++++++++++ libvips/include/vips/foreign.h | 4 + test/test-suite/helpers/helpers.py | 1 + test/test-suite/images/world.jp2 | Bin 0 -> 63958 bytes test/test-suite/test_foreign.py | 28 ++++++- 8 files changed, 263 insertions(+), 4 deletions(-) create mode 100644 test/test-suite/images/world.jp2 diff --git a/ChangeLog b/ChangeLog index 8dd9f0a2..93d05c1c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -20,8 +20,7 @@ - add vips_fitsload_source(), vips_niftiload_source() - png and gif load note background colour as metadata [781545872] - add vips_image_[set|get]_array_double() -- add vips_jp2kload(), vips_jp2kload_source(), vips_jp2ksave(), - vips_jp2ksave_target() +- add JPEG2000 load and save 22/12/20 start 8.10.6 - don't seek on bad file descriptors [kleisauke] diff --git a/libvips/foreign/foreign.c b/libvips/foreign/foreign.c index 7420ed25..f29c93a2 100644 --- a/libvips/foreign/foreign.c +++ b/libvips/foreign/foreign.c @@ -2177,8 +2177,10 @@ vips_foreign_operation_init( void ) extern GType vips_foreign_load_svg_source_get_type( void ); extern GType vips_foreign_load_jp2k_file_get_type( void ); + extern GType vips_foreign_load_jp2k_buffer_get_type( void ); extern GType vips_foreign_load_jp2k_source_get_type( void ); extern GType vips_foreign_save_jp2k_file_get_type( void ); + extern GType vips_foreign_save_jp2k_buffer_get_type( void ); extern GType vips_foreign_save_jp2k_target_get_type( void ); extern GType vips_foreign_load_heif_file_get_type( void ); @@ -2253,8 +2255,10 @@ vips_foreign_operation_init( void ) #ifdef HAVE_LIBOPENJP2 vips_foreign_load_jp2k_file_get_type(); + vips_foreign_load_jp2k_buffer_get_type(); vips_foreign_load_jp2k_source_get_type(); vips_foreign_save_jp2k_file_get_type(); + vips_foreign_save_jp2k_buffer_get_type(); vips_foreign_save_jp2k_target_get_type(); #endif /*HAVE_LIBOPENJP2*/ diff --git a/libvips/foreign/jp2kload.c b/libvips/foreign/jp2kload.c index cb31cd2e..8024273d 100644 --- a/libvips/foreign/jp2kload.c +++ b/libvips/foreign/jp2kload.c @@ -32,9 +32,9 @@ */ /* - */ #define DEBUG_VERBOSE #define DEBUG + */ #ifdef HAVE_CONFIG_H #include @@ -839,6 +839,84 @@ vips_foreign_load_jp2k_file_init( VipsForeignLoadJp2kFile *jp2k ) { } +typedef struct _VipsForeignLoadJp2kBuffer { + VipsForeignLoadJp2k parent_object; + + /* Load from a buffer. + */ + VipsArea *buf; + +} VipsForeignLoadJp2kBuffer; + +typedef VipsForeignLoadJp2kClass VipsForeignLoadJp2kBufferClass; + +G_DEFINE_TYPE( VipsForeignLoadJp2kBuffer, vips_foreign_load_jp2k_buffer, + vips_foreign_load_jp2k_get_type() ); + +static int +vips_foreign_load_jp2k_buffer_build( VipsObject *object ) +{ + VipsForeignLoadJp2k *jp2k = (VipsForeignLoadJp2k *) object; + VipsForeignLoadJp2kBuffer *buffer = + (VipsForeignLoadJp2kBuffer *) object; + + if( buffer->buf ) + if( !(jp2k->source = vips_source_new_from_memory( + VIPS_AREA( buffer->buf )->data, + VIPS_AREA( buffer->buf )->length )) ) + return( -1 ); + + if( VIPS_OBJECT_CLASS( vips_foreign_load_jp2k_file_parent_class )-> + build( object ) ) + return( -1 ); + + return( 0 ); +} + +static gboolean +vips_foreign_load_jp2k_buffer_is_a( const void *buf, size_t len ) +{ + VipsSource *source; + gboolean result; + + if( !(source = vips_source_new_from_memory( buf, len )) ) + return( FALSE ); + result = vips_foreign_load_jp2k_is_a_source( source ); + VIPS_UNREF( source ); + + return( result ); +} + +static void +vips_foreign_load_jp2k_buffer_class_init( + VipsForeignLoadJp2kBufferClass *class ) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS( class ); + VipsObjectClass *object_class = (VipsObjectClass *) class; + VipsForeignLoadClass *load_class = (VipsForeignLoadClass *) class; + + gobject_class->set_property = vips_object_set_property; + gobject_class->get_property = vips_object_get_property; + + object_class->nickname = "jp2kload_buffer"; + object_class->build = vips_foreign_load_jp2k_buffer_build; + + load_class->is_a_buffer = vips_foreign_load_jp2k_buffer_is_a; + + VIPS_ARG_BOXED( class, "buffer", 1, + _( "Buffer" ), + _( "Buffer to load from" ), + VIPS_ARGUMENT_REQUIRED_INPUT, + G_STRUCT_OFFSET( VipsForeignLoadJp2kBuffer, buf ), + VIPS_TYPE_BLOB ); + +} + +static void +vips_foreign_load_jp2k_buffer_init( VipsForeignLoadJp2kBuffer *buffer ) +{ +} + typedef struct _VipsForeignLoadJp2kSource { VipsForeignLoadJp2k parent_object; @@ -939,6 +1017,41 @@ vips_jp2kload( const char *filename, VipsImage **out, ... ) return( result ); } +/** + * vips_jp2kload_buffer: + * @buf: (array length=len) (element-type guint8): memory area to load + * @len: (type gsize): size of memory area + * @out: (out): image to write + * @...: %NULL-terminated list of optional named arguments + * + * Optional arguments: + * + * * @page: %gint, load this page + * + * Exactly as vips_jp2kload(), but read from a source. + * + * Returns: 0 on success, -1 on error. + */ +int +vips_jp2kload_buffer( void *buf, size_t len, VipsImage **out, ... ) +{ + va_list ap; + VipsBlob *blob; + int result; + + /* We don't take a copy of the data or free it. + */ + blob = vips_blob_new( NULL, buf, len ); + + va_start( ap, out ); + result = vips_call_split( "jp2kload_buffer", ap, blob, out ); + va_end( ap ); + + vips_area_unref( VIPS_AREA( blob ) ); + + return( result ); +} + /** * vips_jp2kload_source: * @source: source to load from diff --git a/libvips/foreign/jp2ksave.c b/libvips/foreign/jp2ksave.c index 68d2a74d..2b41aacb 100644 --- a/libvips/foreign/jp2ksave.c +++ b/libvips/foreign/jp2ksave.c @@ -615,6 +615,70 @@ vips_foreign_save_jp2k_file_init( VipsForeignSaveJp2kFile *file ) { } +typedef struct _VipsForeignSaveJp2kBuffer { + VipsForeignSaveJp2k parent_object; + + /* Save to a buffer. + */ + VipsArea *buf; + +} VipsForeignSaveJp2kBuffer; + +typedef VipsForeignSaveJp2kClass VipsForeignSaveJp2kBufferClass; + +G_DEFINE_TYPE( VipsForeignSaveJp2kBuffer, vips_foreign_save_jp2k_buffer, + vips_foreign_save_jp2k_get_type() ); + +static int +vips_foreign_save_jp2k_buffer_build( VipsObject *object ) +{ + VipsForeignSaveJp2k *jp2k = (VipsForeignSaveJp2k *) object; + VipsForeignSaveJp2kBuffer *buffer = + (VipsForeignSaveJp2kBuffer *) object; + + VipsBlob *blob; + + if( !(jp2k->target = vips_target_new_to_memory()) ) + return( -1 ); + + if( VIPS_OBJECT_CLASS( vips_foreign_save_jp2k_buffer_parent_class )-> + build( object ) ) + return( -1 ); + + g_object_get( jp2k->target, "blob", &blob, NULL ); + g_object_set( buffer, "buffer", blob, NULL ); + vips_area_unref( VIPS_AREA( blob ) ); + + return( 0 ); +} + +static void +vips_foreign_save_jp2k_buffer_class_init( + VipsForeignSaveJp2kBufferClass *class ) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS( class ); + VipsObjectClass *object_class = (VipsObjectClass *) class; + + gobject_class->set_property = vips_object_set_property; + gobject_class->get_property = vips_object_get_property; + + object_class->nickname = "jp2ksave_buffer"; + object_class->build = vips_foreign_save_jp2k_buffer_build; + + VIPS_ARG_BOXED( class, "buffer", 1, + _( "Buffer" ), + _( "Buffer to save to" ), + VIPS_ARGUMENT_REQUIRED_OUTPUT, + G_STRUCT_OFFSET( VipsForeignSaveJp2kBuffer, buf ), + VIPS_TYPE_BLOB ); + +} + +static void +vips_foreign_save_jp2k_buffer_init( VipsForeignSaveJp2kBuffer *buffer ) +{ +} + typedef struct _VipsForeignSaveJp2kTarget { VipsForeignSaveJp2k parent_object; @@ -715,6 +779,54 @@ vips_jp2ksave( VipsImage *in, const char *filename, ... ) return( result ); } +/** + * vips_jp2ksave_buffer: (method) + * @in: image to save + * @buf: (array length=len) (element-type guint8): return output buffer here + * @len: (type gsize): return output length here + * @...: %NULL-terminated list of optional named arguments + * + * Optional arguments: + * + * * @Q: %gint, quality factor + * * @lossless: %gboolean, enables lossless compression + * * @tile_width: %gint for tile size + * * @tile_height: %gint for tile size + * + * As vips_jp2ksave(), but save to a target. + * + * See also: vips_jp2ksave(), vips_image_write_to_target(). + * + * Returns: 0 on success, -1 on error. + */ +int +vips_jp2ksave_buffer( VipsImage *in, void **buf, size_t *len, ... ) +{ + va_list ap; + VipsArea *area; + int result; + + area = NULL; + + va_start( ap, len ); + result = vips_call_split( "jp2ksave_buffer", ap, in, &area ); + va_end( ap ); + + if( !result && + area ) { + if( buf ) { + *buf = area->data; + area->free_fn = NULL; + } + if( len ) + *len = area->length; + + vips_area_unref( area ); + } + + return( result ); +} + /** * vips_jp2ksave_target: (method) * @in: image to save diff --git a/libvips/include/vips/foreign.h b/libvips/include/vips/foreign.h index 595ad51b..726b119a 100644 --- a/libvips/include/vips/foreign.h +++ b/libvips/include/vips/foreign.h @@ -678,10 +678,14 @@ int vips_niftisave( VipsImage *in, const char *filename, ... ) int vips_jp2kload( const char *filename, VipsImage **out, ... ) __attribute__((sentinel)); +int vips_jp2kload_buffer( void *buf, size_t len, VipsImage **out, ... ) + __attribute__((sentinel)); int vips_jp2kload_source( VipsSource *source, VipsImage **out, ... ) __attribute__((sentinel)); int vips_jp2ksave( VipsImage *in, const char *filename, ... ) __attribute__((sentinel)); +int vips_heifsave_buffer( VipsImage *in, void **buf, size_t *len, ... ) + __attribute__((sentinel)); int vips_jp2ksave_target( VipsImage *in, VipsTarget *target, ... ) __attribute__((sentinel)); diff --git a/test/test-suite/helpers/helpers.py b/test/test-suite/helpers/helpers.py index bac50248..0fa2bab6 100644 --- a/test/test-suite/helpers/helpers.py +++ b/test/test-suite/helpers/helpers.py @@ -56,6 +56,7 @@ MOSAIC_MARKS = [[489, 140], [66, 141], MOSAIC_VERTICAL_MARKS = [[388, 44], [364, 346], [384, 17], [385, 629], [527, 42], [503, 959]] +JP2K_FILE = os.path.join(IMAGES, "world.jp2") unsigned_formats = [pyvips.BandFormat.UCHAR, pyvips.BandFormat.USHORT, diff --git a/test/test-suite/images/world.jp2 b/test/test-suite/images/world.jp2 new file mode 100644 index 0000000000000000000000000000000000000000..0f84bc5089b325a1e5d3ef4a275ed58d47c59e2a GIT binary patch literal 63958 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 z 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 MAJJbe(13vd*+~>qtN;K2 literal 0 HcmV?d00001 diff --git a/test/test-suite/test_foreign.py b/test/test-suite/test_foreign.py index 42d5eedf..8e3a52bb 100644 --- a/test/test-suite/test_foreign.py +++ b/test/test-suite/test_foreign.py @@ -18,7 +18,7 @@ from helpers import \ GIF_ANIM_DISPOSE_PREVIOUS_EXPECTED_PNG_FILE, \ temp_filename, assert_almost_equal_objects, have, skip_if_no, \ TIF1_FILE, TIF2_FILE, TIF4_FILE, WEBP_LOOKS_LIKE_SVG_FILE, \ - WEBP_ANIMATED_FILE + WEBP_ANIMATED_FILE, JP2K_FILE class TestForeign: tempdir = None @@ -1136,6 +1136,32 @@ class TestForeign: y = pyvips.Image.new_from_buffer(buf, "") assert y.get("exif-ifd0-Make").split(" ")[0] == "banana" + @skip_if_no("jp2kload") + def test_jp2kload(self): + def jp2k_valid(im): + a = im(402, 73) + assert_almost_equal_objects(a, [141, 144, 73], threshold=2) + assert im.width == 800 + assert im.height == 400 + assert im.bands == 3 + + self.file_loader("jp2kload", JP2K_FILE, jp2k_valid) + self.buffer_loader("jp2kload_buffer", JP2K_FILE, jp2k_valid) + + @skip_if_no("jp2ksave") + def test_jp2ksave(self): + self.save_load_buffer("jp2ksave_buffer", "jp2kload_buffer", + self.colour, 80) + + buf = self.colour.jp2ksave_buffer(lossless=True) + im2 = pyvips.Image.new_from_buffer(buf, "") + assert self.colour.avg() == im2.avg() + + # higher Q should mean a bigger buffer + b1 = self.mono.jp2ksave_buffer(Q=10) + b2 = self.mono.jp2ksave_buffer(Q=90) + assert len(b2) > len(b1) + if __name__ == '__main__': pytest.main()