icc import/export cast inputs

This commit is contained in:
John Cupitt 2011-07-12 14:56:58 +01:00
parent e84640af58
commit 0f20f9152b
4 changed files with 33 additions and 15 deletions

View File

@ -70,6 +70,7 @@
- im_blend() also does sizealike, oops
- jpeg write was not inverting CMYK, thanks Ole
- im_falsecolour() converts to mono 8-bit for you
- im_icc_import*/export*() cast inputs for you
30/11/10 started 7.24.0
- bump for new stable

11
TODO
View File

@ -1,18 +1,7 @@
- maplut should force to 8/16 bit unsigned? or does it?
- im_vip2tiff() pyr builder should use new temp system
- can isanalyze still add spurious messages to the vips error buffer?
- icc import / export should cast their inputs, they insist on uchar/ushort at
the moment
we could band up (mono->rgb) and banddown (take first three? take forst
three, then process, then reattach remainder?) as well
other colour ops (eg. im_Lab2LCh) just insist on three bands and do a
cast to float for you
- can we call vips7 funcs from the vips8 interface? we already have vips8 from

View File

@ -17,6 +17,8 @@
* written if we are wrinting to a file
* 2/8/10
* - add lcms2
* 12/7/11
* - import and export cast @in to an appropriate format for you
*/
/*
@ -487,14 +489,34 @@ import_buf( PEL *in, float *out, int n, Icc *icc )
}
}
/* Save a bit of typing.
*/
#define UC IM_BANDFMT_UCHAR
#define US IM_BANDFMT_USHORT
/* Type mapping: go to uchar or ushort.
*/
static int bandfmt_icc_import[10] = {
/* UC C US S UI I F X D DX */
UC, UC, US, US, US, US, US, US, US, US
};
static int
icc_import( IMAGE *in, IMAGE *out, Icc *icc )
{
IMAGE *t;
DWORD icc_format;
if( im_check_uncoded( "im_icc_import", in ) )
return( -1 );
/* Cast in to u8/u16.
*/
if( !(t = im_open_local( out, "im_maplut", "p" )) ||
im_clip2fmt( in, t, bandfmt_icc_import[in->BandFmt] ) )
return( -1 );
in = t;
if( !cmsIsIntentSupported( icc->in_profile,
icc->intent, LCMS_USED_AS_INPUT ) )
im_warn( "im_icc_import",
@ -669,6 +691,7 @@ int
im_icc_export_depth( IMAGE *in, IMAGE *out, int depth,
const char *output_profile_filename, VipsIntent intent )
{
IMAGE *t;
Icc *icc;
DWORD icc_format;
@ -694,11 +717,16 @@ im_icc_export_depth( IMAGE *in, IMAGE *out, int depth,
in = t1;
}
/* Force to float anyway.
*/
if( !(t = im_open_local( out, "im_icc_export", "p" )) ||
im_clip2fmt( in, t, IM_BANDFMT_FLOAT ) )
return( -1 );
/* Check input image.
*/
if( im_check_uncoded( "im_icc_export", in ) ||
im_check_bands( "im_icc_export", in, 3 ) ||
im_check_format( "im_icc_export", in, IM_BANDFMT_FLOAT ) )
im_check_bands( "im_icc_export", in, 3 ) )
return( -1 );
if( depth != 8 && depth != 16 ) {

View File

@ -338,10 +338,10 @@ im_falsecolour( IMAGE *in, IMAGE *out )
/* Check our args, force to mono 8-bit.
*/
if( im_piocheck( in, out ) ||
im_check_uncoded( "im_falsecolour", in ) )
im_check_uncoded( "im_falsecolour", in ) ||
im_open_local_array( out, t, 2, "im_falsecolour", "p" ) ||
im_extract_band( in, t[0], 0 ) ||
im_clip2fmt( t[0], t[1], IM_BANDFMT_UCHAR )
im_clip2fmt( t[0], t[1], IM_BANDFMT_UCHAR ) )
return( -1 );
in = t[1];