/psd

PSD/PSB(Photoshop) file reader for Go programming language

Primary LanguageGoMIT LicenseMIT

PSD/PSB(Photoshop) file reader for Go programming language

It works almost well but it is still in development.

How to use

Example1

Simple psd -> png conversion.

package main

import (
	"image"
	"image/png"
	"os"

	_ "github.com/oov/psd"
)

func main() {
	file, err := os.Open("image.psd")
	if err != nil {
		panic(err)
	}
	defer file.Close()

	img, _, err := image.Decode(file)
	if err != nil {
		panic(err)
	}

	out, err := os.Create("image.png")
	if err != nil {
		panic(err)
	}
	err = png.Encode(out, img)
	if err != nil {
		panic(err)
	}
}

Example2

Extract all layer images.

package main

import (
	"fmt"
	"image/png"
	"os"

	"github.com/oov/psd"
)

func processLayer(filename string, layerName string, l *psd.Layer) error {
	if len(l.Layer) > 0 {
		for i, ll := range l.Layer {
			if err := processLayer(
				fmt.Sprintf("%s_%03d", filename, i),
				layerName+"/"+ll.Name, &ll); err != nil {
				return err
			}
		}
	}
	if !l.HasImage() {
		return nil
	}
	fmt.Printf("%s -> %s.png\n", layerName, filename)
	out, err := os.Create(fmt.Sprintf("%s.png", filename))
	if err != nil {
		return err
	}
	defer out.Close()
	return png.Encode(out, l.Picker)
}

func main() {
	file, err := os.Open("image.psd")
	if err != nil {
		panic(err)
	}
	defer file.Close()

	img, _, err := psd.Decode(file, &psd.DecodeOptions{SkipMergedImage: true})
	if err != nil {
		panic(err)
	}
	for i, layer := range img.Layer {
		if err = processLayer(fmt.Sprintf("%03d", i), layer.Name, &layer); err != nil {
			panic(err)
		}
	}
}

Current status

It is not implemented any blending functions because layer composition isn't covered by this package at present.

Color Modes

Implemented

  • Bitmap 1bit
  • Grayscale 8bit
  • Grayscale 16bit
  • Grayscale 32bit
  • Indexed
  • RGB 8bit
  • RGB 16bit
  • RGB 32bit
  • CMYK 8bit
  • CMYK 16bit

Not implemented

  • CMYK 32bit
  • Multichannel
  • Duotone
  • Lab

Supported Compression Methods

  • Raw
  • RLE(PackBits)
  • ZIP without prediction (not tested)
  • ZIP with prediction