Examples
See GitHub repository for complete example code: hdr-conversion/examples
ISO 21496-1 Gainmap → PQ AVIF
Convert ISO 21496-1 Gainmap JPEG to PQ AVIF format:
import hdrconv.io as io
import hdrconv.convert as convert
# Read Gainmap file
gainmap_data = io.read_21496("iso21496.jpg")
# Convert to linear HDR
hdr = convert.gainmap_to_hdr(
gainmap_data,
baseline_color_space="p3",
alt_color_space="bt2020",
target_color_space="bt2020",
)
# Apply PQ transfer function
pq_encoded = convert.apply_pq(hdr["data"])
# Write PQ AVIF
pq_data = {
"data": pq_encoded,
"color_space": "bt2020",
"transfer_function": "pq",
"icc_profile": None,
}
io.write_22028_pq(pq_data, "output.avif")
Apple HEIC → PQ AVIF
Convert Apple HEIC HDR format to standard PQ AVIF:
import hdrconv.io as io
import hdrconv.convert as convert
# Read Apple HEIC
heic_data = io.read_apple_heic("photo.HEIC")
# Convert to linear HDR (Display P3)
hdr = convert.apple_heic_to_hdr(heic_data)
# Convert color space P3 → BT.2020
hdr_bt2020 = convert.convert_color_space(
hdr["data"],
source_space="p3",
target_space="bt2020"
)
# Apply PQ and write
pq_encoded = convert.apply_pq(hdr_bt2020)
pq_data = {
"data": pq_encoded,
"color_space": "bt2020",
"transfer_function": "pq",
"icc_profile": None,
}
io.write_22028_pq(pq_data, "output.avif")
Apple HEIC → Gainmap JPEG (ISO 21496-1 + UltraHDR)
Generate both ISO 21496-1 and UltraHDR JPEGs from Apple HEIC:
import hdrconv.io as io
import hdrconv.convert as convert
# Read Apple HEIC
heic_data = io.read_apple_heic("photo.HEIC")
# Convert to linear HDR (Display P3)
hdr = convert.apple_heic_to_hdr(heic_data)
# Load Display P3 ICC
with open("icc/Display P3.icc", "rb") as f:
p3_icc = f.read()
# Generate Gainmap (baseline in P3)
gainmap_data = convert.hdr_to_gainmap(
hdr,
baseline=None,
color_space="p3",
icc_profile=p3_icc,
gamma=1.0,
)
# Write ISO 21496-1 and UltraHDR
io.write_21496(gainmap_data, "output_iso21496.jpg")
io.write_ultrahdr(gainmap_data, "output_uhdr.jpg")
PQ AVIF → ISO 21496-1 Gainmap
Convert PQ AVIF to ISO 21496-1 Gainmap format:
import hdrconv.io as io
import hdrconv.convert as convert
# Read PQ AVIF
pq_data = io.read_22028_pq("image.avif")
# Convert PQ to linear HDR
linear_hdr = convert.inverse_pq(pq_data["data"])
hdr = {
"data": linear_hdr,
"color_space": "bt2020",
"transfer_function": "linear",
}
# Generate Gainmap (auto-create SDR baseline)
gainmap_data = convert.hdr_to_gainmap(
hdr,
baseline=None, # Auto-generate
color_space="p3",
gamma=1.0,
)
# Write ISO 21496-1
io.write_21496(gainmap_data, "output_gainmap.jpg")
iOS HDR Screenshot → UltraHDR
Convert iOS HDR screenshots (HEIC with tile-based HEVC) to UltraHDR:
External Dependencies
Requires MP4Box (GPAC) and ffmpeg. Install on macOS: brew install gpac ffmpeg
from hdrconv.io import read_ios_hdr_screenshot, write_ultrahdr
# Read iOS HDR screenshot
gainmap_image = read_ios_hdr_screenshot("screenshot.HEIC")
# Load and embed Display P3 ICC profile
with open("icc/Display P3.icc", "rb") as f:
p3_icc = f.read()
gainmap_image["baseline_icc"] = p3_icc
gainmap_image["gainmap_icc"] = p3_icc
# Write directly as UltraHDR (no conversion needed)
write_ultrahdr(gainmap_image, "output_uhdr.jpg")