feat: add output format for download

This commit is contained in:
2026-09-07 10:20:01 +05:00
parent 37a4a0576c
commit c0cebdc81f
3 changed files with 35 additions and 4 deletions
@@ -92,12 +92,16 @@
} }
async function download() { async function download() {
if (!result) return; if (!result || !schema) return;
const blob = await encode(result, "image/png"); const out = tool.output;
const quality = out?.qualityParamId
? Number(values[out.qualityParamId]) / 100
: undefined;
const blob = await encode(result, out?.mime ?? "image/png", quality);
const url = URL.createObjectURL(blob); const url = URL.createObjectURL(blob);
const a = document.createElement("a"); const a = document.createElement("a");
a.href = url; a.href = url;
a.download = "with-border.png"; a.download = `${tool.id}.${out?.ext ?? "png"}`;
a.click(); a.click();
URL.revokeObjectURL(url); URL.revokeObjectURL(url);
} }
+18 -1
View File
@@ -21,6 +21,7 @@ const convertToJpg: ToolEntry<ConvertToJpgParams> = {
category: "convert", category: "convert",
schema: convertToJpgSchema, schema: convertToJpgSchema,
run: (img, p) => flattenOntoColor(img, p.background), run: (img, p) => flattenOntoColor(img, p.background),
output: { mime: "image/jpeg", ext: "jpg", qualityParamId: "quality" },
}; };
interface ConvertToWebpParams { interface ConvertToWebpParams {
@@ -39,6 +40,22 @@ const convertToWebp: ToolEntry<ConvertToWebpParams> = {
category: "convert", category: "convert",
schema: convertToWebpSchema, schema: convertToWebpSchema,
run: (img) => clonePixelImage(img), run: (img) => clonePixelImage(img),
output: { mime: "image/webp", ext: "webp", qualityParamId: "quality" },
}; };
export const convertEntries = [convertToJpg, convertToWebp]; interface ConvertToBmpParams {}
export const convertToBmpSchema = toolSchema<ConvertToBmpParams>({});
const convertToBmp: ToolEntry<ConvertToBmpParams> = {
id: "png-to-bmp",
title: "Convert PNG to BMP",
description:
"Saves the image as 24-bit BMP without an alpha channel: transparency is replaced with a black background.",
category: "convert",
schema: convertToBmpSchema,
run: (img) => flattenOntoColor(img, "#000000"),
output: { mime: "image/bmp", ext: "bmp" },
};
export const convertEntries = [convertToJpg, convertToWebp, convertToBmp];
+10
View File
@@ -1,6 +1,14 @@
import type { CategoryId } from "../preview/categories"; import type { CategoryId } from "../preview/categories";
import type { ToolSchema } from "../registry-schema"; import type { ToolSchema } from "../registry-schema";
import type { PixelImage } from "../core/types"; import type { PixelImage } from "../core/types";
import type { OutputMime } from "../core/io";
/** Формат скачивания, отличный от PNG (bmp/jpeg/webp). */
export interface OutputFormat {
mime: OutputMime;
ext: string;
qualityParamId?: string;
}
/** /**
* Инструмент нового registry: полностью типизирован на `Params`, схема — * Инструмент нового registry: полностью типизирован на `Params`, схема —
@@ -22,5 +30,7 @@ export type ToolEntry<P = Record<string, unknown>> = {
runFromText?(text: string, params: P): Promise<PixelImage> | PixelImage; runFromText?(text: string, params: P): Promise<PixelImage> | PixelImage;
textToText?(text: string): Promise<string> | string; textToText?(text: string): Promise<string> | string;
preview?(img: PixelImage, params: P): Promise<PixelImage> | PixelImage; preview?(img: PixelImage, params: P): Promise<PixelImage> | PixelImage;
/** Формат/качество скачивания результата; по умолчанию — PNG. */
output?: OutputFormat;
icon?: string; icon?: string;
}; };