Tuesday, May 6, 2008

Converting to 32bpc in Photoshop Without Altering Pixels

Many people have a problem with color management. They think that when they open a JPEG in Photoshop, the pixels in the file should be the pixels that are shown on screen, but this is often not the case! If you have an sRGB image being viewed on your Mac monitor, Photoshop will darken the display pixels to show what the file would look like on a true sRGB monitor. Even if you think there's no ICC profile for the image, Photoshop will use the working space designated in Color Settings (usually sRGB). In general, this is probably what you actually want, but some people find it unsettling.

In another attempt to force users to do the right thing, Photoshop insists that all 32 Bits/Channel (floating point) images use a linear profile. When you convert your 8-bit sRGB image to 32-bit, Photoshop will linearize the pixels while simultaneously assigning a linear profile. The net result is that the image looks the same, even though the pixel values have changed. Again, this is usually what you want.

Except what if you don't want the pixels to to change, other than get converted to a higher bit depth? It is possible to do this, but it involves tricking Photoshop a little. I'll explain below.

To start, we'll take the famous Marcie image. This is a 10-bit Cineon file in Log space. Photoshop will open it as a 16-bit file without a profile (which means it uses your RGB working space). Marcie is a useful example for us because many film users still paint on Log images.

If you set the Photoshop Info Palette eyedropper to 32-bit mode and sample the grey LAD patch, you'll see values of 0.435 for that area. Now convert this file to 32-bit mode and sample again. Even though the image does not appear to have changed, the LAD patch is now reading 0.159. As mentioned above, the pixels have been darkened while the profile was linearized.

To convert from 16- to 32-bit mode without the change, revert to the original file and follow these steps:

1) Assign a linear profile (Edit > Assign Profile…) that you've previously created. When you do this, the image will appear much brighter, but using the info palette you can verify that the LAD patch is still 0.435. The Assign Profile function doesn't alter pixel values, only how they are displayed.

2) Now convert to 32-bit mode. The image will appear unchanged, which is to say too bright. But when you sample the LAD patch, you'll see that it has retained its value of 0.435. Photoshop usually converts from whatever profile you're using to a linear profile, but because we told it we already had a linear profile, no change takes place.

3) Your pixels are now in floating point Log space. If you save this image to an OpenEXR file, most file readers will assume linear space and brighten the image as Photoshop is doing. It will be up to you to make sure the Log pixels are treated properly in whatever program you're sending them to.

While Photoshop always defaults to using color management, there is a way to turn it off. By going to View > Proof Setup > Monitor RGB (make sure View > Proof Colors is also on), Photoshop will treat the file like is has the same profile as your monitor, so no transform will take place. In the above example, this would show pixels in Log space. You can also use View > 32-bit Preview Options to view a file with Gain and Gamma in 32-bit mode.

This workflow is currently being used in production by film studios who want to paint in Log, but export an OpenEXR file using ProEXR.
The part of the equation that is really missing is a way to convert from Log to floating point linear in Photoshop so that the EXR can have its proper linear values. Hopefully one day there will be a way to do this.

Update: Now there's a way!

No comments: