[flutter] 플러터 RxDart를 활용한 이미지 필터링 기능 구현 방법

이번 기술 블로그에서는 플러터(Flutter) 앱에서 RxDart를 사용하여 이미지 필터링 기능을 구현하는 방법에 대해 알아보겠습니다. RxDart는 리액티브 프로그래밍을 쉽게 구현할 수 있도록 도와주는 라이브러리로, 플러터 앱의 비동기 작업 처리를 간편하게 할 수 있습니다.

필요한 패키지 설치하기

이미지 필터링 기능을 구현하기 위해 다음과 같은 두 가지 패키지를 설치해야 합니다.

dependencies:
  rxdart: ^0.27.0
  image: ^2.1.20

위의 코드를 pubspec.yaml 파일에 추가하고, 패키지들을 설치해주면 됩니다. 먼저 플러터 앱의 프로젝트 폴더에서 터미널을 열고 다음 명령어를 실행합니다.

flutter packages get

이미지 필터링 기능 구현하기

이제 필요한 패키지들을 설치했으니, 실제로 이미지 필터링 기능을 구현해보겠습니다.

먼저, 필터링된 이미지를 표시하기 위해 Image 위젯을 사용하겠습니다. 해당 이미지에 필터링을 적용할 때 사용할 수 있는 다양한 필터들은 image 패키지에서 제공됩니다. 필터링은 dart:ui 패키지의 ImageFilter.blur 메소드를 이용하여 적용할 수 있습니다.

import 'dart:ui' as ui;
import 'package:flutter/material.dart';
import 'package:image/image.dart' as img;
import 'package:rxdart/rxdart.dart';

class ImageFilteringPage extends StatefulWidget {
  @override
  _ImageFilteringPageState createState() => _ImageFilteringPageState();
}

class _ImageFilteringPageState extends State<ImageFilteringPage> {
  final _imageSubject = BehaviorSubject<img.Image>();

  @override
  void dispose() {
    _imageSubject.close();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('이미지 필터링'),
      ),
      body: Center(
        child: StreamBuilder<img.Image>(
          stream: _imageSubject.stream,
          builder: (context, snapshot) {
            final image = snapshot.data;
            if (image == null) {
              return Text('이미지를 선택해주세요');
            } else {
              final filteredImage = img.copyRotate(image, 90);
              return Image.memory(
                img.encodePng(filteredImage),
              );
            }
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          final image = await _pickImage();
          if (image != null) {
            _imageSubject.add(image);
          }
        },
        child: Icon(Icons.add),
      ),
    );
  }

  Future<img.Image> _pickImage() async {
    // 이미지를 선택하는 로직 추가
  }
}

위의 코드에서는 _imageSubject라는 BehaviorSubject를 사용하여 이미지를 스트림으로 전달합니다. StreamBuilder 위젯을 사용하여 해당 스트림을 구독하고, 이미지가 업데이트될 때마다 화면에 이미지를 표시하게 됩니다. 이미지는 필터링된 이미지가 아니라면 Image.memory 위젯을 이용하여 원본 이미지를 표시하고, 필터링된 이미지라면 적절한 필터를 적용한 후 표시합니다.

_pickImage 메소드는 이미지를 선택하는 로직을 구현해주어야 합니다. 이 부분은 앱의 요구사항에 따라 다양하게 구현될 수 있습니다.

결론

이번 기술 블로그에서는 RxDart를 활용하여 플러터 앱에서 이미지 필터링 기능을 구현하는 방법을 알아보았습니다. RxDart를 사용하면 비동기 작업을 효율적으로 처리할 수 있으며, 이미지 필터링과 같은 어려운 작업을도 간단하게 구현할 수 있습니다. 플러터 개발에 RxDart를 적극적으로 활용하면 앱의 품질과 성능을 향상시킬 수 있습니다.