Changeset 6127 in josm for trunk/src/com/drew/imaging/jpeg/JpegSegmentData.java
- Timestamp:
- 2013-08-09T18:05:11+02:00 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/com/drew/imaging/jpeg/JpegSegmentData.java
r4231 r6127 1 1 /* 2 * This is public domain software - that is, you can do whatever you want 3 * with it, and include it software that is licensed under the GNU or the 4 * BSD license, or whatever other licence you choose, including proprietary 5 * closed source licenses. I do ask that you leave this header in tact. 6 * 7 * If you make modifications to this code that you think would benefit the 8 * wider community, please send me a copy and I'll post it on my site. 9 * 10 * If you make use of this code, I'd appreciate hearing about it. 11 * drew@drewnoakes.com 12 * Latest version of this software kept at 13 * http://drewnoakes.com/ 2 * Copyright 2002-2012 Drew Noakes 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 * 16 * More information about this project is available at: 17 * 18 * http://drewnoakes.com/code/exif/ 19 * http://code.google.com/p/metadata-extractor/ 14 20 */ 15 21 package com.drew.imaging.jpeg; 22 23 import com.drew.lang.annotations.NotNull; 24 import com.drew.lang.annotations.Nullable; 16 25 17 26 import java.io.*; … … 22 31 /** 23 32 * Holds a collection of Jpeg data segments. This need not necessarily be all segments 24 * within the Jpeg. For example, it may be convenient to port aboutonly the non-image33 * within the Jpeg. For example, it may be convenient to store only the non-image 25 34 * segments when analysing (or serializing) metadata. 35 * <p/> 36 * Segments are keyed via their segment marker (a byte). Where multiple segments use the 37 * same segment marker, they will all be stored and available. 38 * 39 * @author Drew Noakes http://drewnoakes.com 26 40 */ 27 41 public class JpegSegmentData implements Serializable 28 42 { 29 static final long serialVersionUID = 7110175216435025451L;43 private static final long serialVersionUID = 7110175216435025451L; 30 44 31 45 /** A map of byte[], keyed by the segment marker */ 32 private final HashMap _segmentDataMap; 33 34 public JpegSegmentData() 35 { 36 _segmentDataMap = new HashMap(10); 37 } 38 39 public void addSegment(byte segmentMarker, byte[] segmentBytes) 40 { 41 List segmentList = getOrCreateSegmentList(segmentMarker); 46 @NotNull 47 private final HashMap<Byte, List<byte[]>> _segmentDataMap = new HashMap<Byte, List<byte[]>>(10); 48 49 /** 50 * Adds segment bytes to the collection. 51 * @param segmentMarker 52 * @param segmentBytes 53 */ 54 @SuppressWarnings({ "MismatchedQueryAndUpdateOfCollection" }) 55 public void addSegment(byte segmentMarker, @NotNull byte[] segmentBytes) 56 { 57 final List<byte[]> segmentList = getOrCreateSegmentList(segmentMarker); 42 58 segmentList.add(segmentBytes); 43 59 } 44 60 61 /** 62 * Gets the first Jpeg segment data for the specified marker. 63 * @param segmentMarker the byte identifier for the desired segment 64 * @return a byte[] containing segment data or null if no data exists for that segment 65 */ 66 @Nullable 45 67 public byte[] getSegment(byte segmentMarker) 46 68 { … … 48 70 } 49 71 72 /** 73 * Gets segment data for a specific occurrence and marker. Use this method when more than one occurrence 74 * of segment data for a given marker exists. 75 * @param segmentMarker identifies the required segment 76 * @param occurrence the zero-based index of the occurrence 77 * @return the segment data as a byte[], or null if no segment exists for the marker & occurrence 78 */ 79 @Nullable 50 80 public byte[] getSegment(byte segmentMarker, int occurrence) 51 81 { 52 final List segmentList = getSegmentList(segmentMarker);82 final List<byte[]> segmentList = getSegmentList(segmentMarker); 53 83 54 84 if (segmentList==null || segmentList.size()<=occurrence) 55 85 return null; 56 86 else 57 return (byte[]) segmentList.get(occurrence); 58 } 59 87 return segmentList.get(occurrence); 88 } 89 90 /** 91 * Returns all instances of a given Jpeg segment. If no instances exist, an empty sequence is returned. 92 * 93 * @param segmentMarker a number which identifies the type of Jpeg segment being queried 94 * @return zero or more byte arrays, each holding the data of a Jpeg segment 95 */ 96 @NotNull 97 public Iterable<byte[]> getSegments(byte segmentMarker) 98 { 99 final List<byte[]> segmentList = getSegmentList(segmentMarker); 100 return segmentList==null ? new ArrayList<byte[]>() : segmentList; 101 } 102 103 @Nullable 104 public List<byte[]> getSegmentList(byte segmentMarker) 105 { 106 return _segmentDataMap.get(Byte.valueOf(segmentMarker)); 107 } 108 109 @NotNull 110 private List<byte[]> getOrCreateSegmentList(byte segmentMarker) 111 { 112 List<byte[]> segmentList; 113 if (_segmentDataMap.containsKey(segmentMarker)) { 114 segmentList = _segmentDataMap.get(segmentMarker); 115 } else { 116 segmentList = new ArrayList<byte[]>(); 117 _segmentDataMap.put(segmentMarker, segmentList); 118 } 119 return segmentList; 120 } 121 122 /** 123 * Returns the count of segment data byte arrays stored for a given segment marker. 124 * @param segmentMarker identifies the required segment 125 * @return the segment count (zero if no segments exist). 126 */ 60 127 public int getSegmentCount(byte segmentMarker) 61 128 { 62 final List segmentList = getSegmentList(segmentMarker); 63 if (segmentList==null) 64 return 0; 65 else 66 return segmentList.size(); 67 } 68 129 final List<byte[]> segmentList = getSegmentList(segmentMarker); 130 return segmentList == null ? 0 : segmentList.size(); 131 } 132 133 /** 134 * Removes a specified instance of a segment's data from the collection. Use this method when more than one 135 * occurrence of segment data for a given marker exists. 136 * @param segmentMarker identifies the required segment 137 * @param occurrence the zero-based index of the segment occurrence to remove. 138 */ 139 @SuppressWarnings({ "MismatchedQueryAndUpdateOfCollection" }) 69 140 public void removeSegmentOccurrence(byte segmentMarker, int occurrence) 70 141 { 71 final List segmentList = (List)_segmentDataMap.get(new Byte(segmentMarker));142 final List<byte[]> segmentList = _segmentDataMap.get(Byte.valueOf(segmentMarker)); 72 143 segmentList.remove(occurrence); 73 144 } 74 145 146 /** 147 * Removes all segments from the collection having the specified marker. 148 * @param segmentMarker identifies the required segment 149 */ 75 150 public void removeSegment(byte segmentMarker) 76 151 { 77 _segmentDataMap.remove(new Byte(segmentMarker)); 78 } 79 80 private List getSegmentList(byte segmentMarker) 81 { 82 return (List)_segmentDataMap.get(new Byte(segmentMarker)); 83 } 84 85 private List getOrCreateSegmentList(byte segmentMarker) 86 { 87 List segmentList; 88 Byte key = new Byte(segmentMarker); 89 if (_segmentDataMap.containsKey(key)) { 90 segmentList = (List)_segmentDataMap.get(key); 91 } else { 92 segmentList = new ArrayList(); 93 _segmentDataMap.put(key, segmentList); 94 } 95 return segmentList; 96 } 97 152 _segmentDataMap.remove(Byte.valueOf(segmentMarker)); 153 } 154 155 /** 156 * Determines whether data is present for a given segment marker. 157 * @param segmentMarker identifies the required segment 158 * @return true if data exists, otherwise false 159 */ 98 160 public boolean containsSegment(byte segmentMarker) 99 161 { 100 return _segmentDataMap.containsKey(new Byte(segmentMarker)); 101 } 102 103 public static void ToFile(File file, JpegSegmentData segmentData) throws IOException 104 { 105 ObjectOutputStream outputStream = null; 162 return _segmentDataMap.containsKey(Byte.valueOf(segmentMarker)); 163 } 164 165 /** 166 * Serialises the contents of a JpegSegmentData to a file. 167 * @param file to file to write from 168 * @param segmentData the data to write 169 * @throws IOException if problems occur while writing 170 */ 171 public static void toFile(@NotNull File file, @NotNull JpegSegmentData segmentData) throws IOException 172 { 173 FileOutputStream fileOutputStream = null; 106 174 try 107 175 { 108 outputStream = new ObjectOutputStream(new FileOutputStream(file));109 outputStream.writeObject(segmentData);176 fileOutputStream = new FileOutputStream(file); 177 new ObjectOutputStream(fileOutputStream).writeObject(segmentData); 110 178 } 111 179 finally 112 180 { 113 if (outputStream!=null) 114 outputStream.close(); 115 } 116 } 117 118 public static JpegSegmentData FromFile(File file) throws IOException, ClassNotFoundException 181 if (fileOutputStream!=null) 182 fileOutputStream.close(); 183 } 184 } 185 186 /** 187 * Deserialises the contents of a JpegSegmentData from a file. 188 * @param file the file to read from 189 * @return the JpegSegmentData as read 190 * @throws IOException if problems occur while reading 191 * @throws ClassNotFoundException if problems occur while deserialising 192 */ 193 @NotNull 194 public static JpegSegmentData fromFile(@NotNull File file) throws IOException, ClassNotFoundException 119 195 { 120 196 ObjectInputStream inputStream = null;
Note:
See TracChangeset
for help on using the changeset viewer.