Ignore:
Timestamp:
2015-03-10T01:17:39+01:00 (11 years ago)
Author:
Don-vip
Message:

fix #11162 - update to metadata-extractor 2.7.2

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/com/drew/metadata/jpeg/JpegReader.java

    r6127 r8132  
    11/*
    2  * Copyright 2002-2012 Drew Noakes
     2 * Copyright 2002-2015 Drew Noakes
    33 *
    44 *    Licensed under the Apache License, Version 2.0 (the "License");
     
    1616 * More information about this project is available at:
    1717 *
    18  *    http://drewnoakes.com/code/exif/
    19  *    http://code.google.com/p/metadata-extractor/
     18 *    https://drewnoakes.com/code/exif/
     19 *    https://github.com/drewnoakes/metadata-extractor
    2020 */
    2121package com.drew.metadata.jpeg;
    2222
    23 import com.drew.lang.BufferBoundsException;
    24 import com.drew.lang.BufferReader;
     23import com.drew.imaging.jpeg.JpegSegmentMetadataReader;
     24import com.drew.imaging.jpeg.JpegSegmentType;
     25import com.drew.lang.SequentialByteArrayReader;
     26import com.drew.lang.SequentialReader;
    2527import com.drew.lang.annotations.NotNull;
    2628import com.drew.metadata.Metadata;
    27 import com.drew.metadata.MetadataReader;
     29
     30import java.io.IOException;
     31import java.util.Arrays;
    2832
    2933/**
    30  * Decodes Jpeg SOF0 data, populating a <code>Metadata</code> object with tag values in a <code>JpegDirectory</code>.
     34 * Decodes JPEG SOFn data, populating a {@link Metadata} object with tag values in a {@link JpegDirectory}.
    3135 *
    32  * @author Darrell Silver http://www.darrellsilver.com and Drew Noakes http://drewnoakes.com
     36 * @author Drew Noakes https://drewnoakes.com
     37 * @author Darrell Silver http://www.darrellsilver.com
    3338 */
    34 public class JpegReader implements MetadataReader
     39public class JpegReader implements JpegSegmentMetadataReader
    3540{
    36     /**
    37      * Performs the Jpeg data extraction, adding found values to the specified
    38      * instance of <code>Metadata</code>.
    39      */
    40     public void extract(@NotNull final BufferReader reader, @NotNull Metadata metadata)
     41    @NotNull
     42    public Iterable<JpegSegmentType> getSegmentTypes()
    4143    {
     44        // NOTE that some SOFn values do not exist
     45        return Arrays.asList(
     46            JpegSegmentType.SOF0,
     47            JpegSegmentType.SOF1,
     48            JpegSegmentType.SOF2,
     49            JpegSegmentType.SOF3,
     50//            JpegSegmentType.SOF4,
     51            JpegSegmentType.SOF5,
     52            JpegSegmentType.SOF6,
     53            JpegSegmentType.SOF7,
     54            JpegSegmentType.SOF8,
     55            JpegSegmentType.SOF9,
     56            JpegSegmentType.SOF10,
     57            JpegSegmentType.SOF11,
     58//            JpegSegmentType.SOF12,
     59            JpegSegmentType.SOF13,
     60            JpegSegmentType.SOF14,
     61            JpegSegmentType.SOF15
     62        );
     63    }
     64
     65    public boolean canProcess(@NotNull byte[] segmentBytes, @NotNull JpegSegmentType segmentType)
     66    {
     67        return true;
     68    }
     69
     70    public void extract(@NotNull byte[] segmentBytes, @NotNull Metadata metadata, @NotNull JpegSegmentType segmentType)
     71    {
     72        if (metadata.containsDirectory(JpegDirectory.class)) {
     73            // If this directory is already present, discontinue this operation.
     74            // We only store metadata for the *first* matching SOFn segment.
     75            return;
     76        }
     77
    4278        JpegDirectory directory = metadata.getOrCreateDirectory(JpegDirectory.class);
    4379
     80        // The value of TAG_COMPRESSION_TYPE is determined by the segment type found
     81        directory.setInt(JpegDirectory.TAG_COMPRESSION_TYPE, segmentType.byteValue - JpegSegmentType.SOF0.byteValue);
     82
     83        SequentialReader reader = new SequentialByteArrayReader(segmentBytes);
     84
    4485        try {
    45             // data precision
    46             int dataPrecision = reader.getUInt8(JpegDirectory.TAG_JPEG_DATA_PRECISION);
    47             directory.setInt(JpegDirectory.TAG_JPEG_DATA_PRECISION, dataPrecision);
    48 
    49             // process height
    50             int height = reader.getUInt16(JpegDirectory.TAG_JPEG_IMAGE_HEIGHT);
    51             directory.setInt(JpegDirectory.TAG_JPEG_IMAGE_HEIGHT, height);
    52 
    53             // process width
    54             int width = reader.getUInt16(JpegDirectory.TAG_JPEG_IMAGE_WIDTH);
    55             directory.setInt(JpegDirectory.TAG_JPEG_IMAGE_WIDTH, width);
    56 
    57             // number of components
    58             int numberOfComponents = reader.getUInt8(JpegDirectory.TAG_JPEG_NUMBER_OF_COMPONENTS);
    59             directory.setInt(JpegDirectory.TAG_JPEG_NUMBER_OF_COMPONENTS, numberOfComponents);
     86            directory.setInt(JpegDirectory.TAG_DATA_PRECISION, reader.getUInt8());
     87            directory.setInt(JpegDirectory.TAG_IMAGE_HEIGHT, reader.getUInt16());
     88            directory.setInt(JpegDirectory.TAG_IMAGE_WIDTH, reader.getUInt16());
     89            short componentCount = reader.getUInt8();
     90            directory.setInt(JpegDirectory.TAG_NUMBER_OF_COMPONENTS, componentCount);
    6091
    6192            // for each component, there are three bytes of data:
     
    6394            // 2 - Sampling factors: bit 0-3 vertical, 4-7 horizontal
    6495            // 3 - Quantization table number
    65             int offset = 6;
    66             for (int i = 0; i < numberOfComponents; i++) {
    67                 int componentId = reader.getUInt8(offset++);
    68                 int samplingFactorByte = reader.getUInt8(offset++);
    69                 int quantizationTableNumber = reader.getUInt8(offset++);
    70                 JpegComponent component = new JpegComponent(componentId, samplingFactorByte, quantizationTableNumber);
    71                 directory.setObject(JpegDirectory.TAG_JPEG_COMPONENT_DATA_1 + i, component);
     96            for (int i = 0; i < (int)componentCount; i++) {
     97                final int componentId = reader.getUInt8();
     98                final int samplingFactorByte = reader.getUInt8();
     99                final int quantizationTableNumber = reader.getUInt8();
     100                final JpegComponent component = new JpegComponent(componentId, samplingFactorByte, quantizationTableNumber);
     101                directory.setObject(JpegDirectory.TAG_COMPONENT_DATA_1 + i, component);
    72102            }
    73103
    74         } catch (BufferBoundsException ex) {
     104        } catch (IOException ex) {
    75105            directory.addError(ex.getMessage());
    76106        }
Note: See TracChangeset for help on using the changeset viewer.