Features

This library allows you to extract colors from an image, which can be used to determine the colors of Flutter widgets or output into a CSV. This is a port of the Colorgram JS library by darosh on GitHub.

It uses the Relative Luminance, Hue, and Lightness values to sample to colors.

Compared to other color extraction packages in Dart, this package is lightweight, fast and simple to use, removing all the bloat and only providing you with only what you need.

Showcase Image

Supports:

JPG
PNG / Animated APNG
GIF / Animated GIF
BMP
WebP / Animated WebP

(based on supported file types by ImageProvider, other file types might be supported)

Benchmarks: (Desktop) without resizing

  • 512x512 JPEG in ~ 30ms
  • 5120x1440 JPEG in ~200ms

Getting started

Please ensure your data is in an ImageProvider Object

  • FileImage
  • NetworkImage
  • AssetImage
  • etc

Usage

This package only requires you to interact with one simple method, the extractColor(), which takes in an ImageProvider object and an integer representing the number of color outputs the user wants

ImageProvider provider = FileImage(File(r'test.png'));
List<CgColor> colorList =extractColor(provider, 10);

The results will be outputted in a list of CgColor objects, in order of most prominent

CgColor(int r, int g, int b, num percentage)

You can then use this in your widgets using Flutter's Color object

Color.fromARGB(255, CgColor.r, CgColor.g, CgColor.b)

NOTE: The function does not take into account Alpha values, all outputs are considered to be fully opaque. Thus, the Alpha/Opacity values for the Color widgets should have a value of 255/1 respectively for accurate color representation.

Improving Performance via Resizing Images

This can yield significant performance improvements, especially from a high resolution image. However, do keep in mind that this will affect the percentage figures, and down sizing too much can drastically affect results, especially when two colors are very similar in percentage composition.

extractColor(ResizeImage(provider,height:50,width: 50),1);

NOTE: do also account for aspect ratio when resizing.

Passing a list of Images -> File/XFile type

List<List<CgColor>> finalData = imageList.map((e) => extractColor(FileImage(File(e.path)), 10)).toList();

Passing a list of Images -> Image Provider Objects

final imageList = [NetworkImage, FileImage, AssetImage]
List<List<CgColor>> finalData = imageList.map((e) => extractColor(e, 10)).toList();

Additional information

Originally, this project supported usage in pure Dart projects, however this was sacrificed in exchange for significantly faster performance, a trade-off I deem worth it. Special thanks to And96 for the suggestions that helped to improve this package.

Do contribute to the project if you find a faster alternative

If you want to use it in your dart projects, please get the 1.0.1 version.

Credits: darosh on Github for the original Colorgram library

Libraries

colorgram
Support for doing something awesome.