From 24e5faee7531df14e1e233e93559984b79d40c22 Mon Sep 17 00:00:00 2001 From: orbiter Date: Fri, 12 Mar 2010 12:23:38 +0000 Subject: [PATCH] added exif parsing for jpg images git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@6745 6c8d7289-2bf4-0310-a012-ef5d649a1542 --- .classpath | 85 ++++---- lib/metadata-extractor-2.4.0-beta-1.License | 16 ++ lib/metadata-extractor-2.4.0-beta-1.jar | Bin 0 -> 90929 bytes source/net/yacy/document/TextParser.java | 1 - .../document/parser/images/bmpParser.java | 98 +-------- .../parser/images/genericImageParser.java | 199 ++++++++++++++---- 6 files changed, 219 insertions(+), 180 deletions(-) create mode 100644 lib/metadata-extractor-2.4.0-beta-1.License create mode 100644 lib/metadata-extractor-2.4.0-beta-1.jar diff --git a/.classpath b/.classpath index f8d0809a5..5094c4b77 100644 --- a/.classpath +++ b/.classpath @@ -1,42 +1,43 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/metadata-extractor-2.4.0-beta-1.License b/lib/metadata-extractor-2.4.0-beta-1.License new file mode 100644 index 000000000..15b62f428 --- /dev/null +++ b/lib/metadata-extractor-2.4.0-beta-1.License @@ -0,0 +1,16 @@ +/* + * This is public domain software - that is, you can do whatever you want + * with it, and include it software that is licensed under the GNU or the + * BSD license, or whatever other licence you choose, including proprietary + * closed source licenses. I do ask that you leave this header in tact. + * + * If you make modifications to this code that you think would benefit the + * wider community, please send me a copy and I'll post it on my site. + * + * If you make use of this code, I'd appreciate hearing about it. + * metadata_extractor [at] drewnoakes [dot] com + * Latest version of this software kept at + * http://drewnoakes.com/ + * + * Created by Darren Salomons & Drew Noakes. + */ diff --git a/lib/metadata-extractor-2.4.0-beta-1.jar b/lib/metadata-extractor-2.4.0-beta-1.jar new file mode 100644 index 0000000000000000000000000000000000000000..3720d649dd56d96f9351435dea7c2c921a0be050 GIT binary patch literal 90929 zcmd431#o1^&Ms(XW@ct)W@cu$nVIc2Gcz+YGjp4nneBF)ncC}_`|rPZ=gpn>_C;*$ zR@JGhh$B^|bR?zprA{eG1A{;T{P8#{iDCWo%YVH=etpV{stD3b%8Ah{e3795Kzuz9 z|3ZfH?_{!qa*|@A$|`iSVzQC-Py-AI0#5?J_r!1=7qwDto0UUpplTe+%wSh54~gb` zTW#gww+}oLoXu!22Q(LGXn)l;lqB*mbW`wPsI`s&vl+3kOsd}v}5q@-@rsuj3Cn{w40gU*rJ!I%{NS^QWYLPw|IB{-7{+G;#X}GQ@u;v#>EVv#>S$ z2XeH(Be%3S`6nLi|H$KP;^h4QbTDTNQ`3Lof&2HttPTHB807zf_Ae9qtMwrLJA;jh zv!St}v*Eu@=CAbVe@k!TZt?FD{FMpkKQsMLruX;5S=c)p{lgspez-rG{K+CtZm7RQ zteFxG{fs%WAgZ+`9U9}dpbA()sKkM=-PkdJSP6#5OcSgnTnB#@2~^sM7H>bHR<=-J z#a2*OXErICSGH)ydK#XqRzLZC(tfvdWl!G%S>^w};??`q<2G%V`@S=H0uXegk1LF! z7OxgRR}VnUMP;udPHv6aK!t-^$W`GG2?sl>f}`#rG+fPvcEAQ(8~@VGwY=x5xs`8( zc!@H-QqEDn_kh|rZ06hrXqU8?6w_(!f-Yy_o_LLiy3IaujfS~hv1h~exX*@aw{i`K z3(KJu?Y6IrwOxI{>s~uO^`_FL&(gsl5BUN-@GOXnKd>s~jo~(NjfjfBRF8<}B` zW#XYVIO<|OK+cjC|B^_>S6nC>wH@RDo4b6Cx%XBDle=J_n|AMktKWytD)YnJmsK@q z>DsUCy8_C0Nl`g*m_)1+79Ns`P*$1B=Z1({3XQp*QkRvz7W1kHd+&{!)0n|PtPtAKU#z%|{aiUet;~<=m`$`L$&GRq6tJ;b>==oKO*{A-gfDH> z6uO^8)-mg{RFwP;wN3512n73&4RZLC!>#cz&Ks>O*)#AkT^_j(v9~ud3YWvoqfwg0 zB2p<=TZtE>ksp>1B&~)d=j=hx%}85{L#n95&3k$Llr-n4A+-0g%pOY=^?@AnviyX#;!VZ@q#Gl4O+cEQ~% zh)k-RJZA({cJtizS!OwSTBc2tc2JmE#b!%tt)lHO)-TF(pgrV#?-yeT3Ai(CWA!+HC82>Db`MUqNV>ZoE+>N9T8>T_tJ!6e9 z+HZ>MI4vz;aAH}2B{zhq{A|}vARm}K!%&Z66Mgdb{eAK`%&7eA*U&tb`>9~xgHK@I zv3d<%Cu!5tZ4Gx@-PQVU+i7&kd$*2&zXll`Yd^5Mb)icd_0&5&C5l zHGu19Q3%nn)4=@O@3+WxEEMjDN0_?C;Hh3eZtkQR4Z|-XA zc{x;1>u7YVoYIVpEw!nEGP3qII?08A*{)Ucf9k0 z{!T1Aq?~1kt@grN+RB$aP1L}^9?f`WLA$Ybcp^!8wsI_kJ=#4<8k~Pf)NuWdt7@&8 zI_P*y*43q+e9Z<~i==fyglNsG0R_x{4eCp*mPD{{)U7OlR!r)RXEb5yyLIuq!;A9P z!JNhF2n4k@LqiukdK=is#fFDZx)Oc;CnVrOuP4$<7Cp0Ws=BIRKUz+Bz=(ng+zj!y zK(uRDu^yURi+z_Xju3+d%;j6_WqHuQ26oK$g-SWWoxbT>Umj7$Z7e*n0~ z2DZ7LT;GZ#AP*iGL4-piqs*zq$%88e?Ea+KUuTX99(aUm*qX7g5{mnj$F>J4bqG02 zhu1`vB+Pf?_6-e;48Rey2m&JG1(`Yd)%lAlnsxY@*%@)o%X-M; zhGUz;1P^6O^H)nC|W{Fc0@E`;WO!PS6fhkBj?M87P?Q0J_0|CSjroGW|%v z2z6uy{h|+X< z)b%f=XaoL}+UWjHZGWbPQeV}@-z96&DjP}*3Mjf~!AS_VqK73w5gFTI0Z>5OZ4nDX z;-=1AJj3_1kn=@}U?%SX{QctkK1Yx$rnBUD@6ddH`UacivJ_Co≪V-3^a?R#%NP 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

