코딩하는 제리

[Flutter/Project](Instagram Clone) 이미지 리사이징, Isolate 본문

Flutter/Project_InstaClone(완)

[Flutter/Project](Instagram Clone) 이미지 리사이징, Isolate

JerryCho 2021. 2. 23. 18:11

puzzleleaf.tistory.com/216?category=820503

 

[Dart] 비동기 프로그래밍 (Isolates, Event Loops, Future)

Flutter 유튜브 채널에 친절하게도 한글 자막이 달려있는 영상이 있다. 그중에서도 비동기 프로그래밍에 관한 영상이다. https://www.youtube.com/watch?v=vl_AaCgudcY Isolates 모든 Dart 코드가 실행되는 곳으로.

puzzleleaf.tistory.com

repo/helper/image_helper.dart -> 이미지 리사이징 후 jpg로 변환.
repo/image_network_repository.dart -> 작업 분산을 위한 isolate
share_post_screens.dart -> 해당 메서드 실행
줄어든 이미지 사이즈


소스코드 및 pubspec.yaml

image: ^2.1.4 추가

// repo/helper/image_helper.dart

import 'dart:io';

// image.dart 임포트.
import 'package:image/image.dart';

// 메서드를 실행하는 동안 앱의 멈춤 발생.
// 이를 해결하기 위해 isolate 사용.(image_network_repository.dart)
File getResizedImage(File originImage) {
  // 바이트로 읽어와 Image 오브젝트로 변경.
  Image image = decodeImage(originImage.readAsBytesSync());

  // 정사각형 300 사이즈로 변경
  Image reSizedImage = copyResizeCropSquare(image, 300);

  // 파일 확장자 변경 후 퀄리티 낮춤.
  File resizedFile =
      File(originImage.path.substring(0, originImage.path.length - 3) + "jpg");
  resizedFile.writeAsBytesSync(encodeJpg(reSizedImage, quality: 50));
  return resizedFile;
}
// repo/image_network_repository.dart

import 'dart:io';

import 'package:flutter/foundation.dart';
import 'package:flutter_project_IJ/repo/helper/image_helper.dart';

// isolate
class ImageNetworkRepository {
  Future<void> uploadImageNCreateNewPost(File originImage) async {
    try {
      // 메소드명만 입력.
      final File resized = await compute(getResizedImage, originImage);
      originImage
          .length()
          .then((value) => print('original image size: $value'));
      resized.length().then((value) => print('resized image size: $value'));
    } catch (e) {}
  }
}

ImageNetworkRepository imageNetworkRepository = ImageNetworkRepository();
Comments