Composer: Select transparency fill color (follow-up) (#1942)
This commit is contained in:
parent
e6d0a7284d
commit
07a8100b93
@ -185,10 +185,10 @@ export async function getAverageColor(url: string): Promise<[number, number, num
|
|||||||
return rgb;
|
return rgb;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function isDarkColor(rgbColor: [number, number, number]) {
|
export function getColorLuma(rgbColor: [number, number, number]) {
|
||||||
const [r, g, b] = rgbColor;
|
const [r, g, b] = rgbColor;
|
||||||
const luma = 0.2126 * r + 0.7152 * g + 0.0722 * b;
|
const luma = 0.2126 * r + 0.7152 * g + 0.0722 * b;
|
||||||
return luma < 128;
|
return luma;
|
||||||
}
|
}
|
||||||
|
|
||||||
// eslint-disable-next-line max-len
|
// eslint-disable-next-line max-len
|
||||||
|
|||||||
@ -1,4 +1,6 @@
|
|||||||
import { getAverageColor, isDarkColor } from './colors';
|
import { getAverageColor, getColorLuma } from './colors';
|
||||||
|
|
||||||
|
const LUMA_THRESHOLD = 240;
|
||||||
|
|
||||||
export function scaleImage(image: string | Blob, ratio: number, outputType: string = 'image/png'): Promise<string> {
|
export function scaleImage(image: string | Blob, ratio: number, outputType: string = 'image/png'): Promise<string> {
|
||||||
const url = image instanceof Blob ? URL.createObjectURL(image) : image;
|
const url = image instanceof Blob ? URL.createObjectURL(image) : image;
|
||||||
@ -56,7 +58,7 @@ async function scale(
|
|||||||
throw new Error('Image bitmap resize not supported!'); // FF93 added support for options, but not resize
|
throw new Error('Image bitmap resize not supported!'); // FF93 added support for options, but not resize
|
||||||
}
|
}
|
||||||
const averageColor = await getAverageColor(img.src);
|
const averageColor = await getAverageColor(img.src);
|
||||||
const fillColor = isDarkColor(averageColor) ? '#fff' : '#000';
|
const fillColor = getColorLuma(averageColor) < LUMA_THRESHOLD ? '#fff' : '#000';
|
||||||
return await new Promise((res) => {
|
return await new Promise((res) => {
|
||||||
const canvas = document.createElement('canvas');
|
const canvas = document.createElement('canvas');
|
||||||
canvas.width = bitmap.width;
|
canvas.width = bitmap.width;
|
||||||
@ -81,7 +83,7 @@ async function scale(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function steppedScale(
|
async function steppedScale(
|
||||||
img: HTMLImageElement, width: number, height: number, step: number = 0.5, outputType: string = 'image/png',
|
img: HTMLImageElement, width: number, height: number, step: number = 0.5, outputType: string = 'image/png',
|
||||||
): Promise<Blob | null> {
|
): Promise<Blob | null> {
|
||||||
const canvas = document.createElement('canvas');
|
const canvas = document.createElement('canvas');
|
||||||
@ -117,6 +119,11 @@ function steppedScale(
|
|||||||
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
|
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const averageColor = await getAverageColor(img.src);
|
||||||
|
const fillColor = getColorLuma(averageColor) < LUMA_THRESHOLD ? '#fff' : '#000';
|
||||||
|
ctx.fillStyle = fillColor;
|
||||||
|
ctx.globalCompositeOperation = 'destination-over';
|
||||||
|
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
canvas.toBlob(resolve, outputType);
|
canvas.toBlob(resolve, outputType);
|
||||||
});
|
});
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user