RAW config is stored in config json

This commit is contained in:
2025-08-03 17:47:27 +02:00
parent a0ba27b35c
commit bbedfe6d35
3 changed files with 189 additions and 47 deletions

View File

@ -1,6 +1,7 @@
import dearpygui.dearpygui as dpg
import rawpy
import numpy as np
import ast
from PIL import Image
from .pipeline_stage_widget import PipelineStageWidget
@ -42,6 +43,20 @@ class OpenRawWidget(PipelineStageWidget):
"four_color_rgb": False,
}
self.demosaic_combo_tag = dpg.generate_uuid()
self.color_space_combo_tag = dpg.generate_uuid()
self.output_bps_combo_tag = dpg.generate_uuid()
self.use_cam_wb_tag = dpg.generate_uuid()
self.auto_wb_tag = dpg.generate_uuid()
self.wb_r_slider_tag = dpg.generate_uuid()
self.wb_g_slider_tag = dpg.generate_uuid()
self.wb_b_slider_tag = dpg.generate_uuid()
self.bright_slider_tag = dpg.generate_uuid()
self.no_auto_bright_tag = dpg.generate_uuid()
self.gamma_slider_tag = dpg.generate_uuid()
self.half_size_tag = dpg.generate_uuid()
self.four_color_tag = dpg.generate_uuid()
self.manager.bus.subscribe(
"process_full_res", self._on_process_full_res, True)
@ -60,90 +75,125 @@ class OpenRawWidget(PipelineStageWidget):
dpg.add_file_extension(".*")
with dpg.group(tag=self.config_group):
# -- Open / Reprocess buttons --
with dpg.group(horizontal=True):
dpg.add_button(label="Open File...",
callback=self._on_open_file)
dpg.add_button(label="Reprocess",
callback=self._process_and_publish)
dpg.add_button(label="Open File...", callback=self._on_open_file)
dpg.add_button(label="Reprocess", callback=self._process_and_publish)
# -- Demosaic combo --
dpg.add_combo(
label="Demosaic",
items=[alg.name for alg in rawpy.DemosaicAlgorithm],
default_value=rawpy.DemosaicAlgorithm.AHD.name,
callback=lambda s, a, u: self.rawconfig.__setitem__(
"demosaic_algorithm", rawpy.DemosaicAlgorithm[a])
default_value=self.rawconfig["demosaic_algorithm"].name,
callback=lambda s,a,u: self.rawconfig.__setitem__(
"demosaic_algorithm", rawpy.DemosaicAlgorithm[a]
),
tag=self.demosaic_combo_tag
)
# -- Color space combo --
dpg.add_combo(
label="Color Space",
items=[cs.name for cs in rawpy.ColorSpace],
default_value=rawpy.ColorSpace.sRGB.name,
callback=lambda s, a, u: self.rawconfig.__setitem__(
"output_color", rawpy.ColorSpace[a])
default_value=self.rawconfig["output_color"].name,
callback=lambda s,a,u: self.rawconfig.__setitem__(
"output_color", rawpy.ColorSpace[a]
),
tag=self.color_space_combo_tag
)
# -- Bits per sample --
dpg.add_combo(
label="Output Bits",
items=["8", "16"],
default_value="16",
callback=lambda s, a, u: self.rawconfig.__setitem__(
"output_bps", int(a))
items=["8","16"],
default_value=str(self.rawconfig["output_bps"]),
callback=lambda s,a,u: self.rawconfig.__setitem__(
"output_bps", int(a)
),
tag=self.output_bps_combo_tag
)
# -- Checkboxes & sliders --
dpg.add_checkbox(
label="Use Camera WB",
default_value=True,
callback=lambda s, a, u: self.rawconfig.__setitem__(
"use_camera_wb", a)
default_value=self.rawconfig["use_camera_wb"],
callback=lambda s,a,u: self.rawconfig.__setitem__("use_camera_wb", a),
tag=self.use_cam_wb_tag
)
dpg.add_checkbox(
label="Auto WB",
default_value=False,
callback=lambda s, a, u: self.rawconfig.__setitem__(
"use_auto_wb", a)
default_value=self.rawconfig["use_auto_wb"],
callback=lambda s,a,u: self.rawconfig.__setitem__("use_auto_wb", a),
tag=self.auto_wb_tag
)
dpg.add_slider_float(
label="Manual WB R Gain",
default_value=1.0, min_value=0.1, max_value=4.0,
callback=lambda s, a, u: self.config.__setitem__(
"user_wb", (a, self.rawconfig["user_wb"][1], self.rawconfig["user_wb"][2], self.rawconfig["user_wb"][3]))
default_value=self.rawconfig["user_wb"][0],
min_value=0.1, max_value=4.0,
callback=lambda s,a,u: self.rawconfig.__setitem__(
"user_wb", (a, self.rawconfig["user_wb"][1],
self.rawconfig["user_wb"][2], self.rawconfig["user_wb"][3])
),
tag=self.wb_r_slider_tag
)
dpg.add_slider_float(
label="Manual WB G Gain",
default_value=1.0, min_value=0.1, max_value=4.0,
callback=lambda s, a, u: self.config.__setitem__(
"user_wb", (self.rawconfig["user_wb"][0], a, a, self.rawconfig["user_wb"][3]))
default_value=self.rawconfig["user_wb"][1],
min_value=0.1, max_value=4.0,
callback=lambda s,a,u: self.rawconfig.__setitem__(
"user_wb", (self.rawconfig["user_wb"][0], a,
self.rawconfig["user_wb"][2], self.rawconfig["user_wb"][3])
),
tag=self.wb_g_slider_tag
)
dpg.add_slider_float(
label="Manual WB B Gain",
default_value=1.0, min_value=0.1, max_value=4.0,
callback=lambda s, a, u: self.config.__setitem__(
"user_wb", (self.rawconfig["user_wb"][0], self.rawconfig["user_wb"][1], self.rawconfig["user_wb"][2], a))
default_value=self.rawconfig["user_wb"][2],
min_value=0.1, max_value=4.0,
callback=lambda s,a,u: self.rawconfig.__setitem__(
"user_wb", (self.rawconfig["user_wb"][0],
self.rawconfig["user_wb"][1], a,
self.rawconfig["user_wb"][3])
),
tag=self.wb_b_slider_tag
)
dpg.add_slider_float(
label="Bright",
default_value=1.0, min_value=0.1, max_value=4.0,
callback=lambda s, a, u: self.rawconfig.__setitem__("bright", a)
default_value=self.rawconfig["bright"],
min_value=0.1, max_value=4.0,
callback=lambda s,a,u: self.rawconfig.__setitem__("bright", a),
tag=self.bright_slider_tag
)
dpg.add_checkbox(
label="No Auto Bright",
default_value=False,
callback=lambda s, a, u: self.rawconfig.__setitem__(
"no_auto_bright", a)
default_value=self.rawconfig["no_auto_bright"],
callback=lambda s,a,u: self.rawconfig.__setitem__(
"no_auto_bright", a
),
tag=self.no_auto_bright_tag
)
dpg.add_slider_float(
label="Gamma",
default_value=1.0, min_value=0.1, max_value=3.0,
callback=lambda s, a, u: self.rawconfig.__setitem__("gamma", a)
default_value=self.rawconfig["gamma"],
min_value=0.1, max_value=3.0,
callback=lambda s,a,u: self.rawconfig.__setitem__("gamma", a),
tag=self.gamma_slider_tag
)
dpg.add_checkbox(
label="Half-size",
default_value=False,
callback=lambda s, a, u: self.rawconfig.__setitem__(
"half_size", a)
default_value=self.rawconfig["half_size"],
callback=lambda s,a,u: self.rawconfig.__setitem__(
"half_size", a
),
tag=self.half_size_tag
)
dpg.add_checkbox(
label="4-color RGB",
default_value=False,
callback=lambda s, a, u: self.rawconfig.__setitem__(
"four_color_rgb", a)
default_value=self.rawconfig["four_color_rgb"],
callback=lambda s,a,u: self.rawconfig.__setitem__(
"four_color_rgb", a
),
tag=self.four_color_tag
)
with dpg.group(tag=self.busy_group, show=False):
@ -229,3 +279,53 @@ class OpenRawWidget(PipelineStageWidget):
return
self.manager.pipeline.publish(
self.pipeline_stage_out_id, self.img_full, True)
def get_config(self):
config = super().get_config()
config["raw_config"] = { k:str(v) for k, v in self.rawconfig.items() }
return config
def set_config(self, config):
super().set_config(config)
raw_cfg = config.get("raw_config", {})
if raw_cfg:
# parse each back into Python types
for k, v in raw_cfg.items():
if k == "demosaic_algorithm":
# "DemosaicAlgorithm.AHD" → "AHD"
name = v.split(".", 1)[1]
self.rawconfig[k] = rawpy.DemosaicAlgorithm[name]
elif k == "output_color":
name = v.split(".", 1)[1]
self.rawconfig[k] = rawpy.ColorSpace[name]
elif k == "output_bps":
self.rawconfig[k] = int(v)
elif k in ("use_camera_wb","use_auto_wb",
"no_auto_bright","half_size","four_color_rgb"):
self.rawconfig[k] = (v == "True")
elif k in ("bright","gamma"):
self.rawconfig[k] = float(v)
elif k == "user_wb":
self.rawconfig[k] = tuple(ast.literal_eval(v))
# now that rawconfig is back to real types, update the UI
self._update_raw_ui()
def _update_raw_ui(self):
"""Push current self.rawconfig values back into all controls."""
# combos want the enum.name or string
dpg.set_value(self.demosaic_combo_tag, self.rawconfig["demosaic_algorithm"].name)
dpg.set_value(self.color_space_combo_tag, self.rawconfig["output_color"].name)
dpg.set_value(self.output_bps_combo_tag, str(self.rawconfig["output_bps"]))
# checkboxes & sliders
dpg.set_value(self.use_cam_wb_tag, self.rawconfig["use_camera_wb"])
dpg.set_value(self.auto_wb_tag, self.rawconfig["use_auto_wb"])
dpg.set_value(self.wb_r_slider_tag, self.rawconfig["user_wb"][0])
dpg.set_value(self.wb_g_slider_tag, self.rawconfig["user_wb"][1])
dpg.set_value(self.wb_b_slider_tag, self.rawconfig["user_wb"][2])
dpg.set_value(self.bright_slider_tag, self.rawconfig["bright"])
dpg.set_value(self.no_auto_bright_tag, self.rawconfig["no_auto_bright"])
dpg.set_value(self.gamma_slider_tag, self.rawconfig["gamma"])
dpg.set_value(self.half_size_tag, self.rawconfig["half_size"])
dpg.set_value(self.four_color_tag, self.rawconfig["four_color_rgb"])