Results 1 to 3 of 3
Thread: Writing Exif Metadata to JPEG
- 02-04-2010, 06:21 PM #1
Member
- Join Date
- Feb 2010
- Posts
- 2
- Rep Power
- 0
Writing Exif Metadata to JPEG
Hello,
I want to write Metadata to a JPEg image using the Exif 'XPComment' field.
Because the standart Java libraries does not support writing metadata I tried using the JAI (Java Advanced Imaging) and Sanselan (Commons Sanselan - Commons ) but I was not able to find an example or something else which helps me to create a working code.
Does anybody know how I can do this?
- 02-05-2010, 01:07 AM #2
Sanselan: a Pure-Java Image Library.
which is really now
http://commons.apache.org/sanselan/
- 02-05-2010, 02:58 PM #3
Member
- Join Date
- Feb 2010
- Posts
- 2
- Rep Power
- 0
I know that and I tried to create some code which can write comments. But it fails writing the XPComment. It supports the UserCommet field (if you replace the used Variables).
My code is:
I get the following output:Java Code:import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import org.apache.sanselan.ImageReadException; import org.apache.sanselan.ImageWriteException; import org.apache.sanselan.Sanselan; import org.apache.sanselan.common.IImageMetadata; import org.apache.sanselan.formats.jpeg.JpegImageMetadata; import org.apache.sanselan.formats.jpeg.exifRewrite.ExifRewriter; import org.apache.sanselan.formats.tiff.TiffField; import org.apache.sanselan.formats.tiff.TiffImageMetadata; import org.apache.sanselan.formats.tiff.constants.ExifTagConstants; import org.apache.sanselan.formats.tiff.constants.TagInfo; import org.apache.sanselan.formats.tiff.constants.TiffConstants; import org.apache.sanselan.formats.tiff.constants.TiffFieldTypeConstants; import org.apache.sanselan.formats.tiff.write.TiffOutputDirectory; import org.apache.sanselan.formats.tiff.write.TiffOutputField; import org.apache.sanselan.formats.tiff.write.TiffOutputSet; public class Test2 { private static TiffField t; /** * Read metadata from image file and display it. * @param file */ public static void readMetaData(File file) { IImageMetadata metadata = null; try { metadata = Sanselan.getMetadata(file); } catch (ImageReadException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } if (metadata instanceof JpegImageMetadata) { JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata; System.out.println("\nFile: " + file.getPath()); printTagValue(jpegMetadata, TiffConstants.TIFF_TAG_XRESOLUTION); printTagValue(jpegMetadata, TiffConstants.TIFF_TAG_DATE_TIME); printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_DATE_TIME_ORIGINAL); printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_CREATE_DATE); printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_ISO); printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_SHUTTER_SPEED_VALUE); printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_APERTURE_VALUE); printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_BRIGHTNESS_VALUE); // simple interface to GPS data TiffImageMetadata exifMetadata = jpegMetadata.getExif(); if (exifMetadata != null) { try { TiffImageMetadata.GPSInfo gpsInfo = exifMetadata.getGPS(); if (null != gpsInfo) { double longitude = gpsInfo.getLongitudeAsDegreesEast(); double latitude = gpsInfo.getLatitudeAsDegreesNorth(); System.out.println(" " + "GPS Description: " + gpsInfo); System.out.println(" " + "GPS Longitude (Degrees East): " + longitude); System.out.println(" " + "GPS Latitude (Degrees North): " + latitude); } } catch (ImageReadException e) { e.printStackTrace(); } } System.out.println("EXIF items -"); ArrayList<?> items = jpegMetadata.getItems(); for (int i = 0; i < items.size(); i++) { Object item = items.get(i); System.out.println(item.getClass()); System.out.println(((TiffImageMetadata.Item)item).getTiffField()); t =((TiffImageMetadata.Item)item).getTiffField(); System.out.println(" " + "item: " + item); } System.out.println(); } } private static void printTagValue( JpegImageMetadata jpegMetadata, TagInfo tagInfo) { TiffField field = jpegMetadata.findEXIFValue(tagInfo); if (field == null) { System.out.println(tagInfo.name + ": " + "Not Found."); } else { System.out.println(tagInfo.name + ": " + field.getValueDescription()); } } /** * Example of adding an EXIF item to metadata, in this case using ImageHistory field. * (I have no idea if this is an appropriate use of ImageHistory, or not, just picked * a field to update that looked like it wasn't commonly mucked with.) * @param file */ public static void addImageHistoryTag(File file) { File dst = null; IImageMetadata metadata = null; JpegImageMetadata jpegMetadata = null; TiffImageMetadata exif = null; OutputStream os = null; TiffOutputSet outputSet = new TiffOutputSet(); // establish metadata try { metadata = Sanselan.getMetadata(file); } catch (ImageReadException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // establish jpegMedatadata if (metadata != null) { jpegMetadata = (JpegImageMetadata) metadata; } // establish exif if (jpegMetadata != null) { exif = jpegMetadata.getExif(); } // establish outputSet if (exif != null) { try { outputSet = exif.getOutputSet(); } catch (ImageWriteException e) { e.printStackTrace(); } } if (outputSet != null) { // check if field already EXISTS - if so remove TiffOutputField imageHistoryPre = outputSet .findField(TiffConstants.EXIF_TAG_XPCOMMENT); if (imageHistoryPre != null) { System.out.println("REMOVE"); outputSet.removeField(TiffConstants.EXIF_TAG_XPCOMMENT); } // add field try { String fieldData = "Hallo"; TiffOutputField imageHistory = new TiffOutputField( TiffConstants.EXIF_TAG_XPCOMMENT, TiffFieldTypeConstants.FIELD_TYPE_BYTE, fieldData.length(), fieldData.getBytes()); // TiffOutputDirectory exifDirectory = outputSet.getOrCreateExifDirectory(); exifDirectory.add(imageHistory); } catch (ImageWriteException e) { e.printStackTrace(); } } try { dst = new File("Hallo.jpg"); os = new FileOutputStream(dst); os = new BufferedOutputStream(os); } catch (IOException e) { e.printStackTrace(); } // write/update EXIF metadata to output stream try { new ExifRewriter().updateExifMetadataLossless(file, os, outputSet); } catch (ImageReadException e) { e.printStackTrace(); } catch (ImageWriteException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (os != null) { try { os.close(); } catch (IOException e) { } } } // file.delete(); // dst.renameTo(file); } public static void main(String[] args) { readMetaData(new File ("Adler (2).jpg")); addImageHistoryTag(new File ("Adler (2).jpg")); readMetaData(new File ("Hallo.jpg")); } }
You see that the knew image also includes a 0x9c9c tag, but this is why ever "Unknown" and windows also not show it.File: Adler (2).jpg
XResolution: 1
Date Time: Not Found.
Date Time Original: Not Found.
Create Date: Not Found.
ISO: Not Found.
Shutter Speed Value: Not Found.
Aperture Value: Not Found.
Brightness Value: Not Found.
EXIF items -
class org.apache.sanselan.formats.tiff.TiffImageMetadata $Item
282 (0x11a: XResolution): 1 (1 Rational)
item: XResolution: 1
class org.apache.sanselan.formats.tiff.TiffImageMetadata $Item
283 (0x11b: YResolution): 1 (1 Rational)
item: YResolution: 1
class org.apache.sanselan.formats.tiff.TiffImageMetadata $Item
296 (0x128: Resolution Unit): 1 (1 Short)
item: Resolution Unit: 1
class org.apache.sanselan.formats.tiff.TiffImageMetadata $Item
531 (0x213: YCbCr Positioning): 1 (1 Short)
item: YCbCr Positioning: 1
class org.apache.sanselan.formats.tiff.TiffImageMetadata $Item
40092 (0x9c9c: XPComment): 104, 0, 103, 0, 102, 0, 0, 0 (8 Byte)
item: XPComment: 104, 0, 103, 0, 102, 0, 0, 0
REMOVE
File: Hallo.jpg
XResolution: 1
Date Time: Not Found.
Date Time Original: Not Found.
Create Date: Not Found.
ISO: Not Found.
Shutter Speed Value: Not Found.
Aperture Value: Not Found.
Brightness Value: Not Found.
EXIF items -
class org.apache.sanselan.formats.tiff.TiffImageMetadata $Item
282 (0x11a: XResolution): 1 (1 Rational)
item: XResolution: 1
class org.apache.sanselan.formats.tiff.TiffImageMetadata $Item
283 (0x11b: YResolution): 1 (1 Rational)
item: YResolution: 1
class org.apache.sanselan.formats.tiff.TiffImageMetadata $Item
296 (0x128: Resolution Unit): 1 (1 Short)
item: Resolution Unit: 1
class org.apache.sanselan.formats.tiff.TiffImageMetadata $Item
531 (0x213: YCbCr Positioning): 1 (1 Short)
item: YCbCr Positioning: 1
class org.apache.sanselan.formats.tiff.TiffImageMetadata $Item
34665 (0x8769: Exif Offset): 74 (1 Long)
item: Exif Offset: 74
class org.apache.sanselan.formats.tiff.TiffImageMetadata $Item
40092 (0x9c9c: Unknown Tag): 72, 97, 108, 108, 111 (5 Byte)
item: Unknown Tag (0x9c9c): 72, 97, 108, 108, 111
Similar Threads
-
This project needs to migrate WPT metadata
By Arthur Gardner in forum EclipseReplies: 5Last Post: 12-11-2009, 10:49 PM -
jpg metadata
By dinosoep in forum Java 2DReplies: 1Last Post: 11-20-2009, 03:11 PM -
How to use XML-based configuration metadata shortcuts
By Java Tip in forum Java TipReplies: 0Last Post: 03-30-2008, 10:06 AM -
JDO - defining the persistence using metadata
By Java Tip in forum Java TipReplies: 0Last Post: 03-17-2008, 07:50 AM -
Media Metadata
By soulspirit in forum Advanced JavaReplies: 0Last Post: 11-26-2007, 11:01 PM


LinkBack URL
About LinkBacks
Reply With Quote

Bookmarks