diff --git a/.changeset/late-books-fly.md b/.changeset/late-books-fly.md new file mode 100644 index 0000000..88a9b61 --- /dev/null +++ b/.changeset/late-books-fly.md @@ -0,0 +1,5 @@ +--- +'@tidaltheory/lens': minor +--- + +Extract dominant colour from image diff --git a/src/cli.ts b/src/cli.ts index 890a1ac..e09aa49 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -5,12 +5,13 @@ import process from 'node:process' import { globby } from 'globby' import { JSONFile, Low } from 'lowdb' -import ora from 'ora' +import ora, { oraPromise } from 'ora' import sade from 'sade' import sharp from 'sharp' import { PackageJson } from 'type-fest' import { loadConfig } from './lib/context.js' +import { getDominantPalette } from './lib/dominant.js' import { generateFingerprint } from './lib/fingerprint.js' import { matchThumbnail, writeThumbnail } from './lib/thumbnail.js' import type { ImageRecord, ImageThumbnails } from './types.js' @@ -73,6 +74,10 @@ prog.command('add ') let sharpImage = sharp(source) let { width, height } = await sharpImage.metadata() let fingerprint = await generateFingerprint(sharpImage) + let dominantPalette = await oraPromise( + getDominantPalette(sharpImage), + { successText: 'Extracted dominant colours' } + ) let { dir, name: imageName, ext } = parse(source) let filename = useFilenameDirectory @@ -148,6 +153,7 @@ prog.command('add ') let entry: ImageRecord = { path: filename, dimensions: { width, height }, + colors: dominantPalette, thumbnails: entryThumbnails, } @@ -171,7 +177,11 @@ prog.command('add ') } } - spinner.succeed(`Processed ${processed} images ...DONE!`) + spinner.succeed( + `Processed ${processed} ${ + processed === 1 ? 'image' : 'images' + } ...DONE!` + ) }) prog.command('jpg ') diff --git a/src/lib/dominant.ts b/src/lib/dominant.ts new file mode 100644 index 0000000..a6a0368 --- /dev/null +++ b/src/lib/dominant.ts @@ -0,0 +1,6 @@ +import type { Sharp } from 'sharp' + +export async function getDominantPalette(image: Sharp) { + let { dominant } = await image.stats() + return [`rgb(${dominant.r}, ${dominant.g}, ${dominant.b})`] +}