Esempio n. 1
0
        //////////////////////////////////////////////////////////////////

        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.");
        }
Esempio n. 2
0
 public RawImageResource(PsdBinaryReader reader, string signature, ResourceID resourceId,
                         string name, int numBytes) : base(name)
 {
     this.Signature = signature;
     this.id        = resourceId;
     Data           = reader.ReadBytes(numBytes);
 }
Esempio n. 3
0
        public RawLayerInfo(PsdBinaryReader reader, string signature, string key,
                            long dataLength)
        {
            this.signature = signature;
            this.key       = key;

            Util.CheckByteArrayLength(dataLength);
            Data = reader.ReadBytes((int)dataLength);
        }
Esempio n. 4
0
        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.");
                    }
                }
            }
        }
Esempio n. 5
0
        ///////////////////////////////////////////////////////////////////////////

        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");
        }