Click here to Skip to main content
15,881,882 members
Articles / Programming Languages / C#
Article

Yet Another PSD Parser

Rate me:
Please Sign up or sign in to vote.
4.85/5 (12 votes)
10 Oct 20065 min read 300.3K   8.8K   69   79
Read/write Photoshop PSD files, serialize to XML, extract layer bitmaps, and more.

Main window

A simple host application for testing the API. Main window: Drag'n'drop a PSD file, select which layer to inspect (or Global for the merged image and global data).

Xml window

XML inspector: For viewing all data in the document. Shows info about the selected layer or global info.

Introduction

This is a work in progress that aims to give .NET developers full control over Photoshop PSD files. All features aren't covered by the library, and there are, without doubt, some documents it will choke on, but with good feedback from users, this will hopefully be fixed over time.

The main usage of the API is for reading and writing PSD files from your own applications. It can also be used as a reference for writing parsers for non-.NET languages. Thanks to the XML serializing feature, it can easily be used for investigating unknown tags (or for implementing a zip-style file format; XML settings plus PNG files for channel data).

Examples of PSD sections it can handle:

  • Individual layers, including extracting their bitmaps, transparencies and masks
  • Global channels
  • Slices, Grid/Guides, Thumbnails
  • Vector Paths
  • Layer effects (shadows, glows etc.)
  • Adjustment layers (Brightness/Contrast, Curves, Levels etc.)
  • Text layers (well, not really; there's an ocean of data for a simple text layer, and I don't know what half of it is for, but strictly speaking they're being parsed)

Note that it is not a PSD renderer; this library is for manipulating the files themselves. I will implement the most important rendering features in PaintLab, and possibly make it available as a DLL for immediate rendering (i.e. without opening the paint app itself).

Background

A few years back, I wanted to decode parts of the PSD format in order to speed up the production pipeline for a project. I looked at the available parsers, both commercial and open source, but none of them had the features I needed, nor a design I felt comfortable with, so I decided to write my own by using the SDK. But after finding out how closely Adobe guarded the secrets of their format, and that I wouldn't be able to sign their harsh SDK license agreement, I knew I would have to do it the hard way.

Reverse engineering is a tedious process (thus slow), and with the project where I needed the parser gone by, I didn't put much time on it.

Then I started working on the paint application PaintLab, and I realized that PSD support was probably one of the most important features - without it, there is no chance of Photoshop users even considering using the program. So, instead of working with the interesting features of PaintLab, I've had to put a fair amount of time into examining the PSD format, while cursing the fact that such a widely used format has no decent open source codec. I hope my work here can save other people's time, and help them being creative instead of dealing with the boring details of a file format.

With this project, I think I've managed to create a decent architecture, but there's still work to be done before it has a 100% compatibility with PSD files.

Using the code

As the code is part of the Endogine project, and uses several of the its classes, Endogine.dll has to be available for referencing. The host app also uses Endogine.Editors.dll for the XML editor.

The API is currently a pretty straightforward reflection of the PSD file structure:

C#
using Endogine.Codecs.Photoshop;
using Endogine.Codecs.Photoshop.ImageResources;
using Endogine.Codecs.Photoshop.LayerResources;

Document psd = new Document("somefile.psd");

int documentHeight = psd.Header.Rows;
//get the height of the document

//get GridGuidesInfo ImageResource
GridGuidesInfo guidesInfo = 
  (GridGuidesInfo)psd.GetResource(typeof(GridGuidesInfo));
Console.WriteLine("Guide location: " + 
        guidesInfo.Guides[0].LocationInPixels);

Bitmap bmp = psd.Layers[0].Bitmap;
//get layer 0 bitmap

//get transparency bitmap of layer 1
Bitmap bmpChannel = psd.Layers[1].Channels[-1].Bitmap;
BrightnessContrast bc = (BrightnessContrast)
   psd.Layers[2].GetResource(typeof(BrightnessContrast));
Console.WriteLine("Layer 2 (Adjustment layer) Brighness: " + 
                  bc.Brightness);

psd.SaveXml("somefile.xml", true);
//save as XML file, and export layer bitmaps as PNGs

Points of Interest

The newer Photoshop SDKs, which include the file format specifications, are protected by a license agreement that compromises the usability of code produced by anyone who has signed it. That's why I've had to use reverse engineering for creating many parts of the code, and why it's taking so long to complete it.

If you want to contribute to the project, please understand that I won't accept code from anyone who has signed an Adobe SDK agreement. That could potentially mean trouble ahead, the day evil Adobe wants to shut down this subversive operation.

If the program fails to load a document, please add a note about it in the comments section below and keep the file around - if I have time, I'll ask you to send it to me for closer inspection. Note that I currently only have interest in documents created with Photoshop version 6 or later.

TODO

  • Understand the properties of text layer tags (TySh and Txt2). They seem extremely bloated; help with these would be very welcome.
  • Better access of data in Descriptor tags
  • Implement write functionality in all classes
  • Make sure it always writes correct PSD files
  • Deserialize from XML / PNGs
  • Implement ICC parser
  • Investigate what the tags marked as Unknown are for
  • Error handling

So far, I've only cared about RGB, 8-bit per channel images. Other formats are implicitly supported (channel data is treated the same way), but there's no specific functionality for them, like converting to RGB color space. Should you need color space conversion, there are classes for that in the Endogine.ColorEx namespace.

License

This project uses the BSD license. You are free to use the code or the binaries however you want, including commercially, as long as the copyright notice and license text are included as specified in LICENSE.txt (comes with the zip files). 

History

  • 2006-10-08 - First draft of the library.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
Sweden Sweden
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralSaving files Pin
jdjensenAZ29-Aug-07 7:57
jdjensenAZ29-Aug-07 7:57 
GeneralRe: Saving files Pin
JP John23-Oct-07 2:18
JP John23-Oct-07 2:18 
GeneralRe: Saving files Pin
Matteo Pietri12-Feb-08 23:04
Matteo Pietri12-Feb-08 23:04 
QuestionCan't find layersets Pin
Marc Delahousse25-May-07 11:07
Marc Delahousse25-May-07 11:07 
AnswerRe: Can't find layersets Pin
Jonas Beckeman29-Oct-07 10:32
Jonas Beckeman29-Oct-07 10:32 
GeneralVery Great! and another question Pin
domap17-May-07 17:11
domap17-May-07 17:11 
GeneralRe: Very Great! and another question Pin
Jonas Beckeman18-May-07 5:50
Jonas Beckeman18-May-07 5:50 
QuestionGREAT WORK, have 1 Question.. Pin
NetDevelopment3-Apr-07 6:24
NetDevelopment3-Apr-07 6:24 
This is great!! the amount of effort you put into is amazing!!

I don't think it is but the other post said Adobe will sue? (I don't think they will.) Is it illegal to reverse engine their file format? If it is do you have the link to know more about this, maybe on an Adobe partner site or something official. I would love to know more about this format and other Adobe formats. Any links would be helpful.

