private static void ParseRow( StartOfFrame lossless, int x, ushort y, StartOfImage startOfImage, HuffmanTable table0, short[,] rowBuf, short[] predictor, Bitmap image1) { var i1 = 4 / lossless.Components.Length; for (var j = 0; j < lossless.ScanLines / i1; j++) { for (var g = 0; g < i1; g++) { for (var i = 0; i < y / lossless.Components.Length; i++) { for (var h = 0; h < lossless.Components.Length; h++) { var hufCode = UnitTests.GetValue(startOfImage.ImageData, table0); var difCode = startOfImage.ImageData.GetSetOfBits(hufCode); var dif = UnitTests.DecodeDifBits(hufCode, difCode); if (i == 0) { rowBuf[g * i1 + h, i] = predictor[h] += dif; } else { rowBuf[g * i1 + h, i] = (short)(rowBuf[g * i1 + h, i - 1] + dif); } } } } UnitTests.DumpPixel(x * y, j, rowBuf, image1); } }
public void ScanLines() { using (var memory = new MemoryStream(Data)) using (var reader = new BinaryReader(memory)) { var lossless = new StartOfFrame(reader); Assert.AreEqual(0x0DBC, lossless.ScanLines); } }
public void Precision() { using (var memory = new MemoryStream(Data)) using (var reader = new BinaryReader(memory)) { var lossless = new StartOfFrame(reader); Assert.AreEqual(0x0E, lossless.Precision); } }
public void Length() { using (var memory = new MemoryStream(Data)) using (var reader = new BinaryReader(memory)) { var lossless = new StartOfFrame(reader); Assert.AreEqual(0x0014, lossless.Length); } }
public void Tag() { using (var memory = new MemoryStream(Data)) using (var reader = new BinaryReader(memory)) { var lossless = new StartOfFrame(reader); Assert.AreEqual(0xC3, lossless.Tag); } }
public void VFactor() { using (var memory = new MemoryStream(Data)) using (var reader = new BinaryReader(memory)) { var lossless = new StartOfFrame(reader); Assert.AreEqual(0x01, lossless.Components[0].VFactor); } }
public void SamplesPerLine() { using (var memory = new MemoryStream(Data)) using (var reader = new BinaryReader(memory)) { var lossless = new StartOfFrame(reader); Assert.AreEqual(0x053C, lossless.SamplesPerLine); } }
public void BadTag() { var badData = new byte[] { 0xFF, 0x00 }; using (var memory = new MemoryStream(badData)) using (var reader = new BinaryReader(memory)) { var lossless = new StartOfFrame(reader); } }
public void LongComponentCount() { var badData = new byte[] { 0xFF, 0xC3, 0x00, 0x0A, 0x0E, 0x0D, 0xBC, 0x05, 0x3C, 0x01, 0x01, 0x11 }; using (var memory = new MemoryStream(badData)) using (var reader = new BinaryReader(memory)) { var lossless = new StartOfFrame(reader); } }
public void LongLength() { var badData = new byte[] { 0xFF, 0xC3, 0x00, 0x09, 0x0E, 0x0D, 0xBC, 0x05, 0x3C, 0x00 }; using (var memory = new MemoryStream(badData)) using (var reader = new BinaryReader(memory)) { var lossless = new StartOfFrame(reader); } }
private static void DumpStartOfFrame(StartOfFrame startOfFrame) { var hMax = startOfFrame.Components.Max(c => c.HFactor); var vMax = startOfFrame.Components.Max(c => c.VFactor); Console.WriteLine("Precision {0}", startOfFrame.Precision); Console.WriteLine( "lines {0}, samples per line {1} * {2} = {3}", startOfFrame.ScanLines, startOfFrame.SamplesPerLine, startOfFrame.Components.Length, startOfFrame.Width); Console.WriteLine("Nf: {0}", startOfFrame.Components.Length); Console.WriteLine("X={0}, Y={1}, Hmax={2}, Vmax={3}", startOfFrame.Width, startOfFrame.ScanLines, hMax, vMax); foreach (var component in startOfFrame.Components) { Console.Write(" C {0}: H {1}, V {2}", component.ComponentId, component.HFactor, component.VFactor); Console.WriteLine(" --> H {0}, V {1}", startOfFrame.Width / (hMax / component.HFactor), startOfFrame.ScanLines / (vMax / component.VFactor)); } }
public StartOfImage(BinaryReader binaryReader, uint address, uint length) : base(binaryReader) { if (Mark != 0xFF || Tag != 0xD8) { throw new ArgumentException(); } var start = binaryReader.BaseStream.Position; while (binaryReader.BaseStream.Position < start + length - 2) { var pos = binaryReader.BaseStream.Position; var nextMark = binaryReader.ReadByte(); if (nextMark != 0xFF) { throw new NotImplementedException($"Tag 0x{nextMark:X2} is not implemented"); } var nextTag = binaryReader.ReadByte(); binaryReader.BaseStream.Seek(pos, SeekOrigin.Begin); Console.WriteLine($"NextMark {nextTag:X2}: 0x{binaryReader.BaseStream.Position:X8}"); switch (nextTag) { case 0xC0: // SOF0, Start of Frame 0, Baseline DCT case 0xC3: // SOF3, Start of Frame 3, Lossless (sequential) StartOfFrame = new StartOfFrame(binaryReader); var image = StartOfFrame.SamplesPerLine * StartOfFrame.ScanLines; Console.WriteLine("Image = {0} * {1} = {2}", StartOfFrame.ScanLines, StartOfFrame.SamplesPerLine, image); break; case 0xC4: // DHT, Define Huffman Table HuffmanTable = new DefineHuffmanTable(binaryReader); break; case 0xD9: // EOI, End of Image var x3 = (ushort)(binaryReader.ReadByte() << 8 | binaryReader.ReadByte()); break; case 0xDA: // SOS, Start of Scan StartOfScan = new StartOfScan(binaryReader); var rawSize = address + length - binaryReader.BaseStream.Position; ImageData = new ImageData(binaryReader, (uint)rawSize); DecodeHuffmanData(); break; case 0xDB: // DQT, Define Quantization Table QuantizationTable = new DefineQuantizationTable(binaryReader); break; case 0xE0: // APP0, Application Segment 0, JFIF - JFIF JPEG image, AVI1 - Motion JPEG (MJPG) _jfifMarker = new JfifMarker(binaryReader); break; case 0xE1: // APP1, Application Segment 1, EXIF Metadata, TIFF IFD format,JPEG Thumbnail (160x120), Adobe XMP case 0xE4: // APP4, Application Segment 4, (Not common) case 0xEC: // APP12, Application Segment 12, Picture Info (older digicams), Photoshop Save for Web: Ducky case 0xEE: // APP14, Application Segment 14, (Not common) var x1 = (ushort)(binaryReader.ReadByte() << 8 | binaryReader.ReadByte()); var length1 = (ushort)(binaryReader.ReadByte() << 8 | binaryReader.ReadByte()); var data = binaryReader.ReadBytes(length1 - 2); break; case 0xFE: var comment = new Comment(binaryReader); break; default: throw new NotImplementedException($"Tag 0xFF 0x{nextTag:X2} is not implemented"); } } }