diff options
author | Tim Kuipers <t.kuipers@ultimaker.com> | 2019-05-20 13:10:18 +0300 |
---|---|---|
committer | Tim Kuipers <t.kuipers@ultimaker.com> | 2019-10-24 18:26:28 +0300 |
commit | 88b424d36aa43d863a3e937187337af378905908 (patch) | |
tree | 70b31a07e02e48f877532aecfbc48eac67eed100 /plugins/ImageReader | |
parent | b3d7887d4d6b60a061a2fb7097a57a0988d15b26 (diff) |
feat: use logarithmic conversion for lithophanes
Diffstat (limited to 'plugins/ImageReader')
-rw-r--r-- | plugins/ImageReader/ConfigUI.qml | 22 | ||||
-rw-r--r-- | plugins/ImageReader/ImageReader.py | 16 | ||||
-rw-r--r-- | plugins/ImageReader/ImageReaderUI.py | 6 |
3 files changed, 40 insertions, 4 deletions
diff --git a/plugins/ImageReader/ConfigUI.qml b/plugins/ImageReader/ConfigUI.qml index 47ba10778c..ef28c174f2 100644 --- a/plugins/ImageReader/ConfigUI.qml +++ b/plugins/ImageReader/ConfigUI.qml @@ -146,6 +146,28 @@ UM.Dialog UM.TooltipArea { Layout.fillWidth:true height: childrenRect.height + text: catalog.i18nc("@info:tooltip","For lithophanes a logarithmic function is more appropriate for most materials. For height maps the pixel values correspond to heights linearly.") + Row { + width: parent.width + + Label { + text: "Conversion" + width: 150 * screenScaleFactor + anchors.verticalCenter: parent.verticalCenter + } + ComboBox { + id: conversion + objectName: "Conversion" + model: [ catalog.i18nc("@item:inlistbox","Logarithmic"), catalog.i18nc("@item:inlistbox","Linear") ] + width: 180 * screenScaleFactor + onCurrentIndexChanged: { manager.onConvertFunctionChanged(currentIndex) } + } + } + } + + UM.TooltipArea { + Layout.fillWidth:true + height: childrenRect.height text: catalog.i18nc("@info:tooltip","The amount of smoothing to apply to the image.") Row { width: parent.width diff --git a/plugins/ImageReader/ImageReader.py b/plugins/ImageReader/ImageReader.py index c59151f1cb..bfaa6eb48c 100644 --- a/plugins/ImageReader/ImageReader.py +++ b/plugins/ImageReader/ImageReader.py @@ -3,6 +3,8 @@ import numpy +import math + from PyQt5.QtGui import QImage, qRed, qGreen, qBlue from PyQt5.QtCore import Qt @@ -46,9 +48,9 @@ class ImageReader(MeshReader): def _read(self, file_name): size = max(self._ui.getWidth(), self._ui.getDepth()) - return self._generateSceneNode(file_name, size, self._ui.peak_height, self._ui.base_height, self._ui.smoothing, 512, self._ui.lighter_is_higher) + return self._generateSceneNode(file_name, size, self._ui.peak_height, self._ui.base_height, self._ui.smoothing, 512, self._ui.lighter_is_higher, self._ui.use_logarithmic_function) - def _generateSceneNode(self, file_name, xz_size, peak_height, base_height, blur_iterations, max_size, lighter_is_higher): + def _generateSceneNode(self, file_name, xz_size, peak_height, base_height, blur_iterations, max_size, lighter_is_higher, use_logarithmic_function): scene_node = SceneNode() mesh = MeshBuilder() @@ -124,8 +126,14 @@ class ImageReader(MeshReader): Job.yieldThread() - height_data *= scale_vector.y - height_data += base_height + if use_logarithmic_function: + min_luminance = 2.0 ** (peak_height - base_height) + for (y, x) in numpy.ndindex(height_data.shape): + mapped_luminance = min_luminance + (1.0 - min_luminance) * height_data[y, x] + height_data[y, x] = peak_height - math.log(mapped_luminance, 2) + else: + height_data *= scale_vector.y + height_data += base_height heightmap_face_count = 2 * height_minus_one * width_minus_one total_face_count = heightmap_face_count + (width_minus_one * 2) * (height_minus_one * 2) + 2 diff --git a/plugins/ImageReader/ImageReaderUI.py b/plugins/ImageReader/ImageReaderUI.py index 213468a2ab..c769a8c264 100644 --- a/plugins/ImageReader/ImageReaderUI.py +++ b/plugins/ImageReader/ImageReaderUI.py @@ -34,6 +34,7 @@ class ImageReaderUI(QObject): self.peak_height = 2.5 self.smoothing = 1 self.lighter_is_higher = False; + self.use_logarithmic_function = False; self._ui_lock = threading.Lock() self._cancelled = False @@ -144,3 +145,8 @@ class ImageReaderUI(QObject): @pyqtSlot(int) def onImageColorInvertChanged(self, value): self.lighter_is_higher = (value == 1) + + @pyqtSlot(int) + def onConvertFunctionChanged(self, value): + self.use_logarithmic_function = (value == 0) + |