From c0cebdc81f229fc2fab57b40c48b2fb6dd84f598 Mon Sep 17 00:00:00 2001 From: Ku6epXBOCTuK Date: Mon, 7 Sep 2026 10:20:01 +0500 Subject: [PATCH] feat: add output format for download --- .../lib/components/kit/SchemaToolView.svelte | 10 +++++++--- web/src/lib/registry-new/convert.ts | 19 ++++++++++++++++++- web/src/lib/registry-new/types.ts | 10 ++++++++++ 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/web/src/lib/components/kit/SchemaToolView.svelte b/web/src/lib/components/kit/SchemaToolView.svelte index 9ee55de..f990f3e 100644 --- a/web/src/lib/components/kit/SchemaToolView.svelte +++ b/web/src/lib/components/kit/SchemaToolView.svelte @@ -92,12 +92,16 @@ } async function download() { - if (!result) return; - const blob = await encode(result, "image/png"); + if (!result || !schema) return; + 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 a = document.createElement("a"); a.href = url; - a.download = "with-border.png"; + a.download = `${tool.id}.${out?.ext ?? "png"}`; a.click(); URL.revokeObjectURL(url); } diff --git a/web/src/lib/registry-new/convert.ts b/web/src/lib/registry-new/convert.ts index 4246831..c154d09 100644 --- a/web/src/lib/registry-new/convert.ts +++ b/web/src/lib/registry-new/convert.ts @@ -21,6 +21,7 @@ const convertToJpg: ToolEntry = { category: "convert", schema: convertToJpgSchema, run: (img, p) => flattenOntoColor(img, p.background), + output: { mime: "image/jpeg", ext: "jpg", qualityParamId: "quality" }, }; interface ConvertToWebpParams { @@ -39,6 +40,22 @@ const convertToWebp: ToolEntry = { category: "convert", schema: convertToWebpSchema, run: (img) => clonePixelImage(img), + output: { mime: "image/webp", ext: "webp", qualityParamId: "quality" }, }; -export const convertEntries = [convertToJpg, convertToWebp]; +interface ConvertToBmpParams {} + +export const convertToBmpSchema = toolSchema({}); + +const convertToBmp: ToolEntry = { + 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]; diff --git a/web/src/lib/registry-new/types.ts b/web/src/lib/registry-new/types.ts index bfca23c..c261b68 100644 --- a/web/src/lib/registry-new/types.ts +++ b/web/src/lib/registry-new/types.ts @@ -1,6 +1,14 @@ import type { CategoryId } from "../preview/categories"; import type { ToolSchema } from "../registry-schema"; 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`, схема — @@ -22,5 +30,7 @@ export type ToolEntry

> = { runFromText?(text: string, params: P): Promise | PixelImage; textToText?(text: string): Promise | string; preview?(img: PixelImage, params: P): Promise | PixelImage; + /** Формат/качество скачивания результата; по умолчанию — PNG. */ + output?: OutputFormat; icon?: string; };