A preset is a list of slider values that only Lightroom understands. A LUT is a colour transform any app can read. To turn one into the other, you let Lightroom apply the preset to an image that contains every colour, then read the result back as a table.
Why can't Lightroom export a LUT directly?
Because a preset is not a transform. It stores settings such as Exposure +0.3 or Clarity +20, and Lightroom recalculates the picture from them every time. Some of those settings depend on the photo itself, so the same preset does slightly different things to different images. A LUT can only describe the part of a preset that maps one colour to another colour, the same way on every pixel.
That part is usually most of a look: tone curve, white balance shift, HSL, colour grading wheels, calibration and the base profile's colour. How to create a LUT covers the general idea, and its short Lightroom section mentions an approximate route through Photoshop. The HALD method below is more exact.
What is a HALD image?
A test image that contains a grid of every colour a LUT needs to sample, arranged in a fixed order. Run it through any colour change and the output image is, pixel for pixel, a lookup table for that change. A level 8 HALD is 512 by 512 pixels and becomes a 64-point LUT, which is more than precise enough. What a LUT is explains what the points in a LUT are.
What do you need before you start?
- Lightroom Classic and the preset.
- ffmpeg, to generate the HALD image and read it back. On a Mac,
brew install ffmpeginstalls it. Applying a LUT with ffmpeg has more on what it does. - Python 3, for a ten-line conversion script. It runs in Terminal with no extra packages.
How do you convert a Lightroom preset to a LUT?
1. Generate the identity image
In Terminal, in an empty folder:
ffmpeg -f lavfi -i "haldclutsrc=level=8,format=rgb48" -frames:v 1 hald-identity.tifThat writes a 16-bit TIFF that changes nothing yet. Keep a copy, since you can reuse it for every preset.
2. Apply the preset in Lightroom
Import hald-identity.tif into Lightroom Classic and apply the preset in the Develop module. Then switch off everything that is not a pure colour change:
- Texture, Clarity and Dehaze
- Sharpening and Noise Reduction
- Vignette and Grain
- Lens corrections, crop and transform
- Any masks or local adjustments
- Any Auto setting
These either look at neighbouring pixels or depend on the image content, and on a HALD image they scramble the table. Leave the tone curve, HSL, colour grading, white balance and calibration as the preset set them.
3. Export as a 16-bit TIFF
Export with these settings: format TIFF, compression None, colour space sRGB, bit depth 16 bits/component, resizing off, output sharpening off, no watermark. Name it hald-graded.tif. The file must still be exactly 512 by 512 pixels.
4. Turn the image into a .cube
Save this as hald_to_cube.py in the same folder:
import struct, sys
src, dst = sys.argv[1], sys.argv[2]
data = open(src, "rb").read()
pixels = len(data) // 6
size = round(pixels ** (1 / 3))
if size ** 3 != pixels:
sys.exit("Not a HALD image: the pixel count is not a cube.")
with open(dst, "w") as out:
out.write(f"LUT_3D_SIZE {size}\n")
for i in range(pixels):
r, g, b = struct.unpack_from("<3H", data, i * 6)
out.write(f"{r / 65535:.6f} {g / 65535:.6f} {b / 65535:.6f}\n")Then run:
ffmpeg -i hald-graded.tif -f rawvideo -pix_fmt rgb48le hald.rgb
python3 hald_to_cube.py hald.rgb my-preset.cubeThe first line unpacks the image into raw 16-bit pixels. The script writes them out in the order a .cube expects, which is the same order the HALD image stores them in.
5. Test it
Apply the new LUT to an ordinary photo and compare it with the same photo and the preset in Lightroom:
ffmpeg -i test.jpg -vf "lut3d=file=my-preset.cube" -q:v 2 test-lut.jpgColour and tone should match closely. Texture and grain will not, because they were switched off on purpose.
What carries over, and what doesn't?
| Preset setting | In the LUT | Why |
|---|---|---|
| Tone curve, contrast, highlights and shadows sliders | Mostly | Global tone; the sliders adapt slightly to each photo |
| White balance shift | Yes | A global colour change |
| HSL and colour grading | Yes | Global colour changes |
| Calibration and profile colour | Yes, as rendered on the TIFF | Part of the colour pipeline |
| Clarity, Texture, Dehaze | No | They depend on neighbouring pixels |
| Sharpening, noise reduction, grain, vignette | No | Spatial effects, not colour |
| Masks and local adjustments | No | A LUT has no idea where a pixel is |
What goes wrong most often?
- The LUT looks different from the preset on raw files. Lightroom renders a TIFF differently from a raw file, and a preset that sets a raw profile changes nothing on a TIFF. Apply the preset to a JPEG and compare against that, not against a raw.
- The look is far too strong on video. The LUT expects footage in normal contrast. Convert log footage to Rec.709 first; log footage explained covers why.
- The script says it is not a HALD image. The export was resized or cropped. Export again with resizing off.
- Odd colour blotches in the LUT. Clarity, Dehaze or an Auto setting stayed on. Switch them off and export again.
What can you do with the LUT?
Use the same look on video, in any editor that reads a .cube: Resolve, Premiere, Final Cut, CapCut and the rest. How to install LUTs covers each one. You can also bring it back into Lightroom as a profile with its own Amount slider, which using LUTs in Lightroom walks through, or hand it to a client who does not use Lightroom at all. If your presets came from a free pack, free Lightroom presets covers which ones are worth keeping.
Or apply it to a whole shoot. BatchTone reads the .cube as it is and applies it to a folder of photos and video clips together, with a strength slider on every file for the frames the look does not suit. A frame from each file is previewed before export, EXIF from JPEG originals is kept, the audio on clips is copied untouched, and the originals are never touched. It does not develop raw files, so export JPEGs from Lightroom first. It runs on macOS 12 or later on Apple Silicon. Batch applying a LUT to photos shows what it reads and writes, and the seven-day trial has everything unlocked.
Common questions
Is there a Lightroom plugin or app that does this?
Third-party converters exist, and most use the same HALD method underneath. The manual route above takes a few minutes, costs nothing and shows you exactly which settings went into the LUT.
What LUT size does this produce?
A level 8 HALD gives a 64-point LUT, larger than the common 33-point size. If an app refuses it, generate the HALD at a lower level or resample the LUT, though most modern apps read 64-point files.
Can I convert a Lightroom mobile preset the same way?
Only on a computer. The HALD image has to be graded and exported as an uncompressed 16-bit TIFF at its exact size, so get the preset into Lightroom Classic first and do the conversion there.
Will the LUT match the preset exactly?
Close, not exact. Settings that adapt to each photo, such as Highlights and Shadows, are captured as they behaved on the HALD image. On most photos the difference is small; on extreme exposures it shows more.