diff options
author | Matthias Vogelgesang <matthias.vogelgesang@kit.edu> | 2018-04-23 14:19:56 +0200 |
---|---|---|
committer | Matthias Vogelgesang <matthias.vogelgesang@kit.edu> | 2018-04-23 14:23:59 +0200 |
commit | 13d436eae25f1b49e681ae0535729dd0dea508dd (patch) | |
tree | 8b6bcf9ec6892cb59769ea99eab28a9ab8321d6b | |
parent | b13d72b19bb77c5233d730abde239c3555f3ffca (diff) | |
download | ufo-filters-13d436eae25f1b49e681ae0535729dd0dea508dd.tar.gz ufo-filters-13d436eae25f1b49e681ae0535729dd0dea508dd.tar.bz2 ufo-filters-13d436eae25f1b49e681ae0535729dd0dea508dd.tar.xz ufo-filters-13d436eae25f1b49e681ae0535729dd0dea508dd.zip |
Fix #159: add boolean `rescale` option
If set to TRUE (default) the writer will rescale the values either
implicitly according to the minimum and maximum values or the ones
provided by the user. Otherwise the data will not be modified
numerically.
-rw-r--r-- | docs/sinks.rst | 9 | ||||
-rw-r--r-- | src/ufo-write-task.c | 14 | ||||
-rw-r--r-- | src/writers/ufo-writer.c | 71 | ||||
-rw-r--r-- | src/writers/ufo-writer.h | 1 |
4 files changed, 81 insertions, 14 deletions
diff --git a/docs/sinks.rst b/docs/sinks.rst index c78d083..a100fe5 100644 --- a/docs/sinks.rst +++ b/docs/sinks.rst @@ -45,7 +45,8 @@ File writer Possible values are 8 and 16 which are saved as integer types and 32 bit float. By default, the minimum and maximum for scaling is determined automatically, however depending on the use case you should override - this with the ``minimum`` and ``maximum`` properties. + this with the ``minimum`` and ``maximum`` properties. To avoid + rescaling, set the ``rescale`` property to ``FALSE``. .. gobj:prop:: minimum:float @@ -57,6 +58,12 @@ File writer This value will represent the largest possible value for discrete bit depths, i.e. 8 and 16 bit. + .. gobj:prop:: rescale:boolean + + If ``TRUE`` and ``bits`` is set to a value less than 32, rescale values + either by looking for minimum and maximum values or using the values + provided by the user. + For JPEG files the following property applies: .. gobj:prop:: quality:uint diff --git a/src/ufo-write-task.c b/src/ufo-write-task.c index c4fb643..d56512a 100644 --- a/src/ufo-write-task.c +++ b/src/ufo-write-task.c @@ -58,6 +58,7 @@ struct _UfoWriteTaskPrivate { UfoBufferDepth depth; gfloat minimum; gfloat maximum; + gboolean rescale; gboolean multi_file; gboolean opened; @@ -100,6 +101,7 @@ enum { PROP_BITS, PROP_MINIMUM, PROP_MAXIMUM, + PROP_RESCALE, #ifdef HAVE_JPEG PROP_JPEG_QUALITY, #endif @@ -340,6 +342,7 @@ ufo_write_task_process (UfoTask *task, image.depth = priv->depth; image.min = priv->minimum; image.max = priv->maximum; + image.rescale = priv->rescale; for (guint i = 0; i < num_frames; i++) { retry: @@ -421,6 +424,9 @@ ufo_write_task_set_property (GObject *object, case PROP_MINIMUM: priv->minimum = g_value_get_float (value); break; + case PROP_RESCALE: + priv->rescale = g_value_get_boolean (value); + break; #ifdef HAVE_JPEG case PROP_JPEG_QUALITY: priv->jpeg_quality = g_value_get_uint (value); @@ -606,6 +612,13 @@ ufo_write_task_class_init (UfoWriteTaskClass *klass) -G_MAXFLOAT, G_MAXFLOAT, -G_MAXFLOAT, G_PARAM_READWRITE); + properties[PROP_RESCALE] = + g_param_spec_boolean ("rescale", + "If true rescale values automatically or according to set min and max", + "If true rescale values automatically or according to set min and max", + TRUE, + G_PARAM_READWRITE); + #ifdef HAVE_JPEG properties[PROP_JPEG_QUALITY] = g_param_spec_uint ("jpeg-quality", @@ -632,6 +645,7 @@ ufo_write_task_init(UfoWriteTask *self) self->priv->depth = UFO_BUFFER_DEPTH_32F; self->priv->minimum = G_MAXFLOAT; self->priv->maximum = -G_MAXFLOAT; + self->priv->rescale = TRUE; self->priv->writer = NULL; self->priv->opened = FALSE; self->priv->filename = NULL; diff --git a/src/writers/ufo-writer.c b/src/writers/ufo-writer.c index 512c0d5..03239a9 100644 --- a/src/writers/ufo-writer.c +++ b/src/writers/ufo-writer.c @@ -78,12 +78,9 @@ get_min_max (UfoWriterImage *image, gfloat *src, gsize n_elements, gfloat *min, *min = cmin; } -static void -convert_to_8bit (UfoWriterImage *image) +static gsize +get_number_of_pixels (UfoWriterImage *image) { - gfloat *src; - guint8 *dst; - gfloat max, min, scale; gsize size; size = image->requisition->dims[0] * image->requisition->dims[1]; @@ -91,6 +88,18 @@ convert_to_8bit (UfoWriterImage *image) if (image->requisition->n_dims == 3 && image->requisition->dims[2] == 3) size *= image->requisition->dims[2]; + return size; +} + +static void +convert_and_rescale_to_8bit (UfoWriterImage *image) +{ + gfloat *src; + guint8 *dst; + gfloat max, min, scale; + gsize size; + + size = get_number_of_pixels (image); src = (gfloat *) image->data; dst = (guint8 *) src; get_min_max (image, src, size, &min, &max); @@ -122,18 +131,31 @@ convert_to_8bit (UfoWriterImage *image) } static void -convert_to_16bit (UfoWriterImage *image) +convert_to_8bit (UfoWriterImage *image) { gfloat *src; - guint16 *dst; - gfloat max, min, scale; + guint8 *dst; gsize size; - size = image->requisition->dims[0] * image->requisition->dims[1]; + size = get_number_of_pixels (image); + src = (gfloat *) image->data; + dst = (guint8 *) src; - if (image->requisition->n_dims == 3 && image->requisition->dims[2] == 3) - size *= image->requisition->dims[2]; + for (gsize i = 0; i < size; i++) + dst[i] = (guint8) src[i]; + image->depth = UFO_BUFFER_DEPTH_8U; +} + +static void +convert_and_rescale_to_16bit (UfoWriterImage *image) +{ + gfloat *src; + guint16 *dst; + gfloat max, min, scale; + gsize size; + + size = get_number_of_pixels (image); src = (gfloat *) image->data; dst = (guint16 *) src; get_min_max (image, src, size, &min, &max); @@ -163,6 +185,23 @@ convert_to_16bit (UfoWriterImage *image) image->depth = UFO_BUFFER_DEPTH_16U; } +static void +convert_to_16bit (UfoWriterImage *image) +{ + gfloat *src; + guint16 *dst; + gsize size; + + size = get_number_of_pixels (image); + src = (gfloat *) image->data; + dst = (guint16 *) src; + + for (gsize i = 0; i < size; i++) + dst[i] = (guint16) src[i]; + + image->depth = UFO_BUFFER_DEPTH_16U; +} + void ufo_writer_convert_inplace (UfoWriterImage *image) { @@ -172,11 +211,17 @@ ufo_writer_convert_inplace (UfoWriterImage *image) */ switch (image->depth) { case UFO_BUFFER_DEPTH_8U: - convert_to_8bit (image); + if (image->rescale) + convert_and_rescale_to_8bit (image); + else + convert_to_8bit (image); break; case UFO_BUFFER_DEPTH_16U: case UFO_BUFFER_DEPTH_16S: - convert_to_16bit (image); + if (image->rescale) + convert_and_rescale_to_16bit (image); + else + convert_to_16bit (image); break; default: break; diff --git a/src/writers/ufo-writer.h b/src/writers/ufo-writer.h index 2a6d0fb..b0c0ff6 100644 --- a/src/writers/ufo-writer.h +++ b/src/writers/ufo-writer.h @@ -39,6 +39,7 @@ typedef struct { UfoBufferDepth depth; gfloat min; gfloat max; + gboolean rescale; } UfoWriterImage; struct _UfoWriterIface { |