add libjxl ICC and scRGB support (#2815)
* add ICC and scRGB support see https://github.com/libvips/libvips/issues/2568 * final polish
This commit is contained in:
parent
ed79cfba7e
commit
6260a37136
@ -27,6 +27,7 @@
|
|||||||
- add vips_tiffsave_target()
|
- add vips_tiffsave_target()
|
||||||
- add vips_target_end(), deprecate vips_target_finish()
|
- add vips_target_end(), deprecate vips_target_finish()
|
||||||
- add "mixed" to webpsave [dloebl]
|
- add "mixed" to webpsave [dloebl]
|
||||||
|
- add support for ICC profiles and linear encoding to JXL load and save [f1ac]
|
||||||
- add "reoptimise" to gifsave [dloebl]
|
- add "reoptimise" to gifsave [dloebl]
|
||||||
- add "bitdepth" to magicksave [dloebl]
|
- add "bitdepth" to magicksave [dloebl]
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
/*
|
/*
|
||||||
#define DEBUG_VERBOSE
|
#define DEBUG_VERBOSE
|
||||||
#define DEBUG
|
#define DEBUG
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
@ -434,7 +434,6 @@ vips_foreign_load_jxl_set_header( VipsForeignLoadJxl *jxl, VipsImage *out )
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case VIPS_FORMAT_USHORT:
|
case VIPS_FORMAT_USHORT:
|
||||||
case VIPS_FORMAT_UINT:
|
|
||||||
interpretation = VIPS_INTERPRETATION_GREY16;
|
interpretation = VIPS_INTERPRETATION_GREY16;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -451,7 +450,6 @@ vips_foreign_load_jxl_set_header( VipsForeignLoadJxl *jxl, VipsImage *out )
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case VIPS_FORMAT_USHORT:
|
case VIPS_FORMAT_USHORT:
|
||||||
case VIPS_FORMAT_UINT:
|
|
||||||
interpretation = VIPS_INTERPRETATION_RGB16;
|
interpretation = VIPS_INTERPRETATION_RGB16;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
*
|
*
|
||||||
* 18/3/20
|
* 18/3/20
|
||||||
* - from heifload.c
|
* - from heifload.c
|
||||||
|
* 21/5/22
|
||||||
|
* - add ICC profile support
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -31,7 +33,9 @@
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
#define DEBUG
|
#define DEBUG
|
||||||
|
*/
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
@ -53,8 +57,6 @@
|
|||||||
#include "pforeign.h"
|
#include "pforeign.h"
|
||||||
|
|
||||||
/* TODO:
|
/* TODO:
|
||||||
*
|
|
||||||
* - libjxl currently seems to be missing API to attach a profile
|
|
||||||
*
|
*
|
||||||
* - libjxl encode only works in one shot mode, so there's no way to write in
|
* - libjxl encode only works in one shot mode, so there's no way to write in
|
||||||
* chunks
|
* chunks
|
||||||
@ -64,8 +66,6 @@
|
|||||||
* - add animation support
|
* - add animation support
|
||||||
*
|
*
|
||||||
* - libjxl is currently missing error messages (I think)
|
* - libjxl is currently missing error messages (I think)
|
||||||
*
|
|
||||||
* - fix scRGB gamma
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define OUTPUT_BUFFER_SIZE (4096)
|
#define OUTPUT_BUFFER_SIZE (4096)
|
||||||
@ -330,8 +330,18 @@ vips_foreign_save_jxl_build( VipsObject *object )
|
|||||||
jxl->info.intensity_target = stonits;
|
jxl->info.intensity_target = stonits;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME libjxl doesn't seem to have this API yet.
|
/* We will be setting the ICC profile, or calling
|
||||||
*
|
* JxlEncoderSetColorEncoding().
|
||||||
|
*/
|
||||||
|
jxl->info.uses_original_profile = TRUE;
|
||||||
|
|
||||||
|
if( JxlEncoderSetBasicInfo( jxl->encoder, &jxl->info ) ) {
|
||||||
|
vips_foreign_save_jxl_error( jxl, "JxlEncoderSetBasicInfo" );
|
||||||
|
return( -1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set ICC profile, sRGB, or scRGB.
|
||||||
|
*/
|
||||||
if( vips_image_get_typeof( save->ready, VIPS_META_ICC_NAME ) ) {
|
if( vips_image_get_typeof( save->ready, VIPS_META_ICC_NAME ) ) {
|
||||||
const void *data;
|
const void *data;
|
||||||
size_t length;
|
size_t length;
|
||||||
@ -340,28 +350,40 @@ vips_foreign_save_jxl_build( VipsObject *object )
|
|||||||
VIPS_META_ICC_NAME, &data, &length ) )
|
VIPS_META_ICC_NAME, &data, &length ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
jxl->info.uses_original_profile = JXL_TRUE;
|
#ifdef DEBUG
|
||||||
... attach profile
|
printf( "attaching %zd bytes of ICC\n", length );
|
||||||
|
#endif /*DEBUG*/
|
||||||
|
if( JxlEncoderSetICCProfile( jxl->encoder,
|
||||||
|
(guint8 *) data, length ) ) {
|
||||||
|
vips_foreign_save_jxl_error( jxl,
|
||||||
|
"JxlEncoderSetColorEncoding" );
|
||||||
|
return( -1 );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
jxl->info.uses_original_profile = JXL_FALSE;
|
if( save->ready->Type == VIPS_INTERPRETATION_scRGB ) {
|
||||||
*/
|
#ifdef DEBUG
|
||||||
|
printf( "setting sRGB colourspace\n" );
|
||||||
|
#endif /*DEBUG*/
|
||||||
|
|
||||||
/* Remove this when libjxl gets API to attach an ICC profile.
|
JxlColorEncodingSetToLinearSRGB( &jxl->color_encoding,
|
||||||
*/
|
jxl->format.num_channels < 3 );
|
||||||
jxl->info.uses_original_profile = JXL_FALSE;
|
}
|
||||||
|
else {
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf( "setting scRGB colourspace\n" );
|
||||||
|
#endif /*DEBUG*/
|
||||||
|
|
||||||
if( JxlEncoderSetBasicInfo( jxl->encoder, &jxl->info ) ) {
|
JxlColorEncodingSetToSRGB( &jxl->color_encoding,
|
||||||
vips_foreign_save_jxl_error( jxl, "JxlEncoderSetBasicInfo" );
|
jxl->format.num_channels < 3 );
|
||||||
return( -1 );
|
}
|
||||||
}
|
|
||||||
|
|
||||||
JxlColorEncodingSetToSRGB( &jxl->color_encoding,
|
if( JxlEncoderSetColorEncoding( jxl->encoder,
|
||||||
jxl->format.num_channels < 3 );
|
&jxl->color_encoding ) ) {
|
||||||
if( JxlEncoderSetColorEncoding( jxl->encoder, &jxl->color_encoding ) ) {
|
vips_foreign_save_jxl_error( jxl,
|
||||||
vips_foreign_save_jxl_error( jxl,
|
"JxlEncoderSetColorEncoding" );
|
||||||
"JxlEncoderSetColorEncoding" );
|
return( -1 );
|
||||||
return( -1 );
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Render the entire image in memory. libjxl seems to be missing
|
/* Render the entire image in memory. libjxl seems to be missing
|
||||||
@ -430,7 +452,6 @@ vips_foreign_save_jxl_build( VipsObject *object )
|
|||||||
*/
|
*/
|
||||||
#define UC VIPS_FORMAT_UCHAR
|
#define UC VIPS_FORMAT_UCHAR
|
||||||
#define US VIPS_FORMAT_USHORT
|
#define US VIPS_FORMAT_USHORT
|
||||||
#define UI VIPS_FORMAT_UINT
|
|
||||||
#define F VIPS_FORMAT_FLOAT
|
#define F VIPS_FORMAT_FLOAT
|
||||||
|
|
||||||
/* Type promotion for save ... unsigned ints + float + double.
|
/* Type promotion for save ... unsigned ints + float + double.
|
||||||
|
Loading…
Reference in New Issue
Block a user