💾

[flutter] exifデータを利用して画像から日付を取得する

2021/05/13に公開約3,000字

概要

タイトルの通りなので、特にありません🤖

やり方

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

ログインするとコメントできます