CT*6x7#f7F802; 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 b1JFMu2m&}Mfq*Cgzg_~Jc`gQ+?jZjMNPLQ^ literal 0 HcmV?d00001 diff --git a/source/net/yacy/document/TextParser.java b/source/net/yacy/document/TextParser.java index fab7e589f..7cec8e934 100644 --- a/source/net/yacy/document/TextParser.java +++ b/source/net/yacy/document/TextParser.java @@ -86,7 +86,6 @@ public final class TextParser { private static final Set denyExtension = new TreeSet(insensitiveCollator); static { - initParser(new bmpParser()); initParser(new bzipParser()); initParser(new csvParser()); initParser(new docParser()); diff --git a/source/net/yacy/document/parser/images/bmpParser.java b/source/net/yacy/document/parser/images/bmpParser.java index a7320ee6f..391fccdb9 100644 --- a/source/net/yacy/document/parser/images/bmpParser.java +++ b/source/net/yacy/document/parser/images/bmpParser.java @@ -25,27 +25,16 @@ package net.yacy.document.parser.images; import java.awt.image.BufferedImage; -import java.io.EOFException; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Set; import javax.imageio.ImageIO; -import net.yacy.document.AbstractParser; -import net.yacy.document.Document; -import net.yacy.document.Idiom; -import net.yacy.document.ParserException; -import net.yacy.document.parser.html.ImageEntry; -import net.yacy.kelondro.data.meta.DigestURI; import net.yacy.kelondro.logging.Log; -public class bmpParser extends AbstractParser implements Idiom { +public class bmpParser { // this is a implementation of http://de.wikipedia.org/wiki/Windows_Bitmap @@ -60,97 +49,12 @@ public class bmpParser extends AbstractParser implements Idiom { //private static int BI_RLE4 = 2; //private static int BI_BITFIELDS = 3; - //boolean debugmode = false; - - public static final Set SUPPORTED_MIME_TYPES = new HashSet(); - public static final Set SUPPORTED_EXTENSIONS = new HashSet(); - static { - SUPPORTED_EXTENSIONS.add("bmp"); - SUPPORTED_MIME_TYPES.add("image/bmp"); - } - - public bmpParser() { - super("BMP Image Parser"); - } - - public Set supportedMimeTypes() { - return SUPPORTED_MIME_TYPES; - } - - public Set supportedExtensions() { - return SUPPORTED_EXTENSIONS; - } public static final boolean isBMP(final byte[] source) { // check the file magic return (source != null) && (source.length >= 2) && (source[0] == 'B') && (source[1] == 'M'); } - @Override - public Document parse( - final DigestURI location, - final String mimeType, - final String documentCharset, - final InputStream sourceStream) throws ParserException, InterruptedException { - BufferedImage image = null; - try { - image = ImageIO.read(sourceStream); - } catch (final EOFException e) { - Log.logException(e); - throw new ParserException(e.getMessage(), location); - } catch (final IOException e) { - Log.logException(e); - throw new ParserException(e.getMessage(), location); - } - if (image == null) throw new ParserException("ImageIO returned NULL", location); - - // scan the image - int height = image.getHeight(); - int width = image.getWidth(); - /* - Raster raster = image.getData(); - int[] pixel = raster.getPixel(0, 0, (int[])null); - long[] average = new long[pixel.length]; - for (int i = 0; i < average.length; i++) average[i] = 0L; - int pc = 0; - for (int x = width / 4; x < 3 * width / 4; x = x + 2) { - for (int y = height / 4; y < 3 * height / 4; y = y + 2) { - pixel = raster.getPixel(x, y, pixel); - for (int i = 0; i < average.length; i++) average[i] += pixel[i]; - pc++; - } - } - */ - // get image properties - String [] propNames = image.getPropertyNames(); - if (propNames == null) propNames = new String[0]; - StringBuilder sb = new StringBuilder(propNames.length * 80); - for (String propName: propNames) { - sb.append(propName).append(" = ").append(image.getProperty(propName)).append(" .\n"); - } - - final HashSet languages = new HashSet(); - final HashMap anchors = new HashMap(); - final HashMap images = new HashMap(); - // add this image to the map of images - images.put(sb.toString(), new ImageEntry(location, "", width, height, -1)); - - return new Document( - location, - mimeType, - "UTF-8", - languages, - new String[]{}, // keywords - "", // title - "", // author - new String[]{}, // sections - "", // description - sb.toString().getBytes(), // content text - anchors, // anchors - images, - false); // images - } - public static IMAGEMAP parse(final byte[] source) { // read info-header final int bfOffBits = DWORD(source, FILEHEADER_offset + 10); diff --git a/source/net/yacy/document/parser/images/genericImageParser.java b/source/net/yacy/document/parser/images/genericImageParser.java index 83cec7fd5..f5f30947f 100644 --- a/source/net/yacy/document/parser/images/genericImageParser.java +++ b/source/net/yacy/document/parser/images/genericImageParser.java @@ -35,17 +35,30 @@ import java.io.IOException; import java.io.InputStream;import java.net.MalformedURLException; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.Set; import javax.imageio.ImageIO; +import com.drew.imaging.jpeg.JpegMetadataReader; +import com.drew.metadata.Directory; +import com.drew.metadata.Metadata; +import com.drew.metadata.MetadataException; +import com.drew.metadata.Tag; +import com.sun.image.codec.jpeg.ImageFormatException; +import com.sun.image.codec.jpeg.JPEGCodec; +import com.sun.image.codec.jpeg.JPEGDecodeParam; +import com.sun.image.codec.jpeg.JPEGImageDecoder; + import net.yacy.document.AbstractParser; import net.yacy.document.Document; import net.yacy.document.Idiom; import net.yacy.document.ParserException; import net.yacy.document.parser.html.ImageEntry; +import net.yacy.document.parser.images.bmpParser.IMAGEMAP; import net.yacy.kelondro.data.meta.DigestURI; import net.yacy.kelondro.logging.Log; +import net.yacy.kelondro.util.FileUtils; public class genericImageParser extends AbstractParser implements Idiom { @@ -61,9 +74,11 @@ public class genericImageParser extends AbstractParser implements Idiom { SUPPORTED_EXTENSIONS.add("jpg"); SUPPORTED_EXTENSIONS.add("jpeg"); SUPPORTED_EXTENSIONS.add("jpe"); + SUPPORTED_EXTENSIONS.add("bmp"); SUPPORTED_MIME_TYPES.add("image/png"); SUPPORTED_MIME_TYPES.add("image/gif"); SUPPORTED_MIME_TYPES.add("image/jpg"); + SUPPORTED_MIME_TYPES.add("image/bmp"); } public genericImageParser() { @@ -76,6 +91,119 @@ public class genericImageParser extends AbstractParser implements Idiom { final String mimeType, final String documentCharset, final InputStream sourceStream) throws ParserException, InterruptedException { + + ImageInfo ii = null; + String title = null; + String author = null; + String keywords = null; + String description = null; + if (mimeType.equals("image/bmp") || + location.getFileExtension().equals("bmp")) { + byte[] b; + try { + b = FileUtils.read(sourceStream); + } catch (IOException e) { + Log.logException(e); + throw new ParserException(e.getMessage(), location); + } + IMAGEMAP imap = bmpParser.parse(b); + ii = parseJavaImage(location, imap.getImage()); + } else if (mimeType.equals("image/jpg") || + location.getFileExtension().equals("jpg") || + location.getFileExtension().equals("jpeg") || + location.getFileExtension().equals("jpe")) { + // use the exif parser from + // http://www.drewnoakes.com/drewnoakes.com/code/exif/ + // javadoc is at: http://www.drewnoakes.com/drewnoakes.com/code/exif/javadoc/ + // a tutorial is at: http://www.drewnoakes.com/drewnoakes.com/code/exif/sampleUsage.html + JPEGImageDecoder jpegDecoder = JPEGCodec.createJPEGDecoder(sourceStream); + BufferedImage image = null; + try { + image = jpegDecoder.decodeAsBufferedImage(); + } catch (ImageFormatException e) { + Log.logException(e); + throw new ParserException(e.getMessage(), location); + } catch (IOException e) { + Log.logException(e); + throw new ParserException(e.getMessage(), location); + } + JPEGDecodeParam decodeParam = jpegDecoder.getJPEGDecodeParam(); + Metadata metadata = JpegMetadataReader.readMetadata(decodeParam); + ii = parseJavaImage(location, image); + + Iterator directories = (Iterator) metadata.getDirectoryIterator(); + HashMap props = new HashMap(); + while (directories.hasNext()) { + Directory directory = directories.next(); + Iterator tags = (Iterator) directory.getTagIterator(); + while (tags.hasNext()) { + Tag tag = tags.next(); + try { + props.put(tag.getTagName(), tag.getDescription()); + ii.info.append(tag.getTagName() + ": " + tag.getDescription() + " .\n"); + } catch (MetadataException e) { + Log.logException(e); + } + } + title = props.get("Image Description"); + if (title == null || title.length() == 0) title = props.get("Headline"); + if (title == null || title.length() == 0) title = props.get("Object Name"); + + author = props.get("Artist"); + if (author == null || author.length() == 0) author = props.get("Writer/Editor"); + if (author == null || author.length() == 0) author = props.get("By-line"); + if (author == null || author.length() == 0) author = props.get("Credit"); + if (author == null || author.length() == 0) author = props.get("Make"); + + keywords = props.get("Keywords"); + if (keywords == null || keywords.length() == 0) keywords = props.get("Category"); + if (keywords == null || keywords.length() == 0) keywords = props.get("Supplemental Category(s)"); + + description = props.get("Caption/Abstract"); + if (description == null || description.length() == 0) description = props.get("Country/Primary Location"); + if (description == null || description.length() == 0) description = props.get("Province/State"); + if (description == null || description.length() == 0) description = props.get("Copyright Notice"); + } + } else { + ii = parseJavaImage(location, sourceStream); + } + + final HashSet languages = new HashSet(); + final HashMap anchors = new HashMap(); + final HashMap images = new HashMap(); + // add this image to the map of images + String infoString = ii.info.toString(); + images.put(infoString, new ImageEntry(location, "", ii.width, ii.height, -1)); + + if (title == null) title = location.toNormalform(true, true); + + return new Document( + location, + mimeType, + "UTF-8", + languages, + keywords == null ? new String[]{} : keywords.split(keywords.indexOf(',') > 0 ? "," : " "), // keywords + title, // title + author == null ? location.getHost() : author, // author + new String[]{}, // sections + description == null ? "" : description, // description + infoString.getBytes(), // content text + anchors, // anchors + images, + false); // images + } + + public Set supportedMimeTypes() { + return SUPPORTED_MIME_TYPES; + } + + public Set supportedExtensions() { + return SUPPORTED_EXTENSIONS; + } + + public static ImageInfo parseJavaImage( + final DigestURI location, + final InputStream sourceStream) throws ParserException { BufferedImage image = null; try { image = ImageIO.read(sourceStream); @@ -87,10 +215,18 @@ public class genericImageParser extends AbstractParser implements Idiom { throw new ParserException(e.getMessage(), location); } if (image == null) throw new ParserException("ImageIO returned NULL", location); + return parseJavaImage(location, image); + } + + public static ImageInfo parseJavaImage( + final DigestURI location, + final BufferedImage image) throws ParserException { + ImageInfo ii = new ImageInfo(location); + ii.image = image; // scan the image - int height = image.getHeight(); - int width = image.getWidth(); + ii.height = ii.image.getHeight(); + ii.width = ii.image.getWidth(); /* Raster raster = image.getData(); int[] pixel = raster.getPixel(0, 0, (int[])null); @@ -106,53 +242,36 @@ public class genericImageParser extends AbstractParser implements Idiom { } */ // get image properties - String [] propNames = image.getPropertyNames(); + String [] propNames = ii.image.getPropertyNames(); if (propNames == null) propNames = new String[0]; - StringBuilder sb = new StringBuilder(propNames.length * 80); - sb.append("\n"); + ii.info.append("\n"); for (String propName: propNames) { - sb.append(propName).append(" = ").append(image.getProperty(propName)).append(" .\n"); + ii.info.append(propName).append(" = ").append(ii.image.getProperty(propName)).append(" .\n"); } // append also properties that we measured - sb.append("width").append(" = ").append(Integer.toString(width)).append(" .\n"); - sb.append("height").append(" = ").append(Integer.toString(height)).append(" .\n"); + ii.info.append("width").append(": ").append(Integer.toString(ii.width)).append(" .\n"); + ii.info.append("height").append(": ").append(Integer.toString(ii.height)).append(" .\n"); - final HashSet languages = new HashSet(); - final HashMap anchors = new HashMap(); - final HashMap images = new HashMap(); - // add this image to the map of images - images.put(sb.toString(), new ImageEntry(location, "", width, height, -1)); - - return new Document( - location, - mimeType, - "UTF-8", - languages, - new String[]{}, // keywords - "", // title - "", // author - new String[]{}, // sections - "", // description - sb.toString().getBytes(), // content text - anchors, // anchors - images, - false); // images - } -/* - * Document(final DigestURI location, final String mimeType, final String charset, final Set languages, - final String[] keywords, final String title, final String author, - final String[] sections, final String abstrct, - final Object text, final Map anchors, final HashMap images) {(non-Javadoc) - * @see net.yacy.document.Idiom#supportedMimeTypes() - */ - public Set supportedMimeTypes() { - return SUPPORTED_MIME_TYPES; + return ii; } - public Set supportedExtensions() { - return SUPPORTED_EXTENSIONS; + public static class ImageInfo { + public DigestURI location; + public BufferedImage image; + public StringBuilder info; + public int height; + public int width; + public ImageInfo(final DigestURI location) { + this.location = location; + this.image = null; + this.info = new StringBuilder(); + this.height = -1; + this.width = -1; + } } + + public static void main(final String[] args) { File image = new File(args[0]); genericImageParser parser = new genericImageParser();