public LengthWriter(BinaryReverseWriter writer) { _writer = writer; // we will write the correct length later, so remember // the position _lengthPosition = _writer.BaseStream.Position; _writer.Write((uint)0xFEEDFEED); // remember the start position for calculation Image // resources length _startPosition = _writer.BaseStream.Position; }
internal void SavePixelData(BinaryReverseWriter writer) { Debug.WriteLine("Channel SavePixelData started at " + writer.BaseStream.Position); writer.Write((short)ImageCompression); writer.Write(ImageData); }
internal void Save(BinaryReverseWriter writer) { Debug.WriteLine("Channel Save started at " + writer.BaseStream.Position.ToString()); writer.Write(Id); CompressImageData(); writer.Write(Data.Length + 2); // 2 bytes for the image compression }
/////////////////////////////////////////////////////////////////////////// public void Save(BinaryReverseWriter writer) { Debug.WriteLine("BlendingRanges Save started at " + writer.BaseStream.Position.ToString()); writer.Write((uint)m_data.Length); writer.Write(m_data); }
public void Save(BinaryReverseWriter writer) { Debug.WriteLine("AdjusmentLayerInfo Save started at " + writer.BaseStream.Position.ToString()); string signature = "8BIM"; writer.Write(signature.ToCharArray()); writer.Write(m_key.ToCharArray()); writer.Write((uint)m_data.Length); writer.Write(m_data); }
/////////////////////////////////////////////////////////////////////////// public void Save(BinaryReverseWriter writer) { Debug.WriteLine("Layer Save started at " + writer.BaseStream.Position.ToString()); writer.Write(Rect.Top); writer.Write(Rect.Left); writer.Write(Rect.Bottom); writer.Write(Rect.Right); //----------------------------------------------------------------------- writer.Write((short)_channels.Count); foreach (Channel ch in _channels) ch.Save(writer); //----------------------------------------------------------------------- string signature = "8BIM"; writer.Write(signature.ToCharArray()); writer.Write(_blendModeKey.ToCharArray()); writer.Write(Opacity); writer.Write((byte)(Clipping ? 1 : 0)); writer.Write((byte)_flags.Data); //----------------------------------------------------------------------- writer.Write((byte)0); //----------------------------------------------------------------------- using (new LengthWriter(writer)) { m_maskData.Save(writer); m_blendingRangesData.Save(writer); long namePosition = writer.BaseStream.Position; writer.WritePascalString(Name); int paddingBytes = (int)((writer.BaseStream.Position - namePosition) % 4); Debug.Print("Layer {0} write padding bytes after name", paddingBytes); for (int i = 0; i < paddingBytes; i++) writer.Write((byte)0); foreach (AdjusmentLayerInfo info in m_adjustmentInfo) { info.Save(writer); } } }
private void SaveColorModeData(BinaryReverseWriter writer) { Debug.WriteLine("SaveColorModeData started at " + writer.BaseStream.Position.ToString()); writer.Write((uint)ColorModeData.Length); writer.Write(ColorModeData); }
internal void SavePixelData(BinaryReverseWriter writer) { //writer.Write(m_data); }
/////////////////////////////////////////////////////////////////////////// private void SaveLayerAndMaskInfo(BinaryReverseWriter writer) { Debug.WriteLine("SaveLayerAndMaskInfo started at " + writer.BaseStream.Position.ToString()); using (new LengthWriter(writer)) { SaveLayers(writer); SaveGlobalLayerMask(writer); } }
/////////////////////////////////////////////////////////////////////////// private void SaveImageRLE(BinaryReverseWriter writer) { // we will write the correct lengths later, so remember // the position long lengthPosition = writer.BaseStream.Position; int[] rleRowLenghs = new int[m_rows * m_channels]; if (m_imageCompression == ImageCompression.Rle) { for (int i = 0; i < rleRowLenghs.Length; i++) { writer.Write((short)0x1234); } } //--------------------------------------------------------------- for (int ch = 0; ch < m_channels; ch++) { int startIdx = ch * m_rows; for (int row = 0; row < m_rows; row++) rleRowLenghs[row + startIdx] = RleHelper.EncodedRow(writer.BaseStream, m_imageData[ch], row * m_columns, m_columns); } //--------------------------------------------------------------- long endPosition = writer.BaseStream.Position; writer.BaseStream.Position = lengthPosition; for (int i = 0; i < rleRowLenghs.Length; i++) { writer.Write((short)rleRowLenghs[i]); } writer.BaseStream.Position = endPosition; //--------------------------------------------------------------- }
/////////////////////////////////////////////////////////////////////////// private void SaveImageResources(BinaryReverseWriter writer) { Debug.WriteLine("SaveImageResources started at " + writer.BaseStream.Position.ToString()); using (new LengthWriter(writer)) { foreach (ImageResource imgRes in m_imageResources) imgRes.Save(writer); } }
/////////////////////////////////////////////////////////////////////////// private void SaveImage(BinaryReverseWriter writer) { Debug.WriteLine("SaveImage started at " + writer.BaseStream.Position.ToString()); writer.Write((short)m_imageCompression); if (m_imageCompression == ImageCompression.Rle) { SaveImageRLE(writer); } else { for (int ch = 0; ch < m_channels; ch++) { writer.Write(m_imageData[ch]); } } }
/////////////////////////////////////////////////////////////////////////// private void SaveHeader(BinaryReverseWriter writer) { Debug.WriteLine("SaveHeader started at " + writer.BaseStream.Position.ToString()); string signature = "8BPS"; writer.Write(signature.ToCharArray()); writer.Write(Version); writer.Write(new byte[] { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }); writer.Write(m_channels); writer.Write(m_rows); writer.Write(m_columns); writer.Write((short)m_depth); writer.Write((short)m_colorMode); }
/////////////////////////////////////////////////////////////////////////// private void SaveGlobalLayerMask(BinaryReverseWriter writer) { Debug.WriteLine("SaveGlobalLayerMask started at " + writer.BaseStream.Position.ToString()); writer.Write((uint)GlobalLayerMaskData.Length); writer.Write(GlobalLayerMaskData); }
private void CompressImageData() { if (ImageCompression == ImageCompression.Rle) { MemoryStream dataStream = new MemoryStream(); BinaryReverseWriter writer = new BinaryReverseWriter(dataStream); // we will write the correct lengths later, so remember // the position long lengthPosition = writer.BaseStream.Position; int[] rleRowLenghs = new int[_layer.Rect.Height]; if (ImageCompression == ImageCompression.Rle) { for (int i = 0; i < rleRowLenghs.Length; i++) { writer.Write((short)0x1234); } } //--------------------------------------------------------------- int bytesPerRow = 0; switch (_layer.PsdFile.Depth) { case 1: bytesPerRow = _layer.Rect.Width;//NOT Shure break; case 8: bytesPerRow = _layer.Rect.Width; break; case 16: bytesPerRow = _layer.Rect.Width * 2; break; } //--------------------------------------------------------------- for (int row = 0; row < _layer.Rect.Height; row++) { int rowIndex = row * _layer.Rect.Width; rleRowLenghs[row] = RleHelper.EncodedRow(writer.BaseStream, ImageData, rowIndex, bytesPerRow); } //--------------------------------------------------------------- long endPosition = writer.BaseStream.Position; writer.BaseStream.Position = lengthPosition; for (int i = 0; i < rleRowLenghs.Length; i++) { writer.Write((short)rleRowLenghs[i]); } writer.BaseStream.Position = endPosition; dataStream.Close(); Data = dataStream.ToArray(); dataStream.Dispose(); } else { Data = (byte[])ImageData.Clone(); } }
/////////////////////////////////////////////////////////////////////////// public void Save(BinaryReverseWriter writer) { Debug.WriteLine("Mask Save started at " + writer.BaseStream.Position.ToString()); if (m_rect.IsEmpty) { writer.Write((uint)0); return; } using (new LengthWriter(writer)) { writer.Write(m_rect.Top); writer.Write(m_rect.Left); writer.Write(m_rect.Bottom); writer.Write(m_rect.Right); writer.Write(m_defaultColor); writer.Write((byte)m_flags.Data); // padding 2 bytes so that size is 20 writer.Write((int)0); } }
/////////////////////////////////////////////////////////////////////////// private void SaveLayers(BinaryReverseWriter writer) { Debug.WriteLine("SaveLayers started at " + writer.BaseStream.Position.ToString()); using (new LengthWriter(writer)) { short numberOfLayers = (short)m_layers.Count; if (AbsoluteAlpha) numberOfLayers = (short)-numberOfLayers; writer.Write(numberOfLayers); foreach (Layer layer in m_layers) { layer.Save(writer); } foreach (Layer layer in m_layers) { foreach (Layer.Channel channel in layer.Channels) { channel.SavePixelData(writer); } } if (writer.BaseStream.Position % 2 == 1) writer.Write((byte)0); } }
////////////////////////////////////////////////////////////////// public void Save(BinaryReverseWriter writer) { StoreData(); if (m_osType == String.Empty) m_osType = "8BIM"; writer.Write(m_osType.ToCharArray()); writer.Write(m_id); writer.WritePascalString(m_name); writer.Write((int)m_data.Length); writer.Write(m_data); if (writer.BaseStream.Position % 2 == 1) writer.Write((byte)0); }
public void Save(Stream stream) { BinaryReverseWriter writer = new BinaryReverseWriter(stream); writer.AutoFlush = true; SaveHeader(writer); SaveColorModeData(writer); SaveImageResources(writer); SaveLayerAndMaskInfo(writer); SaveImage(writer); }