2016-04-18 4 views
1

イメージはデータベースにBase64でエンコードされた文字列として格納されています。私はこの文字列を読み込み、それをバイト配列にデコードして表示します。ここまでは順調ですね。イメージのバイトから作成日を取得します。

この画像についての追加情報も表示します。この画像が撮られた/作成されたとき、私は本当に気にします。

私はいくつかのアプローチを試みました。イメージがファイルシステムに存在する場合、問題はありません。しかし、私はエンコードされた文字列を読むとき、それをバイトにデコードし、問題が表示されます。

私はメタデータ抽出ライブラリを使用していました。

<dependency> 
     <groupId>com.drewnoakes</groupId> 
     <artifactId>metadata-extractor</artifactId> 
     <version>2.9.0</version> 
    </dependency> 



public void processData(String data) { 
    if (data == null || data.isEmpty()) { 
     return; 
    } 
    byte[] base64Decoded = DatatypeConverter.parseBase64Binary(data); 
    read(base64Decoded); 
    //displayImage(); 
    //displayImageInfo(); 
} 




public void read(byte [] data) { 
    try { 
     InputStream inputStream = new ByteArrayInputStream(data); 
     BufferedImage image = ImageIO.read(inputStream); 
     retrieveImageInfo(); 

     Metadata metadata = ImageMetadataReader.readMetadata(inputStream); 
     retrieveAdditiaonlInfo2(metadata); 
    } catch (Exception e) { 
     //throw new RuntimeException("Failed to read the image from bytes.", e); 
    } 
} 

private void retrieveImageInfo() { 
    imageWidth = (long) image.getWidth(); 
    imageHeight = (long) image.getHeight(); 
    imageSize = (long) data.length; 

} 

private void retrieveAdditiaonlInfo2(Metadata metadata) { 
    for (Directory directory : metadata.getDirectories()) { 
     for (Tag tag : directory.getTags()) { 
      System.out.format("[%s] - %s = %s", directory.getName(), tag.getTagName(), tag.getDescription()); 
      System.out.println(); 
     } 
     if (directory.hasErrors()) { 
      for (String error : directory.getErrors()) { 
       System.err.format("ERROR: %s", error); 
       System.err.println(); 
      } 
     } 
    } 
} 

これは、ファイルから読み取られた画像に適しています。しかし、私たちのデータベースではうまくいきません。 java.io.IOException:それは、によって引き起こさ

を言うファイルのマジックナンバーが決定される前にストリームが終了しました。 研究およびデバッグした後

enter image description here

+1

