Adobe Photoshop PSD och PSB-Format

Skrivet av Paul Bourke
Juni 2015

Translated to Swedish by Catherine Desroches, Aug 2017


Adobe PhotoShop PSD och PSB (large document format) är bekvämt format för export image data, i synnerhet 16 eller 32 bitars high dynamic range data. I det följande ges en kort översikt av minimikraven för att skapa en legal (Adobe PhotoShop kommer att läsa det) fil, en mer fullständig referens finns här.

EN PSD-eller PSB-filen består av en enkel header följt av 4 sektioner, lyckligtvis alla avsnitt data kan lämnas tomma genom att ange 0 i avsnittet längd med undantag för det sista avsnittet som är bilddata. Huvudet består av de vanliga misstänkta

  • en magisk sträng för att säkerställa en korrekt fil identifiering, oftast “8 BPS”.
  • ett versionsnummer, vanligtvis 1.
  • antalet kanaler.
  • höjd och bredd på bilden uppgifter.
  • färg djup för varje kanal i bitar, vanligtvis 1, 8, 16 eller 32.
  • färgläge, oftast Bitmapp, Gråskala, Indexerad, RGB, CMYK, Multichannel, Tvåfärgat eller Lab.

bilddata kan vara rå (nu komprimering), rle eller zip-komprimerade. I alla fall de data som presenteras i planar (i motsats till interleaved) form.

En (ofullständig) exempel skapa ett 16-bitars gråskala PSD-filen nedan visas de funktioner som WriteXXX() skriva binära data till en fil som utför ett alternativ byte pendla för att hantera big eller little-endian uppgifter.

   FILE *fptr;
   int i,j;
   char header[8] = "8BPS";
   unsigned short int version = 1,channels = 1,zero = 0;
   unsigned int width = 150,height = 200;
   unsigned int zerolength = 0;
   unsigned short depth = 16,colourmode = 1,compression = 0;
   unsigned short intvalue = 0;

   fptr = fopen("test.psd","w");

   // Header
   fwrite(header,4,1,fptr);
   WriteShort(fptr,version,TRUE);
   for (i=0;i<3;i++)
      WriteShort(fptr,zero,TRUE);
   WriteShort(fptr,channels,TRUE);
   WriteInt(fptr,height,TRUE);
   WriteInt(fptr,width,TRUE);
   WriteShort(fptr,depth,TRUE);
   WriteShort(fptr,colourmode,TRUE);
   WriteInt(fptr,zerolength,TRUE); // Colour mode data
   WriteInt(fptr,zerolength,TRUE); // Image resource data
   WriteInt(fptr,zerolength,TRUE); // Layer and mask section
   // Image data
   WriteShort(fptr,compression,TRUE);
   for (j=0;j<height;j++) {
      for (i=0;i<width;i++) {
         intvalue = j * 65535 / height;
         WriteShort(fptr,intvalue,TRUE);
      }
   }
   fclose(fptr);