////////////////////////////////////////////////////////////////// internal void LoadPixelData(PsdBinaryReader reader) { Util.DebugMessage(reader.BaseStream, "Load, Begin, Channel image"); if (Length == 0) { ImageCompression = ImageCompression.Raw; ImageDataRaw = new byte[0]; return; } var endPosition = reader.BaseStream.Position + this.Length; ImageCompression = (ImageCompression)reader.ReadInt16(); var longDataLength = this.Length - 2; Util.CheckByteArrayLength(longDataLength); var dataLength = (int)longDataLength; switch (ImageCompression) { case ImageCompression.Raw: ImageDataRaw = reader.ReadBytes(dataLength); break; case ImageCompression.Rle: // RLE row lengths RleRowLengths = new RleRowLengths(reader, Rect.Height, Layer.PsdFile.IsLargeDocument); var rleDataLength = (int)(endPosition - reader.BaseStream.Position); Debug.Assert(rleDataLength == RleRowLengths.Total, "RLE row lengths do not sum to length of channel image data."); // The PSD specification states that rows are padded to even sizes. // However, Photoshop doesn't actually do this. RLE rows can have // odd lengths in the header, and there is no padding between rows. ImageDataRaw = reader.ReadBytes(rleDataLength); break; case ImageCompression.Zip: case ImageCompression.ZipPrediction: ImageDataRaw = reader.ReadBytes(dataLength); break; } Util.DebugMessage(reader.BaseStream, $"Load, End, Channel image, {ID}"); Debug.Assert(reader.BaseStream.Position == endPosition, "Pixel data was not fully read in."); }
public RawImageResource(PsdBinaryReader reader, string signature, ResourceID resourceId, string name, int numBytes) : base(name) { this.Signature = signature; this.id = resourceId; Data = reader.ReadBytes(numBytes); }
public RawLayerInfo(PsdBinaryReader reader, string signature, string key, long dataLength) { this.signature = signature; this.key = key; Util.CheckByteArrayLength(dataLength); Data = reader.ReadBytes((int)dataLength); }
public Thumbnail(PsdBinaryReader psdReader, ResourceID id, string name, int numBytes) : base(psdReader, "8BIM", id, name, numBytes) { using (var memoryStream = new MemoryStream(Data)) { using (var reader = new PsdBinaryReader(memoryStream, psdReader)) { const int HEADER_LENGTH = 28; var format = reader.ReadUInt32(); var width = reader.ReadUInt32(); var height = reader.ReadUInt32(); var widthBytes = reader.ReadUInt32(); var size = reader.ReadUInt32(); var compressedSize = reader.ReadUInt32(); var bitPerPixel = reader.ReadUInt16(); var planes = reader.ReadUInt16(); // Raw RGB bitmal if (format == 0) { Image = new Bitmap((int)width, (int)height, PixelFormat.Format24bppRgb); } // JPEG bitmap else if (format == 1) { byte[] imgData = reader.ReadBytes(numBytes - HEADER_LENGTH); using (MemoryStream stream = new MemoryStream(imgData)) { var bitmap = new Bitmap(stream); Image = (Bitmap)bitmap.Clone(); } // Reverse BGR pixels from old thumbnail format if (id == ResourceID.ThumbnailBgr) { //for(int y=0;y<m_thumbnailImage.Height;y++) // for (int x = 0; x < m_thumbnailImage.Width; x++) // { // Color c=m_thumbnailImage.GetPixel(x,y); // Color c2=Color.FromArgb(c.B, c.G, c.R); // m_thumbnailImage.SetPixel(x, y, c); // } } } else { throw new PsdInvalidException("Unknown thumbnail format."); } } } }
/////////////////////////////////////////////////////////////////////////// public BlendingRanges(PsdBinaryReader reader, Layer layer) { Util.DebugMessage(reader.BaseStream, "Load, Begin, BlendingRanges"); Layer = layer; var dataLength = reader.ReadInt32(); if (dataLength <= 0) { return; } Data = reader.ReadBytes(dataLength); Util.DebugMessage(reader.BaseStream, "Load, End, BlendingRanges"); }