ps. adding those enum types for Cs2 is a must for anyone out there. Nice work!!
AnswerRe: GREAT WORK, have 1 Question.. Pin
NetDevelopment3-Apr-07 6:33
NetDevelopment3-Apr-07 6:33 
GeneralRe: GREAT WORK, have 1 Question.. Pin
Jonas Beckeman3-Apr-07 6:49
Jonas Beckeman3-Apr-07 6:49 
AnswerRe: GREAT WORK, have 1 Question.. Pin
Jonas Beckeman3-Apr-07 6:42
Jonas Beckeman3-Apr-07 6:42 
GeneralDamn cool Pin
Raj Lal2-Apr-07 13:35
professionalRaj Lal2-Apr-07 13:35 
GeneralRe: Damn cool Pin
Jonas Beckeman3-Apr-07 6:32
Jonas Beckeman3-Apr-07 6:32 
GeneralSome extra CS2 ImageResource enum values Pin
almaris24-Mar-07 18:04
almaris24-Mar-07 18:04 
GeneralRe: Some extra CS2 ImageResource enum values Pin
Jonas Beckeman26-Mar-07 1:07
Jonas Beckeman26-Mar-07 1:07 
QuestionNeed help: ImageResource.cs [modified] Pin
yuelinniao9-Feb-07 21:05
yuelinniao9-Feb-07 21:05 
AnswerRe: Need help: ImageResource.cs Pin
Jonas Beckeman11-Feb-07 23:18
Jonas Beckeman11-Feb-07 23:18 
GeneralRe: Need help: ImageResource.cs [modified] Pin
yuelinniao12-Feb-07 7:29
yuelinniao12-Feb-07 7:29 
GeneralRe: Need help: ImageResource.cs Pin
Jonas Beckeman12-Feb-07 7:35
Jonas Beckeman12-Feb-07 7:35 
GeneralRe: Need help: ImageResource.cs Pin
Jonas Beckeman12-Feb-07 11:45
Jonas Beckeman12-Feb-07 11:45 
GeneralRe: Need help: ImageResource.cs Pin
Jonas Beckeman12-Feb-07 12:00
Jonas Beckeman12-Feb-07 12:00 
GeneralRe: Need help: ImageResource.cs Pin
yuelinniao28-Feb-07 22:12
yuelinniao28-Feb-07 22:12 
GeneralRe: Need help: ImageResource.cs Pin
NeverEnds4-Aug-09 21:37
NeverEnds4-Aug-09 21:37 
Generalno workie in Vista Pin
7thgen1-Feb-07 19:51
7thgen1-Feb-07 19:51 
GeneralRe: no workie in Vista Pin
Jonas Beckeman2-Feb-07 1:44
Jonas Beckeman2-Feb-07 1:44 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.