A full-featured composable image editor with a customizable UI -- all backed by the power of Metal.
Image Editor | PhotosCropRotating | Face Detection | Masking |
---|---|---|---|
![]() |
![]() |
![]() |
- Create your own image editor UI by composing components.
- Components are built separately and run standalone using an
EditingStack
. EditingStacks
manage editing history and render images. It's like a headless browser!
- Components are built separately and run standalone using an
- Edit and render using P3 Wide Color Gamut
- Support for Super Large Photosβ’ (β€ 12000 pixels).
- Previews and rendering backed with the power of Metal.
- Create custom-drawn masks on photos.
- Drop-in support for your own custom filters using LUTs.
- Load and download remote images for editing with a
URL
. - Support for both UIKit and SwiftUI.
iOS Target | Xcode Version | Swift Version |
---|---|---|
iOS 15.0+ | Xcode 15.2+ | Swift 5.9+ |
Buy me a coffee or support me on GitHub.
![yellow-button](https://user-images.githubusercontent.com/1888355/146226808-eb2e9ee0-c6bd-44a2-a330-3bbc8a6244cf.png)
There are a few important housekeeping notes for those coming from v1.
- β Issues are managed in the v2 Project
- π Pixel has been renamed Brightroom.
- π Detailed documentation is available on Notion.
- π Help Wanted: CoreImage and Metal professionals!
- βοΈ If you're interested in v2, star the project to motivate us! π€
- πͺ Brightroom's state management is now powered by Verge.
Swift Package Manager
dependencies: [
.package(url: "https://github.com/muukii/Brightroom.git", upToNextMajor: "2.2.0")
]
View the full documentation on Notion.
BrightroomUIPhotosCrop.PhotosCropRotation
![](https://private-user-images.githubusercontent.com/1888355/307124702-df14adc2-97fc-465b-8919-7727c9bae8bd.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ1NjQ3OTIsIm5iZiI6MTcyNDU2NDQ5MiwicGF0aCI6Ii8xODg4MzU1LzMwNzEyNDcwMi1kZjE0YWRjMi05N2ZjLTQ2NWItODkxOS03NzI3YzliYWU4YmQuZ2lmP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDgyNSUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDA4MjVUMDU0MTMyWiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9OWQ2MDhjNmUwOTEyZTE0Y2FlMmZlZWNhZWU1ZTFkMWY0YzU0NWEwOTA2ZDc5YzgyNTY5OWMxYmRhZWNkNjg4ZSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.YpD0WQXwCFPWYkUsGslIoupdLzmqjZPZ3tgXyKErm6E)
import SwiftUI
import BtightroomUIPhotosCrop
struct DemoCropView: View {
@StateObject var editingStack: EditingStack
@State var resultImage: ResultImage?
init(
editingStack: @escaping () -> EditingStack
) {
self._editingStack = .init(wrappedValue: editingStack())
}
var body: some View {
ZStack {
VStack {
PhotosCropRotating(editingStack: { editingStack })
Button("Done") {
let image = try! editingStack.makeRenderer().render().cgImage
self.resultImage = .init(cgImage: image)
}
}
}
.onAppear {
editingStack.start()
}
}
}
ClassicEditor
PixelEditViewController
There is an entire open-source and production-ready app available on the App Store that uses Brightroom. It's called Drip.
This repository also contains a demo app which demonstrates what Brightroom can perform and showcases some easy experiments. Clone this repo and build the project to try it out!
Brightroom is available under the MIT license. See the LICENSE file for more info.