package photoshop; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteOrder; import struct.JavaStruct; import struct.StructException; import struct.StructPacker; import struct.StructUnpacker; /** * A class for reading and writing Adobe Photoshop Color Book format. Format * details is given in http://magnetiq.com/docs/PhotoshopColorBook.txt Thanks to * Ates Goral for his help. * * JavaStruct makes it very easy to read header information. But reading color * datais tricky, because format changes depending to Color space idenifier * (RGB, CMYK or Lab) we have to read them conditionally, and there is some * repeated code.There could be a better way, but this is simpler to understand. * * Two example acb files are included in the project. They are used in the main * method of this class. * * @author mdakin */ public class AdobeColorBook { ACBHeader header; RGBColor[] rgbColors = null; CMYKColor[] cmykColors = null; LabColor[] labColors = null; public void read(String acbFile) { try { FileInputStream fis = new FileInputStream(new File(acbFile)); header = new ACBHeader(); StructUnpacker up = JavaStruct.getUnpacker(fis, ByteOrder.BIG_ENDIAN); up.readObject(header); switch (header.ColorSpaceID) { case ACBHeader.RGB: rgbColors = new RGBColor[header.colorCount]; for (int i = 0; i < header.colorCount; i++) { rgbColors[i] = new RGBColor(); up.readObject(rgbColors[i]); } break; case ACBHeader.CMYK: cmykColors = new CMYKColor[header.colorCount]; for (int i = 0; i < header.colorCount; i++) { cmykColors[i] = new CMYKColor(); up.readObject(cmykColors[i]); } break; case ACBHeader.LAB: labColors = new LabColor[header.colorCount]; for (int i = 0; i < header.colorCount; i++) { labColors[i] = new LabColor(); up.readObject(labColors[i]); } break; default: } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (StructException e) { e.printStackTrace(); } } public void write(String name) { try { FileOutputStream fo = new FileOutputStream(new File(name)); StructPacker packer = JavaStruct .getPacker(fo, ByteOrder.BIG_ENDIAN); packer.writeObject(header); switch (header.ColorSpaceID) { case ACBHeader.RGB: for (RGBColor color : rgbColors) { packer.writeObject(color); } break; case ACBHeader.CMYK: for (CMYKColor color : cmykColors) { packer.writeObject(color); } break; case ACBHeader.LAB: for (LabColor color : labColors) { packer.writeObject(color); } break; default: } fo.close(); } catch (StructException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public String toString() { String str = ""; if (header != null) { str += header; } switch (header.ColorSpaceID) { case ACBHeader.RGB: for (RGBColor color : rgbColors) { str += color + "\n"; } break; case ACBHeader.CMYK: for (CMYKColor color : cmykColors) { str += color + "\n"; } break; case ACBHeader.LAB: for (LabColor color : labColors) { str += color + "\n"; } break; } return str; } public static void main(String[] args) { AdobeColorBook anpaBook = new AdobeColorBook(); anpaBook.read("ANPA Color.acb"); anpaBook.write("ANPA_my_Color.acb"); System.out.println(anpaBook); AdobeColorBook focoltoneBook = new AdobeColorBook(); focoltoneBook.read("FOCOLTONE.acb"); System.out.println(focoltoneBook); } }