Added SDR + auto gainmap generation encoding variant.

This commit is contained in:
Krzysztof Kotowicz
2024-09-19 17:54:15 +02:00
parent 496f8e704d
commit 1a3a7f17ff

View File

@@ -92,6 +92,7 @@ script_data.metadata = {
local PS = dt.configuration.running_os == "windows" and "\\" or "/"
local ENCODING_VARIANT_SDR_AND_GAINMAP = 1
local ENCODING_VARIANT_SDR_AND_HDR = 2
local ENCODING_VARIANT_SDR_AUTO_GAINMAP = 3
local function save_preferences()
dt.preferences.write(namespace, "encoding_variant", "integer", GUI.optionwidgets.encoding_variant_combo.selected)
@@ -128,7 +129,7 @@ local function assert_settings_correct(encoding_variant)
output = GUI.optionwidgets.output_directory_widget.value,
use_original_dir = GUI.optionwidgets.use_original_directory.value,
import_to_darktable = GUI.optionwidgets.import_to_darktable.value,
copy_exif = GUI.optionwidgets.copy_exif.value,
copy_exif = GUI.optionwidgets.copy_exif.value,
metadata = GUI.optionwidgets.metadata_path_widget.value,
tmpdir = dt.configuration.tmp_dir
}
@@ -164,6 +165,8 @@ local function get_stacks(images, encoding_variant)
elseif encoding_variant == ENCODING_VARIANT_SDR_AND_HDR then
extra_image_extension = "jxl"
extra_image_content_type = "hdr"
elseif encoding_variant == ENCODING_VARIANT_SDR_AUTO_GAINMAP then
extra_image_content_type = nil
end
local tags = nil
@@ -173,7 +176,7 @@ local function get_stacks(images, encoding_variant)
local is_extra = false
tags = dt.tags.get_tags(v)
for ignore, tag in pairs(tags) do
if tag.name == extra_image_content_type then
if extra_image_content_type and tag.name == extra_image_content_type then
is_extra = true
end
end
@@ -185,23 +188,27 @@ local function get_stacks(images, encoding_variant)
if stacks[key] == nil then
stacks[key] = {}
end
if stacks[key]["sdr"] or is_extra then
if extra_image_content_type and (stacks[key]["sdr"] or is_extra) then
stacks[key][extra_image_content_type] = v
else
elseif not is_extra then
stacks[key]["sdr"] = v
end
end
-- remove invalid stacks
local count = 0
for k, v in pairs(stacks) do
if not v["sdr"] or not v[extra_image_content_type] then
stacks[k] = nil
elseif (v["sdr"].final_width ~= v[extra_image_content_type].final_width) or
(v["sdr"].final_height ~= v[extra_image_content_type].final_height) then
stacks[k] = nil
elseif extra_image_extension and df.get_filetype(v[extra_image_content_type].filename) ~= extra_image_extension then
stacks[k] = nil
else
if extra_image_content_type then
if not v["sdr"] or not v[extra_image_content_type] then
stacks[k] = nil
elseif (v["sdr"].final_width ~= v[extra_image_content_type].final_width) or
(v["sdr"].final_height ~= v[extra_image_content_type].final_height) then
stacks[k] = nil
elseif extra_image_extension and df.get_filetype(v[extra_image_content_type].filename) ~=
extra_image_extension then
stacks[k] = nil
end
end
if stacks[k] then
count = count + 1
end
end
@@ -231,7 +238,7 @@ local function generate_ultrahdr(encoding_variant, images, settings, step, total
job.percent = (total_substeps * step + substep) / (total_steps * total_substeps)
end
if encoding_variant == ENCODING_VARIANT_SDR_AND_GAINMAP then
if encoding_variant == ENCODING_VARIANT_SDR_AND_GAINMAP or encoding_variant == ENCODING_VARIANT_SDR_AUTO_GAINMAP then
total_substeps = 6
-- Export both SDR and gainmap to JPEGs
local exporter = dt.new_format("jpeg")
@@ -239,20 +246,27 @@ local function generate_ultrahdr(encoding_variant, images, settings, step, total
local sdr = df.create_unique_filename(settings.tmpdir .. PS .. df.chop_filetype(images["sdr"].filename) ..
".jpg")
exporter:write_image(images["sdr"], sdr)
local gainmap = df.create_unique_filename(settings.tmpdir .. PS .. images["gainmap"].filename .. "_gainmap.jpg")
exporter:write_image(images["gainmap"], gainmap)
local gainmap
if encoding_variant == ENCODING_VARIANT_SDR_AUTO_GAINMAP then -- SDR is also a gainmap
gainmap = sdr
else
gainmap = df.create_unique_filename(settings.tmpdir .. PS .. images["gainmap"].filename .. "_gainmap.jpg")
exporter:write_image(images["gainmap"], gainmap)
end
dd.dprint(images["gainmap"])
log.msg(log.debug, string.format(_("Exported files: %s, %s"), sdr, gainmap))
update_job_progress()
-- Strip EXIFs
execute_cmd(settings.bin.exiftool .. " -all= " .. df.sanitize_filename(sdr) .. " -o " ..
df.sanitize_filename(sdr .. ".noexif"))
execute_cmd(settings.bin.exiftool .. " -all= " .. df.sanitize_filename(gainmap) .. " -overwrite_original")
if sdr ~= gainmap then
execute_cmd(settings.bin.exiftool .. " -all= " .. df.sanitize_filename(gainmap) .. " -overwrite_original")
end
update_job_progress()
-- Merge files
uhdr = df.chop_filetype(sdr) .. "_ultrahdr.jpg"
execute_cmd(settings.bin.ultrahdr_app .. " -m 0 -M 0 -i " .. df.sanitize_filename(sdr .. ".noexif") .. " -g " ..
execute_cmd(settings.bin.ultrahdr_app .. " -m 0 -i " .. df.sanitize_filename(sdr .. ".noexif") .. " -g " ..
df.sanitize_filename(gainmap) .. " -f " .. df.sanitize_filename(settings.metadata) .. " -z " ..
df.sanitize_filename(uhdr))
update_job_progress()
@@ -265,7 +279,9 @@ local function generate_ultrahdr(encoding_variant, images, settings, step, total
-- Cleanup
os.remove(sdr)
os.remove(sdr .. ".noexif")
os.remove(gainmap)
if sdr ~= gainmap then
os.remove(gainmap)
end
update_job_progress()
elseif encoding_variant == ENCODING_VARIANT_SDR_AND_HDR then
total_substeps = 5
@@ -289,9 +305,9 @@ local function generate_ultrahdr(encoding_variant, images, settings, step, total
" -pix_fmt p010le -f rawvideo " .. df.sanitize_filename(extra))
update_job_progress()
execute_cmd(settings.bin.ultrahdr_app .. " -m 0 -y " .. df.sanitize_filename(sdr .. ".raw") .. " -p " ..
df.sanitize_filename(extra) .. " -a 0 -b 3 -c 1 -C 1 -t 2 -M 1 -s 1 -q 95 -Q 95 -D 1 " ..
" -w " .. tostring(images["sdr"].final_width) .. " -h " .. tostring(images["sdr"].final_height) ..
" -z " .. df.sanitize_filename(uhdr))
df.sanitize_filename(extra) .. " -a 0 -b 3 -c 1 -C 1 -t 2 -M 1 -s 1 -q 95 -Q 95 -D 1 " .. " -w " ..
tostring(images["sdr"].final_width) .. " -h " .. tostring(images["sdr"].final_height) .. " -z " ..
df.sanitize_filename(uhdr))
update_job_progress()
if settings.copy_exif then
execute_cmd(settings.bin.exiftool .. " -tagsfromfile " .. df.sanitize_filename(sdr) .. " -all>all " ..
@@ -320,7 +336,7 @@ local function generate_ultrahdr(encoding_variant, images, settings, step, total
local msg = string.format(_("Generated %s."), df.get_filename(output_file))
log.msg(log.info, msg)
dt.print(msg)
dt.print(msg)
update_job_progress()
end
@@ -340,14 +356,7 @@ local function main()
return
end
local images = dt.gui.selection() -- get selected images
if #images < 2 then
dt.print(_("Select at least 2 images to generate UltraHDR image"))
log.log_level(saved_log_level)
return
end
local stacks, stack_count = get_stacks(images, encoding_variant)
local stacks, stack_count = get_stacks(dt.gui.selection(), encoding_variant)
dt.print(string.format(_("Detected %d image stack(s)"), stack_count))
if stack_count == 0 then
log.log_level(saved_log_level)
@@ -433,13 +442,15 @@ GUI.optionwidgets.encoding_variant_combo = dt.new_widget("combobox") {
%s: SDR image paired with a monochromatic gain map image
%s: SDR image paired with a JPEG-XL HDR image (10-bit, 'PQ P3 RGB' profile recommended)
%s: SDR image only. Gainmaps will be just copies of SDR images.
UltraHDR image will be created for each pair of images that:
- have the same underlying image path + filename (ignoring file extension)
- have the same dimensions
It is assumed that the first image in a pair is the SDR , unless it has a "hdr" / "gainmap" tag.
]]), _("SDR + monochrome gainmap"), _("SDR + JPEG-XL HDR")),
By default, the first image in a pair is treated as SDR, and the next one store extra gainmap/HDR data.
You can force the image into a specific slot by attaching "hdr" / "gainmap" tags.
]]), _("SDR + monochrome gainmap"), _("SDR + JPEG-XL HDR"), _("SDR (auto gainmap)")),
selected = 0,
changed_callback = function(self)
if self.selected == ENCODING_VARIANT_SDR_AND_GAINMAP then
@@ -448,8 +459,9 @@ UltraHDR image will be created for each pair of images that:
GUI.optionwidgets.metadata_path_box.visible = false
end
end,
_("SDR + monochrome gainmap"), -- ENCODING_VARIANT_SDR_AND_GAINMAP,
_("SDR + JPEG-XL HDR") -- ENCODING_VARIANT_SDR_AND_HDR,
_("SDR + monochrome gainmap"), -- ENCODING_VARIANT_SDR_AND_GAINMAP
_("SDR + JPEG-XL HDR"), -- ENCODING_VARIANT_SDR_AND_HDR
_("SDR (auto gainmap)") -- ENCODING_VARIANT_SDR_AUTO_GAINMAP
}
GUI.optionwidgets.encoding_settings_box = dt.new_widget("box") {