예제 #1
0
        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);
            }
        }
예제 #2
0
 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);
         }
 }
예제 #3
0
 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);
         }
 }
예제 #4
0
 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);
         }
 }
예제 #5
0
 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);
         }
 }
예제 #6
0
 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);
         }
 }
예제 #7
0
 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);
         }
 }
예제 #8
0
        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);
                }
        }
예제 #9
0
        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);
                }
        }
예제 #10
0
        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);
                }
        }
예제 #11
0
        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));
            }
        }
예제 #12
0
        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");
                }
            }
        }