• Stars
    star
    548
  • Rank 77,944 (Top 2 %)
  • Language
    TypeScript
  • License
    Other
  • Created over 2 years ago
  • Updated 10 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

🎨 An app to detect color palettes in the real world - powered by VisionCamera

Colorwaver

An app to detect colorwaves (swatches/palettes) in the real world - powered by VisionCamera and Reanimated.

I wrote this app in less than a day, a speed simply not matched by native app development. Because it's written in React Native (TypeScript/JavaScript), it runs both on iOS and Android, but performance critical parts (e.g. the image processing algorithm or the animations) are backed by native Objective-C/Swift/Java code.

See this Tweet for more information.

Buy Me a Coffee at ko-fi.com

Try it!

Download the repository and run the following commands to try Colorwaver for yourself:

iOS

yarn try-ios

Android

yarn try-android

Project structure

This is a bare React Native project, created with create-react-native-app.


  • 📁 src: Contains the actual TypeScript + React (-Native) front-end for the Colorwaver App.
    • 📄 src/getColorPalette.ts: Exposes the native iOS/Android frame processor plugin as a JS function with TypeScript types. This function has to be called from a frame processor. ('worklet')

    • 📄 src/Router.tsx: The main component that gets registered by index.js. This acts as a main navigator, navigating either to the Splash Page (Permissions) or the App Page (Main App) depending on whether the user has granted permissions or not.

    • 📄 src/Splash.tsx: The first Splash page to ask the user for Camera permission.

    • 📄 src/App.tsx: Contains the actual source code for the App's front-end.

      • VisionCamera is used to get a Camera device and display a Camera component. Also, a frame processor (a function that gets called for every frame the camera "sees") gets attached, which calls the native iOS/Android frame processor plugin.
      • Reanimated is used to smoothly animate between color changes.

      Because VisionCamera also uses the Worklet API, the entire process between receiving a camera frame and actually displaying the palette's colors does not use the React-JS Thread at all. The frame processing runs on a separate Thread from VisionCamera, which then dispatches the animations on the Reanimated UI Thread. This is why the App runs as smooth as a native iOS or Android app.

    • 📄 src/useAnimatedColor.ts: A helper function to animate color changes with SharedValues.


  • 📁 ios: Contains the basic skeleton for a React Native iOS app, plus the native getColorPalette(...) Frame Processor Plugin.
    • 📄 ios/PaletteFrameProcessorPlugin.m: Declares the Swift frame processor plugin "getColorPalette(...)".

    • 📄 ios/PaletteFrameProcessorPlugin.swift: Contains the actual Swift code for the native iOS frame processor plugin "getColorPalette(...)".

      This uses the CoreImage API to convert the CMSampleBuffer to a UIImage, and then uses the UIImageColors library to build the color palette.

      VisionCamera's frame processor API is used to expose this function as a frame processor plugin.

    • 📄 ios/Colorwaver-Bridging-Header.h: A Bridging Header to import Objective-C headers into Swift.

    • 📄 ios/Podfile: Adds the UIImageColors library.

    • 📄 ios/UIColor+hexString.swift: An extension for UIColor to convert UIColor instances to strings. This is required because React Native handles colors as strings.


  • 📁 android: Contains the basic skeleton for a React Native Android app, plus the native getColorPalette(...) Frame Processor Plugin.
    • 📄 android/app/build.gradle: The gradle build file for the Android project. The following third-party dependencies are installed:

      • androidx.camera: camera-core
      • androidx.palette: palette
    • 📁 android/app/src/main/java/com/colorwaver/utils: Contains two files copied from android/camera-samples to convert ImageProxy instances to Bitmaps. (YuvToRgbConverter.kt)

    • 📁 android/app/src/main/java/com/colorwaver: Contains the actual Java source code of the Project.

    • 📄 android/app/src/main/java/com/colorwaver/MainApplication.java: Sets up react-native-reanimated.

    • 📄 android/app/src/main/java/com/colorwaver/MainActivity.java: Installs the PaletteFrameProcessorPlugin frame processor plugin inside of the onCreate method.

    • 📄 android/app/src/main/java/com/colorwaver/PaletteFrameProcessorPlugin.java: Contains the actual Java code for the native Android frame processor plugin "getColorPalette(...)".

      This uses the YuvToRgbConverter to convert the ImageProxy to a Bitmap, and then passes that to the Palette API from AndroidX to build the color palette.

      VisionCamera's frame processor API is used to expose this function as a frame processor plugin.


  • 📄 babel.config.js: Adds the native frame processor plugin getColorPalette (called __getColorPalette) to Reanimated's global list.

