본문 바로가기

Flutter & Dart

[Flutter] 이미지를 바이너리로 변환, 바이너리를 이미지로 변환

반응형

 

1. 이미지를 바이너리로 변환

import 'dart:io';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:http/http.dart' as http;

class ImageUploader extends StatefulWidget {
  @override
  _ImageUploaderState createState() => _ImageUploaderState();
}

class _ImageUploaderState extends State<ImageUploader> {
  File? _image;

  Future<void> _pickImage() async {
    final picker = ImagePicker();
    final pickedFile = await picker.pickImage(source: ImageSource.gallery);

    if (pickedFile != null) {
      setState(() {
        _image = File(pickedFile.path);
      });
    }
  }

  Future<void> _uploadImage() async {
    if (_image == null) return;

    // 이미지 파일을 바이너리로 변환
    final bytes = await _image!.readAsBytes();
    final base64Image = base64Encode(bytes);

    // API 호출
    final response = await http.post(
      Uri.parse('http://your-api-url.com/upload'),
      headers: {'Content-Type': 'application/json'},
      body: jsonEncode({'image': base64Image}),
    );

    if (response.statusCode == 200) {
      print('Image uploaded successfully!');
    } else {
      print('Failed to upload image: ${response.body}');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Image Uploader')),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          _image != null ? Image.file(_image!) : Text('No image selected'),
          ElevatedButton(
            onPressed: _pickImage,
            child: Text('Pick Image'),
          ),
          ElevatedButton(
            onPressed: _uploadImage,
            child: Text('Upload Image'),
          ),
        ],
      ),
    );
  }
}

 

 

2. 바이너리를 이미지로 변환

import 'dart:typed_data';
import 'package:flutter/material.dart';

class BinaryToImage extends StatelessWidget {
  // 예제용 바이너리 데이터 (서버에서 가져온 데이터가 이와 비슷한 형태로 제공됨)
  final Uint8List binaryData;

  BinaryToImage({required this.binaryData});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Binary to Image')),
      body: Center(
        child: binaryData.isNotEmpty
            ? Image.memory(binaryData) // 바이너리 데이터를 이미지로 표시
            : Text('No image data'),
      ),
    );
  }
}

void main() {
  runApp(MaterialApp(
    home: BinaryToImage(
      // 테스트용으로 Base64에서 변환한 Uint8List 데이터 전달
      binaryData: Uint8List.fromList(
        [137, 80, 78, 71, /* ... PNG 파일의 바이너리 데이터 */],
      ),
    ),
  ));
}
반응형