イメージはデータベースに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:それは、によって引き起こさ
を言うファイルのマジックナンバーが決定される前にストリームが終了しました。 研究およびデバッグした後
次の答えはあなたに興味がある可能性があります(http://stackoverflow.com/questions/83787/how-to-get [Javaで作成された日付の画像を取得する方法] -date-picture-in-java) – uniknow
またはhttp://johnbokma.com/java/obaging-image-metadata.html –
このライブラリを試しました。 'Iteratorリーダー= ImageIO.getImageReaders(inputStream); \t \t \t一方(readers.hasNext()){...} ' は**のhasNext **にBufferedInputStream のinstanceof **偽** –