Ich arbeite mit Camera 2 API und ich brauche Bild-Metadaten (genau ISO), bevor das Bild auf dem Gerät gespeichert wird.Wie kann ich Metadaten erhalten, bevor das Bild gespeichert wird?
In diesem Moment verwende ich ExifInterface
, aber Konstruktor dieser Klasse erhalten nur File
oder beginnen von api24 InputStream
.
Wie kann ich ISO von Bild erhalten, bevor es gespeichert wird?
EDIT
private final ImageReader.OnImageAvailableListener mOnImageAvailableListener
= new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(final ImageReader reader) {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... voids) {
new ImageSaver(context, reader.acquireNextImage()).writeImageToStorage();
return null;
}
}
}
};
public final class ImageSaver {
private Context context;
private static File imageFile;
private final Image image;
public ImageSaver(Context context, Image image) {
this.context = context;
this.image = image;
imageFile = getImageFile(UtilClass.getAvatarPhotosDirFile(context));
}
private File getImageFile(File path) {
return new File(path.getPath() + File.separator + getStamp() + ".jpeg");
}
public void writeImageToStorage() {
final ByteBuffer buffer = getByteBuffer();
final byte[] bytes = getBytes(buffer);
writeFile(imageFile, bytes);
}
@Nullable
private ByteBuffer getByteBuffer() {
ByteBuffer buffer = null;
if (image != null) {
buffer = image.getPlanes()[0].getBuffer();
}
return buffer;
}
private byte[] getBytes(ByteBuffer buffer) {
byte[] bytes = new byte[0];
if (buffer != null) {
bytes = new byte[buffer.remaining()];
}
if (buffer != null) {
buffer.get(bytes);
}
return bytes;
}
private void writeFile(File file, byte[] bytes) {
BufferedOutputStream bos = null;
try {
bos = new BufferedOutputStream(new FileOutputStream(file));
bos.write(bytes);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (image != null) {
image.close();
}
if (null != bos) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@NonNull
private String getStamp() {
final int pictureAmount = PreferencesHelper.getIntShared(context, States.PICTURE_AMOUNT) + 1;
String stamp;
switch (pictureAmount){
case 1:
stamp = "pose1";
break;
case 2:
stamp = "pose3";
break;
case 3:
stamp = "pose5";
break;
case 4:
stamp = "pose7";
break;
default:
stamp = "BG";
break;
}
return stamp;
}
public static String getImageFilePath() {
return imageFile.getPath();
}
}
Sie könnten zeigen, wie und wo Sie das Bild bekommen. In welcher Form? Und wie Sie es speichern. – greenapps
@greenapps hinzugefügt –
Viel zu vage. Bitte zeigen Sie auch, wie Sie ein 'Image' in Datei speichern. Sind Sie sicher, dass die Datei ein Exif enthält, wenn Sie dies tun? Was ist eine übliche Datei? Und wo ist der Exif im Bild? Wie könnte es einen enthalten? – greenapps