Merge branch 'master' into add-vips-thumbnail
This commit is contained in:
commit
20f8d95e6c
@ -3,6 +3,7 @@
|
|||||||
- added tiff save to buffer
|
- added tiff save to buffer
|
||||||
- added dzsave save to buffer (zip only)
|
- added dzsave save to buffer (zip only)
|
||||||
- revise header get/set functions
|
- revise header get/set functions
|
||||||
|
- better vipsheader behaviour with complex field types
|
||||||
- added vips_image_hasalpha()
|
- added vips_image_hasalpha()
|
||||||
|
|
||||||
18/10/16 started 8.4.3
|
18/10/16 started 8.4.3
|
||||||
|
@ -493,19 +493,169 @@ vips_buf_appendd( VipsBuf *buf, int d )
|
|||||||
* @buf: the buffer
|
* @buf: the buffer
|
||||||
* @value: #GValue to format and append
|
* @value: #GValue to format and append
|
||||||
*
|
*
|
||||||
* Format and append a #GValue with g_strdup_value_contents().
|
* Format and append a #GValue as a printable thing. We display text line "3144
|
||||||
*
|
* bytes of binary data" for BLOBs like icc-profile-data.
|
||||||
|
*
|
||||||
|
* Use vips_image_get_as_string() to make a text representation of a field.
|
||||||
|
* That will base64-encode blobs, for example.
|
||||||
|
*
|
||||||
* Returns: %FALSE on overflow, %TRUE otherwise.
|
* Returns: %FALSE on overflow, %TRUE otherwise.
|
||||||
*/
|
*/
|
||||||
gboolean
|
gboolean
|
||||||
vips_buf_appendgv( VipsBuf *buf, GValue *value )
|
vips_buf_appendgv( VipsBuf *buf, GValue *value )
|
||||||
{
|
{
|
||||||
char *str_value;
|
GType type = G_VALUE_TYPE( value );
|
||||||
|
GType fundamental = g_type_fundamental( type );
|
||||||
|
|
||||||
|
gboolean handled;
|
||||||
gboolean result;
|
gboolean result;
|
||||||
|
|
||||||
str_value = g_strdup_value_contents( value );
|
result = FALSE;
|
||||||
result = vips_buf_appends( buf, str_value );
|
handled = FALSE;
|
||||||
g_free( str_value );
|
|
||||||
|
switch( fundamental ) {
|
||||||
|
case G_TYPE_STRING:
|
||||||
|
{
|
||||||
|
const char *str;
|
||||||
|
|
||||||
|
/* These are GStrings (gchararray). vips refstrings are
|
||||||
|
* handled by boxed, see below.
|
||||||
|
*/
|
||||||
|
str = g_value_get_string( value );
|
||||||
|
result = vips_buf_appends( buf, str );
|
||||||
|
handled = TRUE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case G_TYPE_OBJECT:
|
||||||
|
{
|
||||||
|
GObject *object;
|
||||||
|
|
||||||
|
object = g_value_get_object( value );
|
||||||
|
if( VIPS_IS_OBJECT( object ) ) {
|
||||||
|
vips_object_summary( VIPS_OBJECT( object ), buf );
|
||||||
|
result = TRUE;
|
||||||
|
handled = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case G_TYPE_INT:
|
||||||
|
result = vips_buf_appendf( buf,
|
||||||
|
"%d", g_value_get_int( value ) );
|
||||||
|
handled = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case G_TYPE_UINT64:
|
||||||
|
result = vips_buf_appendf( buf,
|
||||||
|
"%zd", g_value_get_uint64( value ) );
|
||||||
|
handled = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case G_TYPE_DOUBLE:
|
||||||
|
result = vips_buf_appendf( buf,
|
||||||
|
"%g", g_value_get_double( value ) );
|
||||||
|
handled = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case G_TYPE_BOOLEAN:
|
||||||
|
result = vips_buf_appends( buf,
|
||||||
|
g_value_get_boolean( value ) ? "true" : "false" );
|
||||||
|
handled = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case G_TYPE_ENUM:
|
||||||
|
result = vips_buf_appends( buf,
|
||||||
|
vips_enum_nick( type, g_value_get_enum( value ) ) );
|
||||||
|
handled = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case G_TYPE_FLAGS:
|
||||||
|
{
|
||||||
|
GFlagsClass *flags_class = g_type_class_ref( type );
|
||||||
|
|
||||||
|
GFlagsValue *v;
|
||||||
|
int flags;
|
||||||
|
|
||||||
|
flags = g_value_get_flags( value );
|
||||||
|
|
||||||
|
while( flags &&
|
||||||
|
(v = g_flags_get_first_value( flags_class, flags )) ) {
|
||||||
|
result = vips_buf_appendf( buf, "%s ", v->value_nick );
|
||||||
|
flags &= ~v->value;
|
||||||
|
}
|
||||||
|
|
||||||
|
handled = TRUE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case G_TYPE_BOXED:
|
||||||
|
if( type == VIPS_TYPE_REF_STRING ) {
|
||||||
|
const char *str;
|
||||||
|
size_t str_len;
|
||||||
|
|
||||||
|
/* These should be printable.
|
||||||
|
*/
|
||||||
|
str = vips_value_get_ref_string( value, &str_len );
|
||||||
|
result = vips_buf_appends( buf, str );
|
||||||
|
handled = TRUE;
|
||||||
|
}
|
||||||
|
else if( type == VIPS_TYPE_BLOB ) {
|
||||||
|
size_t str_len;
|
||||||
|
|
||||||
|
/* Binary data and not printable.
|
||||||
|
*/
|
||||||
|
(void) vips_value_get_ref_string( value, &str_len );
|
||||||
|
result = vips_buf_appendf( buf,
|
||||||
|
_( "%zd bytes of binary data" ), str_len );
|
||||||
|
handled = TRUE;
|
||||||
|
}
|
||||||
|
else if( type == VIPS_TYPE_ARRAY_DOUBLE ) {
|
||||||
|
double *arr;
|
||||||
|
int n;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
arr = vips_value_get_array_double( value, &n );
|
||||||
|
for( i = 0; i < n; i++ )
|
||||||
|
result = vips_buf_appendf( buf, "%g ", arr[i] );
|
||||||
|
handled = TRUE;
|
||||||
|
}
|
||||||
|
else if( type == VIPS_TYPE_ARRAY_INT ) {
|
||||||
|
int *arr;
|
||||||
|
int n;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
arr = vips_value_get_array_int( value, &n );
|
||||||
|
for( i = 0; i < n; i++ )
|
||||||
|
result = vips_buf_appendf( buf, "%d ", arr[i] );
|
||||||
|
handled = TRUE;
|
||||||
|
}
|
||||||
|
else if( type == VIPS_TYPE_ARRAY_IMAGE ) {
|
||||||
|
VipsImage **arr;
|
||||||
|
int n;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
arr = vips_value_get_array_image( value, &n );
|
||||||
|
for( i = 0; i < n; i++ ) {
|
||||||
|
vips_object_summary( VIPS_OBJECT( arr[i] ),
|
||||||
|
buf );
|
||||||
|
result = vips_buf_appends( buf, " " );
|
||||||
|
}
|
||||||
|
handled = TRUE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !handled ) {
|
||||||
|
char *str_value;
|
||||||
|
|
||||||
|
str_value = g_strdup_value_contents( value );
|
||||||
|
result = vips_buf_appends( buf, str_value );
|
||||||
|
g_free( str_value );
|
||||||
|
}
|
||||||
|
|
||||||
return( result );
|
return( result );
|
||||||
}
|
}
|
||||||
|
@ -966,7 +966,7 @@ vips_set_value_from_pointer( GValue *value, void *data )
|
|||||||
else if( fundamental == G_TYPE_ENUM )
|
else if( fundamental == G_TYPE_ENUM )
|
||||||
g_value_set_enum( value, *((int *) data) );
|
g_value_set_enum( value, *((int *) data) );
|
||||||
else if( fundamental == G_TYPE_STRING )
|
else if( fundamental == G_TYPE_STRING )
|
||||||
g_value_set_string( value, ((char *) data) );
|
g_value_set_string( value, *((char **) data) );
|
||||||
else
|
else
|
||||||
g_warning( "%s: unimplemented vips_set_value_from_pointer() "
|
g_warning( "%s: unimplemented vips_set_value_from_pointer() "
|
||||||
"type %s",
|
"type %s",
|
||||||
@ -1486,7 +1486,10 @@ vips_image_set_string( VipsImage *image, const char *field, const char *str )
|
|||||||
* This function will read any field, returning it as a printable string.
|
* This function will read any field, returning it as a printable string.
|
||||||
* You need to free the string with g_free() when you are done with it.
|
* You need to free the string with g_free() when you are done with it.
|
||||||
*
|
*
|
||||||
* See also: vips_image_get(), vips_image_get_typeof().
|
* This will base64-encode BLOBs, for example. Use vips_buf_appendgv() to
|
||||||
|
* make a string that's for humans.
|
||||||
|
*
|
||||||
|
* See also: vips_image_get(), vips_image_get_typeof(), vips_buf_appendgv().
|
||||||
*
|
*
|
||||||
* Returns: 0 on success, -1 otherwise.
|
* Returns: 0 on success, -1 otherwise.
|
||||||
*/
|
*/
|
||||||
|
@ -1806,6 +1806,7 @@ vips_flags_from_nick( const char *domain, GType type, const char *nick )
|
|||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Scan @buf for the first "%ns" (eg. "%12s") and substitute the
|
/* Scan @buf for the first "%ns" (eg. "%12s") and substitute the
|
||||||
* lowest-numbered one for @sub. @buf is @len bytes in size.
|
* lowest-numbered one for @sub. @buf is @len bytes in size.
|
||||||
*
|
*
|
||||||
|
@ -5,23 +5,28 @@ vipsheader \- prints information about an image file
|
|||||||
vipsheader [OPTIONS ...] files ...
|
vipsheader [OPTIONS ...] files ...
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
.B vipsheader(1)
|
.B vipsheader(1)
|
||||||
prints image header fields to stdout.
|
prints image header fields to stdout.
|
||||||
|
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.B -a, --all
|
||||||
|
Show all fields. Fields are displayed to be convenient for humans to read, so
|
||||||
|
binary data, for example, is summarized rather than simply copied.
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
.B -f FIELD, --field=FIELD
|
.B -f FIELD, --field=FIELD
|
||||||
Print value of
|
Print value of
|
||||||
.B FIELD
|
.B FIELD
|
||||||
from image header. The special field name getext prints
|
from image header. Fields are printed in a way suitable for programs to
|
||||||
the VIPS extension block: the XML defining the image metadata. You can alter
|
understand, so, for example, binary data is base64-encoded and printed as a
|
||||||
this, then reattach with
|
stream of characters.
|
||||||
.B vipsedit(1).
|
|
||||||
|
|
||||||
.TP
|
The special field name
|
||||||
.B -a, --all
|
.B getext
|
||||||
Show all fields. Normally
|
prints the VIPS extension block: the XML defining the image metadata. You can
|
||||||
.B vipsheader
|
alter this, then reattach with
|
||||||
just shows a one-line summary.
|
.B vipsedit(1).
|
||||||
|
|
||||||
.SH EXAMPLES
|
.SH EXAMPLES
|
||||||
$ vipsheader -f Xsize ~/pics/*.v
|
$ vipsheader -f Xsize ~/pics/*.v
|
||||||
|
@ -106,33 +106,16 @@ static void *
|
|||||||
print_field_fn( VipsImage *image, const char *field, GValue *value, void *a )
|
print_field_fn( VipsImage *image, const char *field, GValue *value, void *a )
|
||||||
{
|
{
|
||||||
gboolean *many = (gboolean *) a;
|
gboolean *many = (gboolean *) a;
|
||||||
const char *extra;
|
char str[256];
|
||||||
char *str_value;
|
VipsBuf buf = VIPS_BUF_STATIC( str );
|
||||||
|
|
||||||
/* Look for known enums and decode them.
|
|
||||||
*/
|
|
||||||
extra = NULL;
|
|
||||||
if( strcmp( field, "coding" ) == 0 )
|
|
||||||
extra = vips_enum_nick(
|
|
||||||
VIPS_TYPE_CODING, g_value_get_int( value ) );
|
|
||||||
else if( strcmp( field, "format" ) == 0 )
|
|
||||||
extra = vips_enum_nick(
|
|
||||||
VIPS_TYPE_BAND_FORMAT, g_value_get_int( value ) );
|
|
||||||
else if( strcmp( field, "interpretation" ) == 0 )
|
|
||||||
extra = vips_enum_nick(
|
|
||||||
VIPS_TYPE_INTERPRETATION, g_value_get_int( value ) );
|
|
||||||
|
|
||||||
if( *many )
|
if( *many )
|
||||||
printf( "%s: ", image->filename );
|
printf( "%s: ", image->filename );
|
||||||
|
|
||||||
str_value = g_strdup_value_contents( value );
|
printf( "%s: ", field );
|
||||||
printf( "%s: %s", field, str_value );
|
|
||||||
g_free( str_value );
|
|
||||||
|
|
||||||
if( extra )
|
vips_buf_appendgv( &buf, value );
|
||||||
printf( " - %s", extra );
|
printf( "%s\n", vips_buf_all( &buf ) );
|
||||||
|
|
||||||
printf( "\n" );
|
|
||||||
|
|
||||||
return( NULL );
|
return( NULL );
|
||||||
}
|
}
|
||||||
@ -166,8 +149,7 @@ print_header( VipsImage *im, gboolean many )
|
|||||||
else {
|
else {
|
||||||
char *str;
|
char *str;
|
||||||
|
|
||||||
if( vips_image_get_as_string( im, main_option_field, &str ) )
|
vips_image_get_as_string( im, main_option_field, &str );
|
||||||
return( -1 );
|
|
||||||
printf( "%s\n", str );
|
printf( "%s\n", str );
|
||||||
g_free( str );
|
g_free( str );
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user