[flutter] 플러터에서의 사진 및 파일 처리 방법

플러터는 사진과 파일을 처리하기 위한 다양한 기능을 제공합니다. 사진을 가져오고 저장하는 방법부터 파일을 읽고 쓰는 방법에 이르기까지 다양한 기능들을 살펴보겠습니다.

1. 사진 가져오기

사진을 앱으로 가져오기 위해서는 image_picker 패키지를 사용할 수 있습니다. 이 패키지는 갤러리나 카메라에서 사진을 선택하고 가져올 수 있는 기능을 제공합니다. 아래는 image_picker 패키지를 사용하여 사진을 가져오는 예제 코드입니다.

import 'package:image_picker/image_picker.dart';
import 'package:flutter/cupertino.dart';

class MyImagePicker extends StatefulWidget {
  @override
  _MyImagePickerState createState() => _MyImagePickerState();
}

class _MyImagePickerState extends State<MyImagePicker> {
  final picker = ImagePicker();
  File? _image;

  Future getImage() async {
    final pickedFile = await picker.getImage(source: ImageSource.gallery);

    setState(() {
      if (pickedFile != null) {
        _image = File(pickedFile.path);
      } else {
        print('No image selected.');
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Picker'),
      ),
      body: Center(
        child: _image == null
            ? Text('No image selected.')
            : Image.file(_image!),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: getImage,
        tooltip: 'Pick Image',
        child: Icon(Icons.add_a_photo),
      ),
    );
  }
}

위의 예제 코드에서는 image_picker 패키지의 getImage 메서드를 통해 갤러리에서 사진을 선택하고 가져와서 _image 변수에 저장한 후에 화면에 보여주는 방식으로 동작합니다.

2. 사진 저장하기

사진을 플러터 앱 내부에 저장하기 위해서는 path_provider 패키지를 사용할 수 있습니다. 이 패키지는 파일 시스템의 경로를 얻는 기능을 제공합니다. 아래는 path_provider 패키지를 사용하여 사진을 저장하는 예제 코드입니다.

import 'package:path_provider/path_provider.dart';
import 'package:flutter/cupertino.dart';

class MyImageSaver extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    saveImage() async {
      final directory = await getApplicationDocumentsDirectory();
      final file = File('${directory.path}/image.jpg');
      final savedFile = await _image!.copy(file.path);

      print('Image saved: ${savedFile.path}');
    }

    return Scaffold(
      appBar: AppBar(
        title: Text('Image Saver'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: saveImage,
          child: Text('Save Image'),
        ),
      ),
    );
  }
}

위의 예제 코드에서는 path_provider 패키지의 getApplicationDocumentsDirectory 메서드를 통해 앱의 문서 디렉토리를 얻어와서 해당 디렉토리에 image.jpg 파일을 생성한 후에 _image 변수에 저장된 사진을 복사하여 저장하는 방식으로 동작합니다.

3. 파일 읽고 쓰기

파일을 읽고 쓰기 위해서는 dart:io 패키지를 사용할 수 있습니다. 이 패키지는 파일에 대한 다양한 작업을 처리할 수 있는 기능을 제공합니다. 예를 들어, 파일을 읽어서 내용을 출력하는 예제 코드는 아래와 같습니다.

import 'dart:io';

void main() {
  final file = File('path/to/file.txt');
  final contents = file.readAsStringSync();

  print('File contents: $contents');
}

위의 예제 코드에서는 File 클래스의 인스턴스를 생성한 후에 readAsStringSync 메서드를 호출하여 파일의 내용을 읽어와서 출력하고 있습니다. 이 외에도 writeAsString 메서드를 사용하여 파일에 내용을 쓰는 등 다양한 작업을 수행할 수 있습니다.

참고자료