💾
[flutter] exifデータを利用して画像から日付を取得する
概要
タイトルの通りなので、特にありません🤖
やり方
1:image_pickerパッケージのimagePicker()で画像を取得する
final picker = ImagePicker();
final pickedFile = await picker.getImage(source: ImageSource.gallery);
2:取得した画像からFileを生成する
pickedImage = File(pickedFile.path);
3:exifパッケージのreadExifFromBytes()でメタデータを取得する
final tags = await readExifFromBytes(await pickedImage.readAsBytes());
4:Map型になっているので、(変数)["Image DateTime"]で日付データを取り出す
String dateTime = tags["Image DateTime"].toString();
*他にもあらゆる種類のメタデータがあるので、print()で確認してみてください。
5:setStateでUIに反映
最後に全体のコードを掲載しておきます。
プロパティをフォルダ分けしている箇所もありますが、今回の動作には関係ないので気にしなくても大丈夫です。
import 'dart:io';
import 'package:exif/exif.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:question_answer/compornent/button_compornent.dart';
class ImagePick extends StatefulWidget {
_ImagePickState createState() => _ImagePickState();
}
class _ImagePickState extends State<ImagePick> {
final picker = ImagePicker();
File pickedImage;
String pickedDate;
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("image pick"),
),
body: Center(
child: Column(
children: [
_imageViewer(),
_dateViewer(),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
_imagePickerButton(),
_getExifFromImage()
],
)
],
),
)
);
}
Widget _imagePickerButton(){
return GestureDetector(
onTap: (){
_imagePickAndSave();
},
child: ButtonComponent.buttonContainer("画像取得")
);
}
Widget _dateViewer(){
return Container(
margin: EdgeInsets.symmetric(
vertical: 20
),
child: pickedDate != null
? Text("$pickedDate")
: Text("EXIFは未取得です")
);
}
void _imagePickAndSave() async {
print("ok");
// ①
final pickedFile = await picker.getImage(source: ImageSource.gallery);
setState(() {
// ②
pickedImage = File(pickedFile.path);
});
}
Widget _getExifFromImage(){
return GestureDetector(
onTap: () async{
// ③
final tags = await readExifFromBytes(await pickedImage.readAsBytes());
// ④
String dateTime = tags["Image DateTime"].toString();
// ⑤
setState(() {
pickedDate = dateTime;
});
},
child: ButtonComponent.buttonContainer("EXIF取得"),
);
}
Widget _imageViewer(){
return Container(
width: 200,
height: 200,
child: pickedImage != null
? Image.file(pickedImage)
: Text("No Image")
);
}
}
最後まで見ていただきありがとうございました✌️
Discussion