我將圖像存儲在數據庫中作爲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:流結束之前文件的幻數可以確定。 在com.drew.imaging.FileTypeDetector.detectFileType(FileTypeDetector.java:97)
以下的答案可能是你的興趣:如何讓用Java創建日期的圖片](http://stackoverflow.com/questions/83787/how-to-get -date-picture-created-in-java) – uniknow
或者:http://johnbokma.com/java/obtaining-image-metadata.html –
我試過這個庫。 '迭代器閱讀器= ImageIO.getImageReaders(inputStream); \t \t \t而(readers.hasNext()){...}' ** ** hasNext是** **假' –