public Header(BinaryPSDReader reader) { this.Version = reader.ReadUInt16(); if (Version != 1) throw new Exception("Can not read .psd version " + Version); byte[] buf = new byte[256]; reader.Read(buf, (int)reader.BaseStream.Position, 6); //6 bytes reserved this.Channels = reader.ReadInt16(); this.Rows = reader.ReadUInt32(); this.Columns = reader.ReadUInt32(); this.BitsPerPixel = reader.ReadUInt16(); this.ColorMode = (ColorModes)reader.ReadInt16(); }
public Header(BinaryPSDReader reader) { this.Version = reader.ReadUInt16(); if (Version != 1) { throw new Exception("Can not read .psd version " + Version); } byte[] buf = new byte[256]; reader.Read(buf, (int)reader.BaseStream.Position, 6); //6 bytes reserved this.Channels = reader.ReadInt16(); this.Rows = reader.ReadUInt32(); this.Columns = reader.ReadUInt32(); this.BitsPerPixel = reader.ReadUInt16(); this.ColorMode = (ColorModes)reader.ReadInt16(); }
public Channel(BinaryPSDReader reader, Layer layer) { this._usage = reader.ReadInt16(); long length = (long)reader.ReadUInt32(); this._layer = layer; }
public Document(string a_sFilename) { this.Init(); FileStream stream = new FileStream(a_sFilename, FileMode.Open, FileAccess.Read); //stream. BinaryPSDReader reader = new BinaryPSDReader(stream); string signature = new string(reader.ReadPSDChars(4)); if (signature != "8BPS") return; this._header = new Header(reader); //this.Version = reader.ReadUInt16(); //if (Version != 1) // throw new Exception("Can not read .psd version " + Version); //byte[] buf = new byte[256]; //reader.Read(buf, (int)reader.BaseStream.Position, 6); //6 bytes reserved //this.Channels = reader.ReadInt16(); //this.Rows = reader.ReadUInt32(); //this.Columns = reader.ReadUInt32(); //this.BitsPerPixel = (int)reader.ReadUInt16(); //this.ColorMode = (ColorModes)reader.ReadInt16(); #region Palette uint nPaletteLength = reader.ReadUInt32(); if (nPaletteLength > 0) { this.ColorTable = new List<Color>(); for (int i = 0; i < nPaletteLength; i+=3) { this.ColorTable.Add(Color.FromArgb((int)reader.ReadByte(), (int)reader.ReadByte(), (int)reader.ReadByte())); } //this.ColorTable.Add(Color.FromArgb(255, 10, 20)); if (this.ColorMode == ColorModes.Duotone) { } else { } } #endregion uint nResLength = reader.ReadUInt32(); //? Number of bytes, or number of entries?? if (nResLength > 0) { //read settings this._imageResources = ImageResource.ReadImageResources(reader); } //reader.JumpToEvenNthByte(4); uint nTotalLayersBytes = reader.ReadUInt32(); long nAfterLayersDefinitions = reader.BaseStream.Position + nTotalLayersBytes; if (nTotalLayersBytes == 8) { stream.Position += nTotalLayersBytes; //this.Unknown = Endogine.Serialization.ReadableBinary.CreateHexEditorString(reader.ReadBytes((int)reader.BytesToEnd)); } else { uint nSize = reader.ReadUInt32(); //What's the difference between nTotalLayersBytes and nSize really? long nLayersEndPos = reader.BaseStream.Position + nSize; short nNumLayers = reader.ReadInt16(); bool bSkipFirstAlpha = false; if (nNumLayers < 0) { bSkipFirstAlpha = true; nNumLayers = (short)-nNumLayers; } List<Layer> loadOrderLayers = new List<Layer>(); this._layers = new List<Layer>(); // new Dictionary<int, Layer>(); for (int nLayerNum = 0; nLayerNum < nNumLayers; nLayerNum++) { Layer layerInfo = new Layer(reader, this); layerInfo.DebugLayerLoadOrdinal = nLayerNum; //if (layerInfo.LayerID < 0) // layerInfo.LayerID = nLayerNum; //if (this._layers.ContainsKey(layerInfo.LayerID)) // throw(new Exception("Duplicate layer IDs! " + layerInfo.LayerID.ToString())); //else // this._layers.Add(layerInfo.LayerID, layerInfo); this._layers.Add(layerInfo); loadOrderLayers.Add(layerInfo); } for (int layerNum = 0; layerNum < nNumLayers; layerNum++) { Layer layer = (Layer)loadOrderLayers[layerNum]; layer.ReadPixels(reader); } reader.JumpToEvenNthByte(4); if (reader.BaseStream.Position != nLayersEndPos) reader.BaseStream.Position = nLayersEndPos; // nAfterLayersDefinitions; //Global layer mask uint maskLength = reader.ReadUInt32(); this._tempGlobalLayerMask = null; if (maskLength > 0) { this._tempGlobalLayerMask = reader.ReadBytes((int)maskLength); //TODO: the docs are obviously wrong here... //ushort overlayColorSpace = reader.ReadUInt16(); //undefined in docs //for (int i = 0; i < 4; i++) // reader.ReadUInt16(); //TODO: UInt16 if 16-bit color? Color components - says *both* 4*2 bytes, and 8 bytes in the docs? //reader.ReadUInt16(); //opacity (0-100) //reader.ReadByte(); //Kind: 0=Color selectedi.e. inverted; 1=Color protected;128=use value stored per layer. //reader.ReadByte(); //padding } //hmm... another section of "global" layer resources..? while (true) { long cpPos = reader.BaseStream.Position; string sHeader = new string(reader.ReadPSDChars(4)); reader.BaseStream.Position = cpPos; //TODO: -= 4 should work, but sometimes ReadPSDChars advances 5?!?! if (sHeader != "8BIM") { break; } LayerResource res = LayerResource.ReadLayerResource(reader, null); this._globalLayerResources.Add(res); } } bool readGlobalImage = true; if (readGlobalImage) { this._globalImage = new GlobalImage(this); this._globalImage.Load(reader); //the big merged bitmap (which is how the photoshop document looked when it was saved) //Bitmap bmp = this._globalImage.Bitmap; } reader.Close(); stream.Close(); }
public Document(string a_sFilename) { this.Init(); FileStream stream = new FileStream(a_sFilename, FileMode.Open, FileAccess.Read); //stream. BinaryPSDReader reader = new BinaryPSDReader(stream); string signature = new string(reader.ReadPSDChars(4)); if (signature != "8BPS") { return; } this._header = new Header(reader); //this.Version = reader.ReadUInt16(); //if (Version != 1) // throw new Exception("Can not read .psd version " + Version); //byte[] buf = new byte[256]; //reader.Read(buf, (int)reader.BaseStream.Position, 6); //6 bytes reserved //this.Channels = reader.ReadInt16(); //this.Rows = reader.ReadUInt32(); //this.Columns = reader.ReadUInt32(); //this.BitsPerPixel = (int)reader.ReadUInt16(); //this.ColorMode = (ColorModes)reader.ReadInt16(); #region Palette uint nPaletteLength = reader.ReadUInt32(); if (nPaletteLength > 0) { this.ColorTable = new List <Color>(); for (int i = 0; i < nPaletteLength; i += 3) { this.ColorTable.Add(Color.FromArgb((int)reader.ReadByte(), (int)reader.ReadByte(), (int)reader.ReadByte())); } //this.ColorTable.Add(Color.FromArgb(255, 10, 20)); if (this.ColorMode == ColorModes.Duotone) { } else { } } #endregion uint nResLength = reader.ReadUInt32(); //? Number of bytes, or number of entries?? if (nResLength > 0) { //read settings this._imageResources = ImageResource.ReadImageResources(reader); } //reader.JumpToEvenNthByte(4); uint nTotalLayersBytes = reader.ReadUInt32(); long nAfterLayersDefinitions = reader.BaseStream.Position + nTotalLayersBytes; if (nTotalLayersBytes == 8) { stream.Position += nTotalLayersBytes; //this.Unknown = Endogine.Serialization.ReadableBinary.CreateHexEditorString(reader.ReadBytes((int)reader.BytesToEnd)); } else { uint nSize = reader.ReadUInt32(); //What's the difference between nTotalLayersBytes and nSize really? long nLayersEndPos = reader.BaseStream.Position + nSize; short nNumLayers = reader.ReadInt16(); bool bSkipFirstAlpha = false; if (nNumLayers < 0) { bSkipFirstAlpha = true; nNumLayers = (short)-nNumLayers; } List <Layer> loadOrderLayers = new List <Layer>(); this._layers = new List <Layer>(); // new Dictionary<int, Layer>(); for (int nLayerNum = 0; nLayerNum < nNumLayers; nLayerNum++) { Layer layerInfo = new Layer(reader, this); layerInfo.DebugLayerLoadOrdinal = nLayerNum; //if (layerInfo.LayerID < 0) // layerInfo.LayerID = nLayerNum; //if (this._layers.ContainsKey(layerInfo.LayerID)) // throw(new Exception("Duplicate layer IDs! " + layerInfo.LayerID.ToString())); //else // this._layers.Add(layerInfo.LayerID, layerInfo); this._layers.Add(layerInfo); loadOrderLayers.Add(layerInfo); } for (int layerNum = 0; layerNum < nNumLayers; layerNum++) { Layer layer = (Layer)loadOrderLayers[layerNum]; layer.ReadPixels(reader); } reader.JumpToEvenNthByte(4); if (reader.BaseStream.Position != nLayersEndPos) { reader.BaseStream.Position = nLayersEndPos; // nAfterLayersDefinitions; } //Global layer mask uint maskLength = reader.ReadUInt32(); this._tempGlobalLayerMask = null; if (maskLength > 0) { this._tempGlobalLayerMask = reader.ReadBytes((int)maskLength); //TODO: the docs are obviously wrong here... //ushort overlayColorSpace = reader.ReadUInt16(); //undefined in docs //for (int i = 0; i < 4; i++) // reader.ReadUInt16(); //TODO: UInt16 if 16-bit color? Color components - says *both* 4*2 bytes, and 8 bytes in the docs? //reader.ReadUInt16(); //opacity (0-100) //reader.ReadByte(); //Kind: 0=Color selectedi.e. inverted; 1=Color protected;128=use value stored per layer. //reader.ReadByte(); //padding } //hmm... another section of "global" layer resources..? while (true) { long cpPos = reader.BaseStream.Position; string sHeader = new string(reader.ReadPSDChars(4)); reader.BaseStream.Position = cpPos; //TODO: -= 4 should work, but sometimes ReadPSDChars advances 5?!?! if (sHeader != "8BIM") { break; } LayerResource res = LayerResource.ReadLayerResource(reader, null); this._globalLayerResources.Add(res); } } bool readGlobalImage = true; if (readGlobalImage) { this._globalImage = new GlobalImage(this); this._globalImage.Load(reader); //the big merged bitmap (which is how the photoshop document looked when it was saved) //Bitmap bmp = this._globalImage.Bitmap; } reader.Close(); stream.Close(); }