Flutter

[Flutter] 카메라 및 사진 불러오기 기능 사용하기 . Part. 2

개발_블로그 2024. 12. 7. 15:24

Part.1 참고 바라겠습니다 .

 https://jangstory.tistory.com/169

 

 

 

 

오늘은 번외로 가져온 이미지의 용량을 줄이는 방법을 포스팅하겠습니다. 

 

 

0. pubspec.yaml  파일 추가 

 

flutter_image_compress: ^2.3.0

 

 

1. 파일 용량 줄이기 

1-1. 코드 추가

Future<String?> compressImage(File imageFile) async {
  final result = await FlutterImageCompress.compressAndGetFile(
    imageFile.absolute.path,
    imageFile.absolute.path
        .replaceFirst(RegExp(r'\.jpg$'), '_compressed.jpg'),
    quality: 85, // 품질 조정
  );
  return result?.path; // 압축된 이미지 경로 반환
}

 

 

 

1-2. 기존  _pickImage() , _takePhoto() 코드 변경 

 

Future<void> _pickImage() async {
  // 권한 요청
  var status = await Permission.photos.status;

  if (!status.isGranted) {
    _showPermissionDeniedAlert(true);
    return;
  }
  // 이미지 선택
  final ImagePicker _picker = ImagePicker();
  final XFile? pickedFile =
  await _picker.pickImage(source: ImageSource.gallery);

  if (pickedFile != null) {
    String? compressedPath = await compressImage(File(pickedFile.path));
    setState(() {
      imagePath = compressedPath; // 압축된 이미지의 경로 저장
    });
  }
}

Future<void> _takePhoto() async {
  // 카메라 권한 요청
  var status = await Permission.camera.status;
  if (!status.isGranted) {
    _showPermissionDeniedAlert(false);
    return;
  }

  // 사진 촬영
  final ImagePicker _picker = ImagePicker();
  final XFile? takenFile =
  await _picker.pickImage(source: ImageSource.camera);

  if (takenFile != null) {
    String? compressedPath = await compressImage(File(takenFile.path));
    setState(() {
      imagePath = compressedPath; // 압축된 이미지의 경로 저장
    });
  }
}

 

 

 

2. 이미지 용량 확인하기 . 

 

2-1. 코드 추가 

String _formatBytes(int bytes, {int decimalPlaces = 2}) {
  if (bytes <= 0) return '0 Bytes';
  const units = ['Bytes', 'KB', 'MB', 'GB'];
  final i = (log(bytes) / log(1024)).floor();
  return '${(bytes / pow(1024, i)).toStringAsFixed(decimalPlaces)} ${units[i]}';
}

 

 

2-2. 용량 확인 

if (takenFile != null) {
  String? compressedPath = await compressImage(File(takenFile.path));
  setState(() {
    imagePath = compressedPath; // 압축된 이미지의 경로 저장
  });

  final file = File(compressedPath!);
  final sizeInBytes = await file.length();
  final imageSize = _formatBytes(sizeInBytes);
  print("imageSize $imageSize");
}

 

 

 

이상입니다.