better handling of flip in autorot
if the orientation is one of the ones we don't handle (ie. there's a flip as well as a rot), don't wipe the header tag thanks gertcuykens for the suggestion see https://github.com/libvips/libvips/issues/1028
This commit is contained in:
parent
301a08bf3c
commit
883facb1c0
@ -4,6 +4,8 @@
|
|||||||
* - from jpegload
|
* - from jpegload
|
||||||
* 12/4/16
|
* 12/4/16
|
||||||
* - test and remove orientation from every ifd
|
* - test and remove orientation from every ifd
|
||||||
|
* 6/10/18
|
||||||
|
* - don't remove orientation if it's one of the cases we don't handle
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -108,6 +110,34 @@ vips_autorot_get_angle( VipsImage *im )
|
|||||||
return( angle );
|
return( angle );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* TRUE if this is one of the cases we handle.
|
||||||
|
*/
|
||||||
|
static gboolean
|
||||||
|
vips_autorot_handled( VipsImage *im )
|
||||||
|
{
|
||||||
|
int orientation;
|
||||||
|
gboolean handled;
|
||||||
|
|
||||||
|
if( !vips_image_get_typeof( im, VIPS_META_ORIENTATION ) ||
|
||||||
|
vips_image_get_int( im, VIPS_META_ORIENTATION, &orientation ) )
|
||||||
|
orientation = 1;
|
||||||
|
|
||||||
|
switch( orientation ) {
|
||||||
|
case 1:
|
||||||
|
case 3:
|
||||||
|
case 6:
|
||||||
|
case 8:
|
||||||
|
handled = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
handled = FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return( handled );
|
||||||
|
}
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
vips_autorot_remove_angle_sub( VipsImage *image,
|
vips_autorot_remove_angle_sub( VipsImage *image,
|
||||||
const char *field, GValue *value, void *my_data )
|
const char *field, GValue *value, void *my_data )
|
||||||
@ -152,9 +182,17 @@ vips_autorot_build( VipsObject *object )
|
|||||||
g_object_set( object,
|
g_object_set( object,
|
||||||
"angle", vips_autorot_get_angle( autorot->in ),
|
"angle", vips_autorot_get_angle( autorot->in ),
|
||||||
NULL );
|
NULL );
|
||||||
if( vips_rot( autorot->in, &t[0], autorot->angle, NULL ) )
|
|
||||||
return( -1 );
|
if( vips_autorot_handled( autorot->in ) ) {
|
||||||
vips_autorot_remove_angle( t[0] );
|
if( vips_rot( autorot->in, &t[0], autorot->angle, NULL ) )
|
||||||
|
return( -1 );
|
||||||
|
vips_autorot_remove_angle( t[0] );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if( vips_copy( autorot->in, &t[0], NULL ) )
|
||||||
|
return( -1 );
|
||||||
|
}
|
||||||
|
|
||||||
if( vips_image_write( t[0], conversion->out ) )
|
if( vips_image_write( t[0], conversion->out ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
@ -211,7 +249,8 @@ vips_autorot_init( VipsAutorot *autorot )
|
|||||||
* Read @angle to find the amount the image was rotated by.
|
* Read @angle to find the amount the image was rotated by.
|
||||||
*
|
*
|
||||||
* vips only supports the four simple rotations, it does not support the
|
* vips only supports the four simple rotations, it does not support the
|
||||||
* various mirror modes.
|
* various mirror modes. If the image is using one of these mirror modes, the
|
||||||
|
* image is not rotated and the #VIPS_META_ORIENTATION tag is not removed.
|
||||||
*
|
*
|
||||||
* See also: vips_autorot_get_angle(), vips_autorot_remove_angle(), vips_rot().
|
* See also: vips_autorot_get_angle(), vips_autorot_remove_angle(), vips_rot().
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user