Issue #3164: HEIC doesnt have color profile.
Since this requires libheif 1.4.0, released end of February 2019, this commit should not go into the gimp-2-10 branch right now.
This commit is contained in:
@ -65,7 +65,7 @@ m4_define([harfbuzz_required_version], [0.9.19])
|
||||
m4_define([intltool_required_version], [0.40.1])
|
||||
m4_define([lcms_required_version], [2.8])
|
||||
m4_define([libgudev_required_version], [167])
|
||||
m4_define([libheif_required_version], [1.1.0])
|
||||
m4_define([libheif_required_version], [1.4.0])
|
||||
m4_define([liblzma_required_version], [5.0.0])
|
||||
m4_define([libmypaint_required_version], [1.3.0])
|
||||
m4_define([libpng_required_version], [1.6.25])
|
||||
|
@ -337,6 +337,7 @@ load_image (GFile *file,
|
||||
struct heif_error err;
|
||||
struct heif_image_handle *handle = NULL;
|
||||
struct heif_image *img = NULL;
|
||||
GimpColorProfile *profile = NULL;
|
||||
gint n_images;
|
||||
heif_item_id primary;
|
||||
heif_item_id selected_image;
|
||||
@ -478,6 +479,42 @@ load_image (GFile *file,
|
||||
return -1;
|
||||
}
|
||||
|
||||
switch (heif_image_handle_get_color_profile_type (handle))
|
||||
{
|
||||
case heif_color_profile_type_not_present:
|
||||
break;
|
||||
case heif_color_profile_type_rICC:
|
||||
case heif_color_profile_type_prof:
|
||||
/* I am unsure, but it looks like both these types represent an
|
||||
* ICC color profile. XXX
|
||||
*/
|
||||
{
|
||||
void *profile_data;
|
||||
size_t profile_size;
|
||||
|
||||
profile_size = heif_image_handle_get_raw_color_profile_size (handle);
|
||||
profile_data = g_malloc0 (profile_size);
|
||||
err = heif_image_handle_get_raw_color_profile (handle, profile_data);
|
||||
|
||||
if (err.code)
|
||||
g_warning ("%s: color profile loading failed and discarded.",
|
||||
G_STRFUNC);
|
||||
else
|
||||
profile = gimp_color_profile_new_from_icc_profile ((guint8 *) profile_data,
|
||||
profile_size, NULL);
|
||||
|
||||
g_free (profile_data);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
/* heif_color_profile_type_nclx (what is that?) and any future
|
||||
* profile type which we don't support in GIMP (yet).
|
||||
*/
|
||||
g_warning ("%s: unknown color profile type has been discarded.",
|
||||
G_STRFUNC);
|
||||
break;
|
||||
}
|
||||
|
||||
gimp_progress_update (0.75);
|
||||
|
||||
width = heif_image_get_width (img, heif_channel_interleaved);
|
||||
@ -490,6 +527,12 @@ load_image (GFile *file,
|
||||
image_ID = gimp_image_new (width, height, GIMP_RGB);
|
||||
gimp_image_set_filename (image_ID, g_file_get_uri (file));
|
||||
|
||||
if (profile)
|
||||
{
|
||||
gimp_image_set_color_profile (image_ID, profile);
|
||||
g_object_unref (profile);
|
||||
}
|
||||
|
||||
layer_ID = gimp_layer_new (image_ID,
|
||||
_("image content"),
|
||||
width, height,
|
||||
@ -622,6 +665,7 @@ save_image (GFile *file,
|
||||
struct heif_image_handle *handle;
|
||||
struct heif_writer writer;
|
||||
struct heif_error err;
|
||||
GimpColorProfile *profile = NULL;
|
||||
GOutputStream *output;
|
||||
GeglBuffer *buffer;
|
||||
const Babl *format;
|
||||
@ -634,8 +678,9 @@ save_image (GFile *file,
|
||||
gimp_progress_init_printf (_("Exporting '%s'"),
|
||||
g_file_get_parse_name (file));
|
||||
|
||||
width = gimp_drawable_width (drawable_ID);
|
||||
height = gimp_drawable_height (drawable_ID);
|
||||
profile = gimp_image_get_effective_color_profile (image_ID);
|
||||
width = gimp_drawable_width (drawable_ID);
|
||||
height = gimp_drawable_height (drawable_ID);
|
||||
|
||||
has_alpha = gimp_drawable_has_alpha (drawable_ID);
|
||||
|
||||
@ -646,6 +691,16 @@ save_image (GFile *file,
|
||||
heif_chroma_interleaved_24bit,
|
||||
&image);
|
||||
|
||||
if (profile)
|
||||
{
|
||||
const guint8 *icc_data;
|
||||
gsize icc_length;
|
||||
|
||||
icc_data = gimp_color_profile_get_icc_profile (profile, &icc_length);
|
||||
heif_image_set_raw_color_profile (image, "prof", icc_data, icc_length);
|
||||
g_object_unref (profile);
|
||||
}
|
||||
|
||||
heif_image_add_plane (image, heif_channel_interleaved,
|
||||
width, height, has_alpha ? 32 : 24);
|
||||
|
||||
|
Reference in New Issue
Block a user