A small, native photo camera for iOS and Android. Take a photograph or choose one with the platform photo picker, apply one of three effects, preview it, and save the result to the system photo library.
The interface intentionally stays close to a physical camera: a live image, a quiet black control deck, plain filter labels, one shutter, and native system pickers. There is no cross-platform UI framework and no account, feed, cloud upload, tracking SDK, or private photo index.
Reframe E6, captured with maybe.camera.
- Reframe E6 — orientation-preserving, center-cropped 3:2 output (600×400
landscape or 400×600 portrait) using reFrame's canonical Spectra 6 palette
and processing defaults: brightness
1.1, color1.4, palette saturation0.6, and Floyd–Steinberg dithering. - Cyberpixel H — threshold-bounded horizontal luminance pixel sorting.
- Cyberpixel V — the same process along vertical image columns.
- Original is available as the non-destructive baseline in the editor.
All image effects live in one portable C++17 implementation under common/.
Swift and Kotlin only convert their native image objects to the shared BGRA
contract, so platform output cannot silently diverge.
The large white shutter is the capture control; there is no keyboard shortcut on the mobile apps. Tap a filter name before taking the photo, or change it again in the editor before saving:
Reframe E6is the stippled six-colour camera treatment.Cyberpixel HandCyberpixel Vare the brighter, colour-mixing pixel-sort treatment in horizontal and vertical directions.
The photo button at lower left opens the operating system's photo picker. After
capturing or importing, use Save to export the current filtered image.
The camera viewfinder is the exact 2:3 portrait / 3:2 landscape crop used by
Reframe: the filter center-crops into the sensor image and never stretches it.
Hold the phone sideways for a 600×400 result or upright for 400×600. On Android,
the controls remain portrait-stable while capture orientation follows the phone;
1× and 2× select the camera zoom before capture.
maybe.camera/
├── common/ C++ filter engine, CMake project, and reference tests
├── ios/ SwiftUI + AVFoundation + PhotosUI application
├── android/ Kotlin + Compose + CameraX application and JNI bridge
└── design/ the minimal shared launcher mark
The iOS target uses AVCaptureSession/AVCapturePhotoOutput for the camera,
PhotosPicker for scoped gallery selection, and PhotoKit's add-only permission
for export. This follows Apple's native camera and picker architecture:
AVCam
and PhotosPicker.
Requirements: Xcode 15 or newer and an iOS 17 device/simulator.
- Open
ios/MaybeCamera.xcodeproj. - Select the
MaybeCameratarget and your signing team. - Run on a device for the real camera; the simulator can exercise Library import, filters, and saving.
ios/project.yml is the source specification. If project membership changes,
regenerate the checked-in Xcode project with make ios-project after installing
XcodeGen.
The Android target uses CameraX Preview + ImageCapture, Android's system
Photo Picker, MediaStore, Jetpack Compose, and a JNI bridge to common/.
CameraX is the recommended Android camera abstraction; see the official
CameraX documentation and
Photo Picker documentation.
Requirements: JDK 17, Android SDK 35, CMake 3.22.1, and an Android 10+ device/emulator.
./gradlew :android:app:assembleDebugThe APK is written to android/app/build/outputs/apk/debug/app-debug.apk.
make common-testThe suite verifies pass-through behavior, both Cyberpixel directions, the E6 palette, the fixed 600×400 result, and byte-exact Pillow 12.3.0 reference hashes for the canonical 1200×800 reduce path and an odd-sized crop/resample path.
- Reframe processing is adapted from
kaloyaan/reframe
at commit
5b88b443a9225b7954b57bbb784854c081c6991b. - Cyberpixel is based on the direction and threshold behavior from cebola4444/cybershot-cam.
- Complete third-party details and license texts are in
THIRD_PARTY_NOTICES.mdandLICENSES/.
