camera_extended
원본 비율 지원(16:9, 4:3, 1:1)을 갖춘 확장된 Flutter 카메라 플러그인. 센서 수준의 비율 구성이 가능한 공식 카메라 패키지의 포크입니다.
Flutter의 카메라 플러그인을 기반으로 한 확장판으로, 미리보기, 사진, 동영상에 대해 네이티브 비율(16:9, 4:3, 1:1) 지원 — Android에서는 CameraX, iOS에서는 AVFoundation 사용. pub.dev에서 camera_extended로 제공.
아래는 영문 원문 스냅샷입니다. 최신 내용은 GitHub에서 확인하세요.
Extended Flutter camera plugin with native aspect ratio support (16:9, 4:3, 1:1).
Fork of the official camera package with sensor-level aspect ratio configuration for both iOS and Android.
| Android | iOS | |
|---|---|---|
| Support | SDK 24+ | iOS 13.0+ |
| Feature | camera | camera_extended |
|---|---|---|
| Aspect Ratio Control | No | Yes (16:9, 4:3, 1:1) |
| Native 1:1 Square | No | Yes (Android) |
| Sensor-Level Config | No | Yes |
| In-Memory Capture | No | Yes (takePictureAsBytes()) |
| Video Stabilization | No | Yes (VideoStabilizationMode) |
takePictureAsBytes() returns raw Uint8List without saving to diskcamera package APIThe standard camera package doesn't allow you to configure the aspect ratio at the native level. This package extends it to:
| Ratio | Field of View | Use Case |
|---|---|---|
| 16:9 | Narrowest | Video, Widescreen |
| 4:3 | Wider | Photos, Standard |
| 1:1 | Square | Social Media, Profile Photos |
Add to your pubspec.yaml:
dependencies:
camera_extended: ^1.2.0
import 'package:camera_extended/camera_extended.dart';
late List<CameraDescription> cameras;
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
cameras = await availableCameras();
runApp(MyApp());
}
final controller = CameraController(
cameras.first,
ResolutionPreset.high,
enableAudio: false,
aspectRatio: CameraAspectRatio.ratio4x3, // NEW: aspect ratio parameter
);
await controller.initialize();
enum CameraAspectRatio {
ratio16x9, // 16:9 widescreen
ratio4x3, // 4:3 standard
ratio1x1, // 1:1 square
ratioDefault, // Camera's default ratio
}
import 'package:camera_extended/camera_extended.dart';
import 'package:flutter/material.dart';
late List<CameraDescription> cameras;
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
cameras = await availableCameras();
runApp(const CameraApp());
}
class CameraApp extends StatefulWidget {
const CameraApp({super.key});
@override
State<CameraApp> createState() => _CameraAppState();
}
class _CameraAppState extends State<CameraApp> {
CameraController? _controller;
CameraAspectRatio _aspectRatio = CameraAspectRatio.ratio4x3;
@override
void initState() {
super.initState();
_initCamera();
}
Future<void> _initCamera() async {
await _controller?.dispose();
_controller = CameraController(
cameras.first,
ResolutionPreset.high,
aspectRatio: _aspectRatio, // Set aspect ratio here
);
await _controller!.initialize();
if (mounted) setState(() {});
}
void _changeAspectRatio(CameraAspectRatio ratio) {
setState(() => _aspectRatio = ratio);
_initCamera(); // Reinitialize camera with new ratio
}
@override
void dispose() {
_controller?.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Column(
children: [
Expanded(
child: _controller?.value.isInitialized == true
? CameraPreview(_controller!)
: const Center(child: CircularProgressIndicator()),
),
Padding(
padding: const EdgeInsets.all(16),
child: SegmentedButton<CameraAspectRatio>(
segments: const [
ButtonSegment(value: CameraAspectRatio.ratio16x9, label: Text('16:9')),
ButtonSegment(value: CameraAspectRatio.ratio4x3, label: Text('4:3')),
ButtonSegment(value: CameraAspectRatio.ratio1x1, label: Text('1:1')),
],
selected: {_aspectRatio},
onSelectionChanged: (selected) => _changeAspectRatio(selected.first),
),
),
],
),
),
);
}
}
Capture an image directly as bytes without writing to disk — ideal for ML pipelines, image processing, or uploading:
final Uint8List bytes = await controller.takePictureAsBytes();
// Use bytes directly — no file I/O needed
Query supported stabilization modes and apply one:
// Check supported modes
final modes = await controller.getSupportedVideoStabilizationModes();
// Apply stabilization
await controller.setVideoStabilizationMode(VideoStabilizationMode.standard);
Available modes: off, standard, cinematic, cinematicExtended (availability depends on device).
| Platform | 16:9 | 4:3 | 1:1 |
|---|---|---|---|
| Android | Native | Native | Native (1088x1088) |
| iOS | Native | Native | Fallback to 4:3 |
Uses CameraX with ResolutionSelector to request specific aspect ratios. Many Android devices support native 1:1 formats (e.g., 1088x1088, 720x720).
Uses AVFoundation with format selection based on aspect ratio. iOS cameras typically don't offer native 1:1 formats, so 1:1 falls back to 4:3.
Add to AndroidManifest.xml:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
Add to Info.plist:
<key>NSCameraUsageDescription</key>
<string>Camera access is required for taking photos.</string>
<key>NSMicrophoneUsageDescription</key>
<string>Microphone access is required for recording video.</string>
camera PackageThis package is API-compatible with the original camera package. To migrate:
camera with camera_extended in pubspec.yamlimport 'package:camera_extended/camera_extended.dart'aspectRatio parameter to CameraController// Before (camera package)
import 'package:camera/camera.dart';
CameraController(camera, ResolutionPreset.high);
// After (camera_extended)
import 'package:camera_extended/camera_extended.dart';
CameraController(camera, ResolutionPreset.high, aspectRatio: CameraAspectRatio.ratio4x3);
Same as the original camera package - you need to handle lifecycle changes:
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
final CameraController? cameraController = controller;
if (cameraController == null || !cameraController.value.isInitialized) {
return;
}
if (state == AppLifecycleState.inactive) {
cameraController.dispose();
} else if (state == AppLifecycleState.resumed) {
_initCamera();
}
}
>=3.35.0^3.9.0| Package | Description |
|---|---|
| camera_extended | Main plugin (this package) |
| camera_extended_android | Android implementation |
| camera_extended_ios | iOS implementation |
| camera_extended_platform_interface | Platform interface |
BSD 3-Clause License - same as the original Flutter camera package.
Based on the official Flutter camera plugin by the Flutter team.
Extended with native aspect ratio support.
Made with love by Codigee
사용 목적에 따라 검색하고 개발 활동을 비교한 뒤 원본 저장소에서 요구 사항을 확인하세요.
“A repository is the most basic element of GitHub.”
GitHub Docs — About repositories ↗