Credits

More Repositories

1

react-native-vision-camera

📸 A powerful, high-performance React Native Camera library.
Swift
6,320
star
2

react-native-mmkv

⚡️ The fastest key/value storage for React Native. ~30x faster than AsyncStorage!
C++
4,903
star
3

react-native-blurhash

🖼️ A library to show colorful blurry placeholders while your content loads.
Kotlin
1,568
star
4

react-native-multithreading

🧵 Fast and easy multithreading for React Native using JSI
C++
1,049
star
5

react-native-jsi-image

🖼️ A writeable in-memory Image JSI Host Object
C++
267
star
6

react-native-tracking-transparency

🕵️ A React Native Library for interacting with the tracking API from iOS 14.
Java
208
star
7

react-native-google-nearby-messages

📲 Communicate with nearby devices using Bluetooth, BLE, WiFi and near-ultrasonic audio. Broadcast and receive small payloads (like strings) using the easy-to-use React Native API!
Kotlin
173
star
8

react-native-jsi-contacts

A contacts library for React Native using JSI
C++
140
star
9

AnimatedGif

📼 A high performance .NET library for reading and creating animated GIFs
C#
127
star
10

react-native-blob-jsi-helper

A React Native library for accessing an ArrayBuffer of a Blob instance.
C++
118
star
11

react-native-jsi-library-template

Template for React Native JSI Libraries Ă  la Marc
C++
110
star
12

clean-rn

A simple CLI tool to clean all React Native caches in your project.
JavaScript
109
star
13

vision-camera-image-labeler

VisionCamera Frame Processor Plugin to label images using MLKit Vision
Java
97
star
14

ImgurSniper

📷 A quick and easy Image, Screenshot and Screen recording sharing tool
C#
85
star
15

react-native-style-utilities

Fully typed hooks and utility functions for the React Native StyleSheet API
JavaScript
78
star
16

Hotkeys

🔤 A small C# (.NET) Library which allows binding of global HotKeys to any Application's Windows (including Windows Apps such as explorer.exe), even in Background. (using P/Invokes)
C#
71
star
17

react-native-notification-badge

🔴 A notification badge count manager for React Native
Swift
47
star
18

react-native-pressable-opacity

A <PressableOpacity> and a supercharged <NativePressableOpacity> components for React Native
TypeScript
46
star
19

GenericProtocol

⚡️ A fast TCP event based buffered server/client protocol for transferring data over the (inter)net in .NET 🌐
C#
42
star
20

DiscordMusicBot

A Discord Bot for playing YouTube music.
C#
41
star
21

react-native-pressable-scale

A <PressableScale> and a supercharged <NativePressableScale> components for React Native
TypeScript
39
star
22

StorageBenchmark

Benchmark App to compare different storage libraries (MMKV, AsyncStorage, WatermelonDB, RealmDB, SQLite)
Java
29
star
23

react-native-screen-corner-radius

📱 A React Native library to get the Device's Screen's corner radius
Java
27
star
24

BrabeNetz

🧠 A fast and clean supervised neural network in C++, capable of effectively using multiple cores
C++
26
star
25

Toast

🍞 The rounded and animated Android Toast for .NET WPF/XAML
C#
26
star
26

Fiddle

