penguin_camera 0.0.1 penguin_camera: ^0.0.1 copied to clipboard
Provides a platform-agnostic interface for accessing cameras camera features.
penguin_camera #
A cross-platform framework for accessing various cameras and camera features available on devices, allowing you to capture pictures and videos in your applications.
On top of providing an interface that is cross platform, this also provides easy access to platform specific features.
Supported Platform #
Android, iOS
Permissions #
Android and iOS require permissions to access camera and audio devices, but this package doesn't
provide an API to request them. Consider using permission_handler
to request permissions. See the example
for an example.
Use Cases #
Getting Camera Device Information #
final List<CameraDevice> devices = await CameraController.getAllCameraDevices();
for (CameraDevice device in devices) {
print('CameraDevice: ${device.name}, ${device.position}');
}
Displaying a Preview #
final List<CameraDevice> devices = await CameraController.getAllCameraDevices();
final CameraDevice device = devices.firstWhere(
(CameraDevice device) => device.position == CameraPosition.back,
);
final PreviewOutput previewOutput = PreviewOutput();
final CameraController controller = CameraController(
device: device,
outputs: <CameraOutput>[previewOutput],
);
// This must finish before anything else is called.
await controller.initialize();
final Widget previewWidget = await previewOutput.previewWidget();
controller.start();
Taking a picture #
final List<CameraDevice> devices =
await CameraController.getAllCameraDevices();
final CameraDevice device = devices.firstWhere(
(CameraDevice device) => device.position == CameraPosition.back,
);
final ImageCaptureOutput imageOutput = ImageCaptureOutput();
// Android requires a PreviewOutput, so it is added despite it not being used.
final CameraController controller = CameraController(
device: device,
outputs: <CameraOutput>[PreviewOutput(), imageOutput],
);
// This must finish before anything else is called.
await controller.initialize();
controller.start();
imageOutput.takePicture((Uint8List data) {
print(data.length);
});
controller.stop();
controller.dispose();
Recording a Video #
final List<CameraDevice> devices =
await CameraController.getAllCameraDevices();
final CameraDevice device = devices.firstWhere(
(CameraDevice device) => device.position == CameraPosition.back,
);
final VideoCaptureOutput videoOutput = VideoCaptureOutput();
// Android requires a PreviewOutput, so it is added despite it not being used.
final CameraController controller = CameraController(
device: device,
outputs: <CameraOutput>[PreviewOutput(), videoOutput],
);
// This must finish before anything else is called.
await controller.initialize();
controller.start();
videoOutput.startRecording(fileOutput: 'myFile');
videoOutput.stopRecording();
controller.stop();
controller.dispose();
Setting Exposure #
final CameraController controller = ....
final List<ExposureMode> modes = await controller.supportedExposureModes();
if (modes.contains(ExposureMode.continuous)) {
controller.setExposureMode(ExposureMode.continuous);
}
Setting Focus #
final CameraController controller = ....
final List<FocusMode> modes = await controller.supportedFocusModes();
if (modes.contains(FocusMode.continuousImageAutoFocus)) {
controller.setFocusMode(FocusMode.continuousImageAutoFocus);
}
Setting Zoom #
final CameraController controller = ....
if (await controller.zoomSupported()) {
final double minZoom = await controller.minZoom();
final double maxZoom = await controller.maxZoom();
controller.setZoom((maxZoom + minZoom) / 2);
}
Get Output Size #
Every class that extends CameraOutput
must return an output size if a CameraControllerPreset
is
set.
final List<CameraDevice> devices =
await CameraController.getAllCameraDevices();
final CameraDevice device = devices.firstWhere(
(CameraDevice device) => device.position == CameraPosition.back,
);
final PreviewOutput previewOutput = PreviewOutput();
final CameraController controller = CameraController(
device: device,
outputs: <CameraOutput>[previewOutput],
);
// This must complete to guarantee CameraOutput.outputSize() returns non-null.
await controller.setControllerPreset(CameraControllerPreset.high);
final Size? outputSize = await previewOutput.outputSize();
Setting Flash #
final List<CameraDevice> devices = await CameraController.getAllCameraDevices();
final CameraDevice device = devices.firstWhere(
(CameraDevice device) => device.position == CameraPosition.back,
);
final ImageCaptureOutput imageOutput = ImageCaptureOutput();
// Android requires a PreviewOutput, so it is added despite it not being used.
final CameraController controller = CameraController(
device: device,
outputs: <CameraOutput>[PreviewOutput(), imageOutput],
);
// This must finish before anything else is called.
await controller.initialize();
final List<FlashMode> modes = await imageOutput.supportedFlashModes();
if (modes.contains(FlashMode.auto)) {
imageOutput.setFlashMode(FlashMode.auto);
}
Using Android Specific Feature #
import 'package:penguin_camera/penguin_camera.dart';
import 'package:penguin_camera/android.dart' as android;
final CameraController controller = ....
if (defaultTargetPlatform == TargetPlatform.android) {
final android.CameraController androidController =
controller as android.CameraController;
final android.CameraParameters parameters =
androidController.cameraParameters;
parameters.setColorEffect(android.CameraParameters.effectNegative);
androidController.camera.setParameters(parameters);
}
Using iOS Specific Feature #
import 'package:penguin_camera/penguin_camera.dart';
import 'package:penguin_camera/ios.dart' as ios;
final CameraController controller = ....
if (defaultTargetPlatform == TargetPlatform.iOS) {
final ios.CameraController iosController =
controller as ios.CameraController;
iosController.session.setSessionPreset(ios.CaptureSessionPreset.photo);
}