hdr
                                
                                
                                
                                    hdr copied to clipboard
                            
                            
                            
                        HDR is a library that handles RAW image format written with Golang
HDR - High Dynamic Range
HDR is a library that handles RAW image format written with Golang. Here some rendering examples.
It aims to provide tools to read HDR files and convert it to a LDR (Low Dynamic Range, aka PNG/JPEG/etc.) in an image.Image object.
Documentations:
- http://www.anyhere.com/gward/hdrenc/hdr_encodings.html
 
Supported codecs (file formats)
- Radiance RGBE/XYZE
 - PFM, Portable FloatMap file format
 - TIFF using mdouchement/tiff
 - CRAD, homemade HDR file format
 
Supported tone mapping operators
Read this documentation to find what TMO use.
Read this documentation to understand what is a TMO.
- Linear
 - Logarithmic
 - Drago '03 - Adaptive logarithmic mapping for displaying high contrast scenes
 - Durand - Fast bilateral filtering for the display of high-dynamic-range images
 - Reinhard '05 - Photographic tone reproduction for digital images
- Playing with parameters could provide better rendering
 
 - Custom Reinhard '05
- Rendering looks like a JPEG photo taken with a smartphone
 
 - iCAM06 - A refined image appearance model for HDR image rendering
 
Usage
go get github.com/mdouchement/hdr
package main
import (
	"fmt"
	"image"
	"image/png"
	"os"
	"runtime"
	"time"
	"github.com/mdouchement/hdr"
	_ "github.com/mdouchement/hdr/codec/rgbe"
	"github.com/mdouchement/hdr/tmo"
)
// Samples:
//
// http://www.anyhere.com/gward/hdrenc/pages/originals.html
// http://resources.mpi-inf.mpg.de/tmo/logmap/ (High Contrast Scenes)
var (
	// input = "/Users/mdouchement/tmp/hdr/memorial_o876.hdr"
	// input = "/Users/mdouchement/tmp/hdr/MtTamWest_o281.hdr"
	// input = "/Users/mdouchement/tmp/hdr/rend02_oC95.hdr"
	// input = "/Users/mdouchement/tmp/hdr/Tree_oAC1.hdr"
	input  = "/Users/mdouchement/tmp/hdr/Apartment_float_o15C.hdr"
	output = "/Users/mdouchement/tmp/hdr/output.png"
)
func main() {
	fmt.Printf("Using %d CPUs\n", runtime.NumCPU())
	fi, err := os.Open(input)
	check(err)
	defer fi.Close()
	start := time.Now()
	m, fname, err := image.Decode(fi)
	check(err)
	fmt.Printf("Read image (%s) took %v\n", fname, time.Since(start))
	if hdrm, ok := m.(hdr.Image); ok {
		startTMO := time.Now()
		// t := tmo.NewLinear(hdrm)
		// t := tmo.NewLogarithmic(hdrm)
		// t := tmo.NewDefaultDrago03(hdrm)
		// t := tmo.NewDefaultDurand(hdrm)
		// t := tmo.NewDefaultCustomReinhard05(hdrm)
		t := tmo.NewDefaultReinhard05(hdrm)
		// t := tmo.NewDefaultICam06(hdrm)
		m = t.Perform()
		fmt.Println("Apply TMO took", time.Since(startTMO))
	}
	fo, err := os.Create(output)
	check(err)
	png.Encode(fo, m)
	fmt.Println("Total", time.Since(start))
}
func check(err error) {
	if err != nil {
		panic(err)
	}
}
HDR Tools
https://github.com/mdouchement/hdrtool
License
MIT
Implementing a TMO
A TMO must implement tmo.ToneMappingOperator:
type ToneMappingOperator interface {
	// Perform runs the TMO mapping.
	Perform() image.Image
}
Implementing an image codec
- Reader
 
// DecodeConfig returns the color model and dimensions of a PFM image without
// decoding the entire image.
func DecodeConfig(r io.Reader) (image.Config, error) {
  // ...
  return m, err
}
// Decode reads a HDR image from r and returns an image.Image.
func Decode(r io.Reader) (img image.Image, err error) {
  // ...
  return
}
func init() {
  // Register the format in the official lib.
  // https://golang.org/pkg/image/#RegisterFormat
  image.RegisterFormat("format-name", "magic-code", Decode, DecodeConfig)
}
- Writer
 
// Encode writes the Image m to w in PFM format.
func Encode(w io.Writer, m hdr.Image) error {
  return nil
}
Contributing
All PRs are welcome. If you implement a TMO or an image codec in a dedicated repository, please tell me in order to link it in this readme.
- Fork it
 - Create your feature branch (git checkout -b my-new-feature)
 - Commit your changes (git commit -am 'Add some feature')
 - Push to the branch (git push origin my-new-feature)
 - Create new Pull Request
 
As possible, run the following commands to format and lint the code:
# Format
find . -name '*.go' -not -path './vendor*' -exec gofmt -s -w {} \;
# Lint
golangci-lint run -c .golangci.yml