📜 A lightweight code editor for editing, compiling and running code snippets/scripts supporting multiple languages and rich GUI
C
23
star
27

Jellyfish

🐟 An incredibly lightweight and type safe MVVM library for .NET WPF, Silverlight, Xamarin and UWP
C#
20
star
28

PostShot

📷 An easy to use, lightning fast and modern screenshot and screen-recording tool powered by C++ and Qt
C++
17
star
29

vision-camera-resize-plugin

A VisionCamera Frame Processor plugin for fast buffer resizing
Objective-C
17
star
30

WebUntisSharp

⏰ A Wrapper of the WebUntis JSON API for .NET
C#
14
star
31

pipestate

🏦 A minimal state management library for React.
TypeScript
13
star
32

gimp-rpc

A GIMP plugin to display Discord Rich Presence made with C
C
11
star
33

react-native-sectioned-slider

An iOS 11 Control Center inspired Slider for React Native
Ruby
10
star
34

ClipboardMonitor

A small C# Library for Monitoring Clipboard with P/Invokes (e.g.: Clipboard Content Changed event)
C#
9
star
35

GameFinder

🎮 An application for finding games to play you and your friends have on Steam
C#
8
star
36

QHotkeys

🔠 A small and lightweight cross platform C++ library implementing a system-wide hotkey system for Qt
C++
7
star
37

Keepr

A Tinder-like swipe view to keep or remove pictures from a photoshoot with extra comparison features
TypeScript
7
star
38

BmpPwd

🔐 BmpPwd is a .NET Class Library for overloadable en/decrypting strings or binary data to a System.Drawing.Image
C#
7
star
39

MaterialDesignWindowsDialogs

A new Theme (Android Material Design) for Windows Message Boxes (by hooking)
C#
7
star
40

shared-registry

Shared-Registry allows you to share objects between instances without introducing memory leaks.
TypeScript
6
star
41

dotfiles

My personal minimalistic dotfiles (.vimrc, .zshrc, .oh-my.zsh, custom scripts, ..)
Shell
6
star
42

mrousavy

✨ it's lit ✨
6
star
43

react-native-static-safe-area-insets

React Native package that exposes the Safe Area Insets as constants
Java
5
star
44

MetaLog

📝 Simple, yet effective, logging with Metadata CallerInfo for creating beautiful Log files in C#/VB .NET
C#
5
star
45

SchoolTool

📓 An App to watch your timetable and get notified of changes.
C#
3
star
46

HankHill

A discord bot for pixelating and jpegifying images
C#
3
star
47

maconvert

Easily convert .svg files to .png files
JavaScript
3
star
48

TinyRocket

A 2D Endless Unity Game; Fly up high and beat highscores with your customizable and upgradeable Rocket!
C#
3
star
49

Cirilla

🤖 Cirilla - The swiss army knife discord bot supporting many commands and systems
C#
3
star
50

Morph

🛠 A fast .NET Standard Class Library for parsing results from an SQL query to .NET objects to eliminate risky column-index hardcoding
C#
2
star
51

QPastebin

A quick Pastebin-uploader shell script using curl and the Pastebin REST API
Shell
2
star
52

QuantumSnippets

Snippets, Examples or Test code for Quantum Computers written in the Microsoft Quantum Computer Programming Language Q#
C#
1
star
53

discord-cli

CLI for discord bots
JavaScript
1
star
54

ModellbaumesseRoboter

Roboter fĂźr Modellbaumesse 2016 (TGM 3DHIT)
C++
1
star
55

Vertaler

📖 A pop-up tray application to instantly translate something from your clipboard using Google Translate
C#
1
star
56

pokecord-guesser

Guesser for Pokecord using Discord API and reverse image lookup
HTML
1
star
57

ModWnd

👺 A daemon to move any Window from within it's body (child area) while holding a modifier key (Windows/Alt)
C++
1
star
58

VisionCameraDemo

Demo for using VisionCamera + zooming
TypeScript
1
star