Projects / Creative Tools

pixcam

Why do my phone photos look fake?

A native Android camera app that gets as close to the sensor as the platform allows and does its own processing from there. It captures RAW DNGs, switches off the built-in image processing where it can, and develops photos with its own GPU pipeline.

ForPeople who want honest photos from an Android phone and are willing to handle RAW files to get them.
SolvesStock camera apps bake in multi-frame processing, heavy noise reduction, halo sharpening and aggressive tone curves, and there is no way to turn it off.

What it does

pixcam uses the Camera2 API and prefers a back camera with the RAW capability. Wherever the hardware layer allows, it disables noise reduction, edge enhancement and hot pixel correction. On devices with a manual sensor it exposes ISO, shutter and manual focus; on more limited hardware it falls back to EV compensation and AE lock. RAW stills are written as DNG files, with a JPEG fallback on devices that cannot shoot RAW.

The interface is built in Compose: a letterboxed preview, a round shutter, a PRO panel for manual controls, a hardware info dialog, and a small in-app gallery that can read DNGs.

Its own develop pipeline

Every RAW capture saves the DNG plus a JPEG developed by the app’s own single-pass GPU pipeline: black level, lens shading, white balance, Malvar-He-Cutler demosaic, a per-shot colour matrix, a Hable filmic curve and conversion to sRGB. It handles all four Bayer orders and is checked against a CPU reference by instrumented tests. The colour science follows the DNG 1.4 forward-matrix path, so the camera HAL’s own colour correction is now only a fallback.

Seeing what you get

Tone curves (device, linear, sRGB, filmic) can be pushed to the preview and stills where the hardware supports it. Independently of that, the viewfinder renders through a GLES3 shader with a 3D LUT, with .cube import and three built-in looks. A WYSIWYG toggle applies the develop pipeline’s exact grade in the shader so the preview matches the output. DNGs stay untouched by design.

Status

Stage 0 is done, with stages 1 and 2 in progress. Stage 3, burst merging and Bayer-domain denoising for low light, is planned. The emulator lacks manual controls, so real testing needs a device, ideally a Pixel.