Changeset 8132 in josm for trunk/src/com/drew/metadata/jpeg/JpegReader.java
- Timestamp:
- 2015-03-10T01:17:39+01:00 (11 years ago)
- File:
-
- 1 edited
-
trunk/src/com/drew/metadata/jpeg/JpegReader.java (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/com/drew/metadata/jpeg/JpegReader.java
r6127 r8132 1 1 /* 2 * Copyright 2002-201 2Drew Noakes2 * Copyright 2002-2015 Drew Noakes 3 3 * 4 4 * Licensed under the Apache License, Version 2.0 (the "License"); … … 16 16 * More information about this project is available at: 17 17 * 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 20 20 */ 21 21 package com.drew.metadata.jpeg; 22 22 23 import com.drew.lang.BufferBoundsException; 24 import com.drew.lang.BufferReader; 23 import com.drew.imaging.jpeg.JpegSegmentMetadataReader; 24 import com.drew.imaging.jpeg.JpegSegmentType; 25 import com.drew.lang.SequentialByteArrayReader; 26 import com.drew.lang.SequentialReader; 25 27 import com.drew.lang.annotations.NotNull; 26 28 import com.drew.metadata.Metadata; 27 import com.drew.metadata.MetadataReader; 29 30 import java.io.IOException; 31 import java.util.Arrays; 28 32 29 33 /** 30 * Decodes J peg SOF0data, 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}. 31 35 * 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 33 38 */ 34 public class JpegReader implements MetadataReader 39 public class JpegReader implements JpegSegmentMetadataReader 35 40 { 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() 41 43 { 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 42 78 JpegDirectory directory = metadata.getOrCreateDirectory(JpegDirectory.class); 43 79 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 44 85 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); 60 91 61 92 // for each component, there are three bytes of data: … … 63 94 // 2 - Sampling factors: bit 0-3 vertical, 4-7 horizontal 64 95 // 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); 72 102 } 73 103 74 } catch ( BufferBoundsException ex) {104 } catch (IOException ex) { 75 105 directory.addError(ex.getMessage()); 76 106 }
Note:
See TracChangeset
for help on using the changeset viewer.
