画像編集機能は、SNSアプリやカメラアプリ、Eコマースなど多くのFlutterアプリで必要とされる機能です。しかし、Flutterで画像編集を実装しようとすると、いくつかの課題に直面します。
- 複雑なUI実装が必要になる
- プラットフォーム間の一貫性を保つのが難しい
- パフォーマンスとユーザー体験の両立が困難
こうした悩みをシンプルに解決できるのが、今回紹介する「pro_image_editor」です。
pro_image_editorとは?
pro_image_editor
は、Flutterでシンプルかつ高機能な画像編集を実現するパッケージです。
主な特徴:
- 多彩な編集ツール(トリミング、フィルター、テキスト追加など)
- クロスプラットフォーム対応(iOS/Android)
- カスタマイズ性の高いUI
- 軽量かつ高速な処理
- シンプルなAPIで素早く実装可能
画像加工機能を「ちょうどいい感じで」アプリに組み込みたいときに最適な選択肢です。
インストール方法
まずは pubspec.yaml
に依存関係を追加します。
dependencies:
pro_image_editor: ^1.2.0 # 最新版は pub.dev を確認
基本の使い方
1. 画像エディターの表示
import 'package:pro_image_editor/pro_image_editor.dart';
// 画像ファイルから
final imageFile = File('path/to/image.jpg');
final editor = ProImageEditor(
image: ProImage.file(imageFile),
onImageEditComplete: (editedImage) {
// 編集完了後の処理
setState(() {
resultImage = editedImage;
});
},
);
ネットワーク画像やアセット画像もサポート:
ProImage.network('https://example.com/image.jpg');
ProImage.asset('assets/images/sample.jpg');
2. エディターのカスタマイズ
ProImageEditor(
image: ProImage.file(imageFile),
config: const ProImageEditorConfig(
themes: ProImageEditorThemes(
primary: Colors.blue,
background: Colors.white,
),
features: [
ProImageEditorFeature.crop,
ProImageEditorFeature.filter,
ProImageEditorFeature.text,
ProImageEditorFeature.draw,
ProImageEditorFeature.sticker,
],
),
onImageEditComplete: (editedImage) {
// 処理
},
);
3. プログラムからの編集操作
コントローラーを使って画像編集をプログラムから操作することも可能です。
final editorController = ProImageEditorController();
// コントローラーをウィジェットに渡す
ProImageEditor(
controller: editorController,
image: ProImage.file(imageFile),
onImageEditComplete: (editedImage) {
// 処理
},
);
// 別の場所からトリミングを開始
onTap: () {
editorController.startCropping();
}
高度な使い方
カスタムフィルターの追加
独自のフィルターエフェクトを追加することもできます。
final customFilters = [
ProImageFilter(
name: 'モノクローム',
apply: (img) => img.applyColorMatrix([
0.33, 0.33, 0.33, 0, 0,
0.33, 0.33, 0.33, 0, 0,
0.33, 0.33, 0.33, 0, 0,
0, 0, 0, 1, 0,
]),
),
// 他のフィルターも追加可能
];
ProImageEditor(
image: ProImage.file(imageFile),
config: ProImageEditorConfig(
customFilters: customFilters,
),
onImageEditComplete: (editedImage) {
// 処理
},
);
スタンプやステッカー機能のカスタマイズ
アプリ独自のステッカーを追加することも簡単です。
final customStickers = [
ProSticker(
name: 'カスタムステッカー1',
asset: 'assets/stickers/custom1.png',
),
ProSticker(
name: 'カスタムステッカー2',
asset: 'assets/stickers/custom2.png',
),
];
ProImageEditor(
image: ProImage.file(imageFile),
config: ProImageEditorConfig(
customStickers: customStickers,
),
onImageEditComplete: (editedImage) {
// 処理
},
);
実装例: シンプルな画像編集フロー
ギャラリーから画像を選択して編集するシンプルな例を見てみましょう。
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:pro_image_editor/pro_image_editor.dart';
class ImageEditDemo extends StatefulWidget {
@override
_ImageEditDemoState createState() => _ImageEditDemoState();
}
class _ImageEditDemoState extends State<ImageEditDemo> {
File? _image;
File? _editedImage;
Future<void> _pickImage() async {
final picker = ImagePicker();
final pickedFile = await picker.pickImage(source: ImageSource.gallery);
if (pickedFile != null) {
setState(() {
_image = File(pickedFile.path);
});
// 画像選択後すぐに編集画面を表示
_editImage();
}
}
Future<void> _editImage() async {
if (_image == null) return;
final result = await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => Scaffold(
body: ProImageEditor(
image: ProImage.file(_image!),
onImageEditComplete: (editedImage) {
Navigator.pop(context, editedImage);
},
onCancel: () {
Navigator.pop(context);
},
),
),
),
);
if (result != null) {
setState(() {
_editedImage = result;
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('画像編集デモ')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (_editedImage != null)
Container(
height: 300,
width: 300,
decoration: BoxDecoration(
border: Border.all(color: Colors.grey),
),
child: Image.file(_editedImage!),
)
else
Text('画像を選択して編集してください'),
SizedBox(height: 20),
ElevatedButton(
onPressed: _pickImage,
child: Text('画像を選択'),
),
],
),
),
);
}
}
注意点と補足
- パフォーマンス: 大きなサイズの画像を編集する場合は、事前にリサイズすることをお勧めします
- メモリ管理: 編集完了後に不要な一時ファイルは削除しましょう
- 権限設定: iOS/Androidでの画像アクセス権限を適切に設定する必要があります
- カスタマイズの深さ: テーマカラーやアイコンだけでなく、編集ツールの順序や表示・非表示も設定できます
まとめ
pro_image_editor
は、Flutterでの画像編集機能をシンプルかつ柔軟に実装できるパッケージです。
特に以下のようなニーズに最適です:
- SNSアプリなどで画像投稿前に基本的な編集機能を提供したい
- Eコマースアプリで商品画像を調整する機能が欲しい
- 画像編集アプリの基本機能をすぐに実装したい
- プラットフォーム間で一貫した画像編集体験を提供したい
柔軟なカスタマイズ性と簡単な実装で、ユーザー体験を大幅に向上させることができます。Flutterアプリに画像編集機能を追加したいなら、ぜひpro_image_editor
を試してみてください。