Пример #1
0
        internal void QuantizeAndInverseAllComponents()
        {
            for (int i = 0; i < this.components.Components.Length; i++)
            {
                PdfJsFrameComponent frameComponent = this.Frame.Components[i];
                PdfJsComponent      component      = this.components.Components[i];

                this.QuantizeAndInverseComponentData(component, frameComponent);
            }
        }
Пример #2
0
        /// <summary>
        /// Parses the input stream for file markers
        /// </summary>
        /// <param name="metaData">Contains the metadata for an image</param>
        /// <param name="metadataOnly">Whether to decode metadata only.</param>
        private void ParseStream(ImageMetaData metaData, bool metadataOnly)
        {
            // TODO: metadata only logic
            // Check for the Start Of Image marker.
            var fileMarker = new PdfJsFileMarker(this.ReadUint16(), 0);

            if (fileMarker.Marker != PdfJsJpegConstants.Markers.SOI)
            {
                throw new ImageFormatException("Missing SOI marker.");
            }

            ushort marker = this.ReadUint16();

            fileMarker = new PdfJsFileMarker(marker, (int)this.InputStream.Position - 2);

            this.quantizationTables = new PdfJsQuantizationTables();
            this.dcHuffmanTables    = new PdfJsHuffmanTables();
            this.acHuffmanTables    = new PdfJsHuffmanTables();

            while (fileMarker.Marker != PdfJsJpegConstants.Markers.EOI)
            {
                // Get the marker length
                int remaining = this.ReadUint16() - 2;

                switch (fileMarker.Marker)
                {
                case PdfJsJpegConstants.Markers.APP0:
                    this.ProcessApplicationHeaderMarker(remaining);
                    break;

                case PdfJsJpegConstants.Markers.APP1:
                    this.ProcessApp1Marker(remaining, metaData);
                    break;

                case PdfJsJpegConstants.Markers.APP2:
                    this.ProcessApp2Marker(remaining, metaData);
                    break;

                case PdfJsJpegConstants.Markers.APP3:
                case PdfJsJpegConstants.Markers.APP4:
                case PdfJsJpegConstants.Markers.APP5:
                case PdfJsJpegConstants.Markers.APP6:
                case PdfJsJpegConstants.Markers.APP7:
                case PdfJsJpegConstants.Markers.APP8:
                case PdfJsJpegConstants.Markers.APP9:
                case PdfJsJpegConstants.Markers.APP10:
                case PdfJsJpegConstants.Markers.APP11:
                case PdfJsJpegConstants.Markers.APP12:
                case PdfJsJpegConstants.Markers.APP13:
                    this.InputStream.Skip(remaining);
                    break;

                case PdfJsJpegConstants.Markers.APP14:
                    this.ProcessApp14Marker(remaining);
                    break;

                case PdfJsJpegConstants.Markers.APP15:
                case PdfJsJpegConstants.Markers.COM:
                    this.InputStream.Skip(remaining);
                    break;

                case PdfJsJpegConstants.Markers.DQT:
                    this.ProcessDefineQuantizationTablesMarker(remaining);
                    break;

                case PdfJsJpegConstants.Markers.SOF0:
                case PdfJsJpegConstants.Markers.SOF1:
                case PdfJsJpegConstants.Markers.SOF2:
                    this.ProcessStartOfFrameMarker(remaining, fileMarker);
                    break;

                case PdfJsJpegConstants.Markers.DHT:
                    this.ProcessDefineHuffmanTablesMarker(remaining);
                    break;

                case PdfJsJpegConstants.Markers.DRI:
                    this.ProcessDefineRestartIntervalMarker(remaining);
                    break;

                case PdfJsJpegConstants.Markers.SOS:
                    this.ProcessStartOfScanMarker();
                    break;
                }

                // Read on.
                fileMarker = FindNextFileMarker(this.markerBuffer, this.InputStream);
            }

            this.ImageWidth  = this.Frame.SamplesPerLine;
            this.ImageHeight = this.Frame.Scanlines;
            this.components  = new PdfJsComponentBlocks {
                Components = new PdfJsComponent[this.Frame.ComponentCount]
            };

            for (int i = 0; i < this.components.Components.Length; i++)
            {
                PdfJsFrameComponent frameComponent = this.Frame.Components[i];
                var component = new PdfJsComponent
                {
                    Scale = new System.Numerics.Vector2(
                        frameComponent.HorizontalSamplingFactor / (float)this.Frame.MaxHorizontalFactor,
                        frameComponent.VerticalSamplingFactor / (float)this.Frame.MaxVerticalFactor),
                    BlocksPerLine   = frameComponent.WidthInBlocks,
                    BlocksPerColumn = frameComponent.HeightInBlocks
                };

                // this.QuantizeAndInverseComponentData(ref component, frameComponent);
                this.components.Components[i] = component;
            }

            this.NumberOfComponents = this.components.Components.Length;
        }
Пример #3
0
 private static int GetBlockBufferOffset(ref PdfJsComponent component, int row, int col)
 {
     return(64 * (((component.BlocksPerLine + 1) * row) + col));
 }