次の答えはあなたに興味がある可能性があります(http://stackoverflow.com/questions/83787/how-to-get [Javaで作成された日付の画像を取得する方法] -date-picture-in-java) – uniknow

+0

またはhttp://johnbokma.com/java/obaging-image-metadata.html –

+0

このライブラリを試しました。 'Iterator リーダー= ImageIO.getImageReaders(inputStream); \t \t \t一方(readers.hasNext()){...} ' は**のhasNext **にBufferedInputStream のinstanceof **偽** –

答えて

2

com.drew.imaging.FileTypeDetector.detectFileType(FileTypeDetector.java:97)で、私はこれを見つけました。 BufferedInputStreamが必要です!

 File imageFile = new File(filename); 
     Path path = imageFile.toPath(); 
     byte[] data = Files.readAllBytes(path); 

     String str = DatatypeConverter.printBase64Binary(data); 
     //Store encoded data. 
     //Retrieve encoded string from the database. 
     byte [] data2 = DatatypeConverter.parseBase64Binary(str); 

     InputStream inputStream = new ByteArrayInputStream(data2); 
     BufferedInputStream bis = new BufferedInputStream(inputStream); 
     Metadata metadata = ImageMetadataReader.readMetadata(bis); 

一つのことではなく、すべての画像は、(私が撮影した日時を必要とする)メタデータが含まれます。 ここにメタデータの2つの例があります。

[JPEG] - Compression Type = Baseline 
[JPEG] - Data Precision = 8 bits 
[JPEG] - Image Height = 758 pixels 
[JPEG] - Image Width = 1024 pixels 
[JPEG] - Number of Components = 3 
[JPEG] - Component 1 = Y component: Quantization table 0, Sampling factors 2 horiz/2 vert 
[JPEG] - Component 2 = Cb component: Quantization table 1, Sampling factors 1 horiz/1 vert 
[JPEG] - Component 3 = Cr component: Quantization table 1, Sampling factors 1 horiz/1 vert 
[JFIF] - Version = 1.1 
[JFIF] - Resolution Units = none 
[JFIF] - X Resolution = 1 dot 
[JFIF] - Y Resolution = 1 dot 
[JFIF] - Thumbnail Width Pixels = 0 
[JFIF] - Thumbnail Height Pixels = 0 

[JPEG] - Compression Type = Baseline 
[JPEG] - Data Precision = 8 bits 
[JPEG] - Image Height = 3104 pixels 
[JPEG] - Image Width = 4192 pixels 
[JPEG] - Number of Components = 3 
[JPEG] - Component 1 = Y component: Quantization table 0, Sampling factors 2 horiz/1 vert 
[JPEG] - Component 2 = Cb component: Quantization table 1, Sampling factors 1 horiz/1 vert 
[JPEG] - Component 3 = Cr component: Quantization table 1, Sampling factors 1 horiz/1 vert 
[Exif IFD0] - Software = Flyme 
[Exif IFD0] - Orientation = Top, left side (Horizontal/normal) 
[Exif IFD0] - Unknown tag (0x0224) = 1 
[Exif IFD0] - Unknown tag (0x0225) = 
[Exif IFD0] - Date/Time = 2016:04:13 10:20:08 
[Exif IFD0] - Model = m1 note       
[Exif IFD0] - Unknown tag (0x0222) = 0 
[Exif IFD0] - Unknown tag (0x0223) = 0 
[Exif IFD0] - Unknown tag (0x0220) = 0 
[Exif IFD0] - Unknown tag (0x0221) = 0 
[Exif IFD0] - Y Resolution = 72 dots per inch 
[Exif IFD0] - X Resolution = 72 dots per inch 
[Exif IFD0] - YCbCr Positioning = Datum point 
[Exif IFD0] - Resolution Unit = Inch 
[Exif IFD0] - Image Description =         
[Exif IFD0] - Make = Meizu       
[GPS] - GPS Img Direction = 49 degrees 
[GPS] - GPS Img Direction Ref = Magnetic direction 
[Exif SubIFD] - Date/Time Digitized = 2016:04:13 10:20:08 
[Exif SubIFD] - Color Space = sRGB 
[Exif SubIFD] - Date/Time Original = 2016:04:13 10:20:08 
[Exif SubIFD] - FlashPix Version = 1.00 
[Exif SubIFD] - Metering Mode = Center weighted average 
[Exif SubIFD] - Exposure Bias Value = 0 EV 
[Exif SubIFD] - Exif Image Height = 3104 pixels 
[Exif SubIFD] - Exif Version = 2.20 
[Exif SubIFD] - Exif Image Width = 4192 pixels 
[Exif SubIFD] - Focal Length = 3.8 mm 
[Exif SubIFD] - Digital Zoom Ratio = 1 
[Exif SubIFD] - White Balance = (Other) 
[Exif SubIFD] - Scene Capture Type = Standard 
[Exif SubIFD] - Flash = Flash did not fire 
[Exif SubIFD] - White Balance Mode = Auto white balance 
[Exif SubIFD] - Exposure Mode = Auto exposure 
[Exif SubIFD] - Exposure Time = 79999/1000000 sec 
[Exif SubIFD] - ISO Speed Ratings = 810 
[Exif SubIFD] - Components Configuration = YCbCr 
[Exif SubIFD] - F-Number = f/2.2 
[Exif SubIFD] - Exposure Program = Unknown (0) 
[Interoperability] - Interoperability Index = Recommended Exif Interoperability Rules (ExifR98) 
[Interoperability] - Interoperability Version = 1.00 
[Exif Thumbnail] - Orientation = Top, left side (Horizontal/normal) 
[Exif Thumbnail] - Compression = JPEG (old-style) 
[Exif Thumbnail] - Thumbnail Offset = 962 bytes 
[Exif Thumbnail] - YCbCr Positioning = Datum point 
[Exif Thumbnail] - Thumbnail Length = 0 bytes 
[Exif Thumbnail] - Y Resolution = 72 dots per inch 
[Exif Thumbnail] - Resolution Unit = Inch 
[Exif Thumbnail] - X Resolution = 72 dots per inch 
+0

'にBufferedInputStreamにBufferedInputStream = InputStreamのですか? (BufferedInputStreamを)InputStreamの :新しいBufferedInputStreamを(InputStreamの); ' 自動的' readMetadata'によって呼び出されます。それが実際の解決策であるかどうかは間違いありません。 – Anthony