@@ -53,7 +53,7 @@ Most free online file tools ask you to upload your contract, payslip, bank state
| What you get | |
|---|---|
| 🔒 **Your file stays on your device** | No upload endpoint exists, and the CSP blocks connections to any other site |
-| 🧰 **65 tools in one place** | PDF, Word, Excel, PowerPoint, images, audio, JSON and Mermaid |
+| 🧰 **67 tools in one place** | PDF, Word, Excel, PowerPoint, images, audio, JSON and Mermaid |
| ✏️ **Edit PDF text in its own font** | Changed lines are rewritten inside the PDF with its embedded font, size and colour |
| 🎙️ **Speech to text on the device** | Whisper runs in the browser: TXT, SRT or VTT, offline after a one-time download |
| 🆓 **Free forever** | No account, no daily limits, no watermark, no premium tier |
@@ -116,7 +116,7 @@ Most free online file tools ask you to upload your contract, payslip, bank state
| Export a **Mermaid diagram as PNG or SVG** for slides, docs or a README | [Mermaid to PNG](https://fizzdoc.com/mermaid-to-png/) · [Mermaid to SVG](https://fizzdoc.com/mermaid-to-svg/) |
| **Remove hidden author and company names** before sharing an Office file or PDF | [Word](https://fizzdoc.com/remove-word-metadata/) · [Excel](https://fizzdoc.com/remove-excel-metadata/) · [PowerPoint](https://fizzdoc.com/remove-powerpoint-metadata/) · [PDF](https://fizzdoc.com/remove-pdf-metadata/) |
-## 🧰 All 65 tools
+## 🧰 All 67 tools
| Format | Tools |
|---|---|
@@ -125,7 +125,7 @@ Most free online file tools ask you to upload your contract, payslip, bank state
| **Word** | [Word → PDF](https://fizzdoc.com/word-to-pdf/) · [Compress](https://fizzdoc.com/compress-word/) · [Remove metadata](https://fizzdoc.com/remove-word-metadata/) · [Extract images](https://fizzdoc.com/extract-images-from-word/) |
| **Excel** | [Excel → CSV](https://fizzdoc.com/excel-to-csv/) · [CSV → Excel](https://fizzdoc.com/csv-to-excel/) · [Excel → JSON](https://fizzdoc.com/excel-to-json/) · [JSON → Excel](https://fizzdoc.com/json-to-excel/) · [Compress](https://fizzdoc.com/compress-excel/) · [Remove metadata](https://fizzdoc.com/remove-excel-metadata/) · [Extract images](https://fizzdoc.com/extract-images-from-excel/) |
| **PowerPoint** | [Compress](https://fizzdoc.com/compress-powerpoint/) · [Remove metadata](https://fizzdoc.com/remove-powerpoint-metadata/) · [Extract images](https://fizzdoc.com/extract-images-from-powerpoint/) |
-| **Images** | [Remove background](https://fizzdoc.com/remove-background/) (AI on your device, full resolution) · [Compress](https://fizzdoc.com/compress-image/) (to [20 KB](https://fizzdoc.com/compress-image-to-20kb/), [50 KB](https://fizzdoc.com/compress-image-to-50kb/), [100 KB](https://fizzdoc.com/compress-image-to-100kb/) for forms) · [Resize](https://fizzdoc.com/resize-image/) (larger or smaller) · [Convert](https://fizzdoc.com/convert-image/) · [PNG → JPG](https://fizzdoc.com/png-to-jpg/) · [JPG → PNG](https://fizzdoc.com/jpg-to-png/) · [WebP → JPG](https://fizzdoc.com/webp-to-jpg/) · [JPG → WebP](https://fizzdoc.com/jpg-to-webp/) · [Image → Text](https://fizzdoc.com/image-to-text/) (select text right on the photo, like Live Text) · [Mermaid → PNG](https://fizzdoc.com/mermaid-to-png/) · [Mermaid → SVG](https://fizzdoc.com/mermaid-to-svg/) (diagrams from code, with a preview and ready-to-use examples) |
+| **Images** | [Remove background](https://fizzdoc.com/remove-background/) (AI on your device, full resolution) · [Remove GIF background](https://fizzdoc.com/remove-gif-background/) · [Remove video background](https://fizzdoc.com/remove-video-background/) (no green screen, sound kept) · [Compress](https://fizzdoc.com/compress-image/) (to [20 KB](https://fizzdoc.com/compress-image-to-20kb/), [50 KB](https://fizzdoc.com/compress-image-to-50kb/), [100 KB](https://fizzdoc.com/compress-image-to-100kb/) for forms) · [Resize](https://fizzdoc.com/resize-image/) (larger or smaller) · [Convert](https://fizzdoc.com/convert-image/) · [PNG → JPG](https://fizzdoc.com/png-to-jpg/) · [JPG → PNG](https://fizzdoc.com/jpg-to-png/) · [WebP → JPG](https://fizzdoc.com/webp-to-jpg/) · [JPG → WebP](https://fizzdoc.com/jpg-to-webp/) · [Image → Text](https://fizzdoc.com/image-to-text/) (select text right on the photo, like Live Text) · [Mermaid → PNG](https://fizzdoc.com/mermaid-to-png/) · [Mermaid → SVG](https://fizzdoc.com/mermaid-to-svg/) (diagrams from code, with a preview and ready-to-use examples) |
| **Audio** | [Cut & Split Audio](https://fizzdoc.com/split-audio/) (trim or split an MP3/M4A on a waveform, preview every part) · [Merge Audio](https://fizzdoc.com/merge-audio/) (listen before you download) — no re-encoding, so no quality loss · [Audio to Text](https://fizzdoc.com/audio-to-text/) · [MP3 to Text](https://fizzdoc.com/mp3-to-text/) · [Video to Text](https://fizzdoc.com/video-to-text/) · [Subtitle Generator](https://fizzdoc.com/subtitle-generator/) (SRT/VTT) — speech to text with OpenAI's Whisper running on your device; the model downloads once, then works offline |
**Google Docs, Sheets and Slides** work too: download as .docx / .xlsx / .pptx and use the matching tool. Nothing is sent to Google.
@@ -293,6 +293,8 @@ Fizzdoc would not exist without these open-source projects and the people who ma
| [BiRefNet](https://github.com/ZhengPeng7/BiRefNet) | The AI model that removes backgrounds (BiRefNet-lite, 512 px export by [studioludens](https://huggingface.co/studioludens/birefnet-lite-512)) | [@ZhengPeng7](https://github.com/ZhengPeng7) and co-authors |
| [U²-Net](https://github.com/xuebinqin/U-2-Net) | The light background model for phones with little memory | [@xuebinqin](https://github.com/xuebinqin) |
| [ONNX Runtime Web](https://github.com/microsoft/onnxruntime) | Runs the AI models in the browser, on the GPU (WebGPU) or CPU | [Microsoft](https://github.com/microsoft) and contributors |
+| [gifuct-js](https://github.com/matt-way/gifuct-js) and [gifenc](https://github.com/mattdesl/gifenc) | Read and write animated GIFs for GIF background removal | [@matt-way](https://github.com/matt-way) and [@mattdesl](https://github.com/mattdesl) |
+| [Mediabunny](https://github.com/Vanilagy/mediabunny) | Reads and writes videos for video background removal, keeping the sound | [@Vanilagy](https://github.com/Vanilagy) |
| [Whisper](https://github.com/openai/whisper) and [Transformers.js](https://github.com/huggingface/transformers.js) | Speech to text, on the device | [OpenAI](https://github.com/openai) and [Hugging Face](https://github.com/huggingface) |
| [fflate](https://github.com/101arrowz/fflate) | Reads and writes Word, Excel, PowerPoint and ZIP files | [@101arrowz](https://github.com/101arrowz) |
| [Inter](https://github.com/rsms/inter) | The typeface | [@rsms](https://github.com/rsms) |
diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md
index 6391483..b7f5e88 100644
--- a/THIRD_PARTY_NOTICES.md
+++ b/THIRD_PARTY_NOTICES.md
@@ -16,6 +16,7 @@ The deployed site ships these third-party components in `assets/`:
| Mermaid 12.0.0 (Mermaid to Image page only), bundling d3, dagre-d3-es, cytoscape, chevrotain, DOMPurify, KaTeX, marked, roughjs, dayjs, lodash-es, stylis, khroma, elkjs and others | MIT, ISC, BSD-3-Clause, Apache-2.0, Unlicense; DOMPurify used under Apache-2.0 (dual MPL-2.0 OR Apache-2.0); elkjs EPL-2.0, source at https://github.com/kieler/elkjs | https://github.com/mermaid-js/mermaid |
| Whisper tiny speech model (OpenAI; ONNX conversion by onnx-community) and Transformers.js 4.3.0 with ONNX Runtime Web (Audio to Text pages only), bundling @huggingface/jinja, @huggingface/tokenizers, protobufjs, flatbuffers, long, guid-typescript, platform | Apache-2.0 (model, Transformers.js, tokenizers, flatbuffers, long); MIT (ONNX Runtime, jinja, platform); BSD-3-Clause (protobufjs); ISC (guid-typescript) | https://github.com/openai/whisper, https://github.com/huggingface/transformers.js, https://github.com/microsoft/onnxruntime |
| BiRefNet-lite background model (ZhengPeng7/BiRefNet; 512 px ONNX export by studioludens, weights stored as 16-bit) and U²-Net small (xuebinqin/U-2-Net; ONNX by BritishWerewolf), run with ONNX Runtime Web's WebGPU build (Remove Background page only) | MIT (BiRefNet, ONNX Runtime); Apache-2.0 (U²-Net) | https://github.com/ZhengPeng7/BiRefNet, https://github.com/xuebinqin/U-2-Net, https://github.com/microsoft/onnxruntime |
+| gifuct-js 2.1.2 and gifenc 1.0.3 (Remove GIF Background page only); Mediabunny 1.61.3 (Remove Video Background page only) | MIT (gifuct-js, gifenc); MPL-2.0 (Mediabunny, used unmodified) | https://github.com/matt-way/gifuct-js, https://github.com/mattdesl/gifenc, https://github.com/Vanilagy/mediabunny |
| Inter typeface (@fontsource-variable/inter) | SIL Open Font License 1.1 | https://rsms.me/inter |
| Archify (generator and runtime of `public/architecture.html`) | MIT | https://github.com/tt-a1i/archify |
| JetBrains Mono typeface (embedded in `public/architecture.html`) | SIL Open Font License 1.1 | https://github.com/JetBrains/JetBrainsMono |
diff --git a/package-lock.json b/package-lock.json
index c0e2e6a..b1219a7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -17,6 +17,9 @@
"@neslinesli93/qpdf-wasm": "0.3.0",
"@tesseract.js-data/eng": "^1.0.0",
"fflate": "^0.8.3",
+ "gifenc": "^1.0.3",
+ "gifuct-js": "^2.1.2",
+ "mediabunny": "^1.61.3",
"mermaid": "12.0.0",
"pdf-lib": "^1.17.1",
"pdfjs-dist": "^6.3.289",
@@ -1160,6 +1163,21 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@types/dom-mediacapture-transform": {
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/@types/dom-mediacapture-transform/-/dom-mediacapture-transform-0.1.12.tgz",
+ "integrity": "sha512-d7/QsLRwF864A5mgIM/YrfiglHoYn7zgCcAoJgW404r+2DwnNr7EBbLnCWpmOMgH8y0te73L1AV6H1bmauaWFw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/dom-webcodecs": "*"
+ }
+ },
+ "node_modules/@types/dom-webcodecs": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/@types/dom-webcodecs/-/dom-webcodecs-0.1.13.tgz",
+ "integrity": "sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ==",
+ "license": "MIT"
+ },
"node_modules/@types/estree": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
@@ -2741,6 +2759,21 @@
"node": ">= 0.4"
}
},
+ "node_modules/gifenc": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/gifenc/-/gifenc-1.0.3.tgz",
+ "integrity": "sha512-xdr6AdrfGBcfzncONUOlXMBuc5wJDtOueE3c5rdG0oNgtINLD+f2iFZltrBRZYzACRbKr+mSVU/x98zv2u3jmw==",
+ "license": "MIT"
+ },
+ "node_modules/gifuct-js": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/gifuct-js/-/gifuct-js-2.1.2.tgz",
+ "integrity": "sha512-rI2asw77u0mGgwhV3qA+OEgYqaDn5UNqgs+Bx0FGwSpuqfYn+Ir6RQY5ENNQ8SbIiG/m5gVa7CD5RriO4f4Lsg==",
+ "license": "MIT",
+ "dependencies": {
+ "js-binary-schema-parser": "^2.0.3"
+ }
+ },
"node_modules/gopd": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
@@ -2910,6 +2943,12 @@
"url": "https://github.com/sponsors/panva"
}
},
+ "node_modules/js-binary-schema-parser": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/js-binary-schema-parser/-/js-binary-schema-parser-2.0.3.tgz",
+ "integrity": "sha512-xezGJmOb4lk/M1ZZLTR/jaBHQ4gG/lqQnJqdIv4721DMggsa1bDVlHXNeHYogaIEHD9vCRv0fcL4hMA+Coarkg==",
+ "license": "MIT"
+ },
"node_modules/json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
@@ -3275,6 +3314,24 @@
"url": "https://opencollective.com/express"
}
},
+ "node_modules/mediabunny": {
+ "version": "1.61.3",
+ "resolved": "https://registry.npmjs.org/mediabunny/-/mediabunny-1.61.3.tgz",
+ "integrity": "sha512-kUqLKVXQVwHR62GkOJxYosAmXERJbqnXBgJDTtRlxHEYviVkMg/Evhl9XN6kedqS5LP1tV4kFKyzY/V4a4ofow==",
+ "license": "MPL-2.0",
+ "workspaces": [
+ ".",
+ "packages/*"
+ ],
+ "dependencies": {
+ "@types/dom-mediacapture-transform": "^0.1.11",
+ "@types/dom-webcodecs": "0.1.13"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://github.com/sponsors/Vanilagy"
+ }
+ },
"node_modules/merge-descriptors": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
diff --git a/package.json b/package.json
index 4de9994..70ebe80 100644
--- a/package.json
+++ b/package.json
@@ -56,6 +56,9 @@
"@neslinesli93/qpdf-wasm": "0.3.0",
"@tesseract.js-data/eng": "^1.0.0",
"fflate": "^0.8.3",
+ "gifenc": "^1.0.3",
+ "gifuct-js": "^2.1.2",
+ "mediabunny": "^1.61.3",
"mermaid": "12.0.0",
"pdf-lib": "^1.17.1",
"pdfjs-dist": "^6.3.289",
diff --git a/public/third-party-licenses.txt b/public/third-party-licenses.txt
index b454c19..26e6e5e 100644
--- a/public/third-party-licenses.txt
+++ b/public/third-party-licenses.txt
@@ -5265,3 +5265,431 @@ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+==============================================================================
+GIF and video background removal (Remove GIF / Video Background pages only)
+==============================================================================
+
+gifuct-js 2.1.2 (MIT) — https://github.com/matt-way/gifuct-js
+
+The MIT License (MIT)
+
+Copyright (c) 2015 Matt Way
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+gifenc 1.0.3 (MIT) — https://github.com/mattdesl/gifenc
+
+The MIT License (MIT)
+Copyright (c) 2017 Matt DesLauriers
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
+OR OTHER DEALINGS IN THE SOFTWARE.
+
+Mediabunny 1.61.3 (MPL-2.0) — https://github.com/Vanilagy/mediabunny
+ Used unmodified. Its source code is available at the address above.
+
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+ means each individual or legal entity that creates, contributes to
+ the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+ means the combination of the Contributions of others (if any) used
+ by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+ means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+ means Source Code Form to which the initial Contributor has attached
+ the notice in Exhibit A, the Executable Form of such Source Code
+ Form, and Modifications of such Source Code Form, in each case
+ including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+ means
+
+ (a) that the initial Contributor has attached the notice described
+ in Exhibit B to the Covered Software; or
+
+ (b) that the Covered Software was made available under the terms of
+ version 1.1 or earlier of the License, but not also under the
+ terms of a Secondary License.
+
+1.6. "Executable Form"
+ means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+ means a work that combines Covered Software with other material, in
+ a separate file or files, that is not Covered Software.
+
+1.8. "License"
+ means this document.
+
+1.9. "Licensable"
+ means having the right to grant, to the maximum extent possible,
+ whether at the time of the initial grant or subsequently, any and
+ all of the rights conveyed by this License.
+
+1.10. "Modifications"
+ means any of the following:
+
+ (a) any file in Source Code Form that results from an addition to,
+ deletion from, or modification of the contents of Covered
+ Software; or
+
+ (b) any new file in Source Code Form that contains any Covered
+ Software.
+
+1.11. "Patent Claims" of a Contributor
+ means any patent claim(s), including without limitation, method,
+ process, and apparatus claims, in any patent Licensable by such
+ Contributor that would be infringed, but for the grant of the
+ License, by the making, using, selling, offering for sale, having
+ made, import, or transfer of either its Contributions or its
+ Contributor Version.
+
+1.12. "Secondary License"
+ means either the GNU General Public License, Version 2.0, the GNU
+ Lesser General Public License, Version 2.1, the GNU Affero General
+ Public License, Version 3.0, or any later versions of those
+ licenses.
+
+1.13. "Source Code Form"
+ means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+ means an individual or a legal entity exercising rights under this
+ License. For legal entities, "You" includes any entity that
+ controls, is controlled by, or is under common control with You. For
+ purposes of this definition, "control" means (a) the power, direct
+ or indirect, to cause the direction or management of such entity,
+ whether by contract or otherwise, or (b) ownership of more than
+ fifty percent (50%) of the outstanding shares or beneficial
+ ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+ Licensable by such Contributor to use, reproduce, make available,
+ modify, display, perform, distribute, and otherwise exploit its
+ Contributions, either on an unmodified basis, with Modifications, or
+ as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+ for sale, have made, import, and otherwise transfer either its
+ Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+ or
+
+(b) for infringements caused by: (i) Your and any other third party's
+ modifications of Covered Software, or (ii) the combination of its
+ Contributions with other software (except as part of its Contributor
+ Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+ its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+ Form, as described in Section 3.1, and You must inform recipients of
+ the Executable Form how they can obtain a copy of such Source Code
+ Form by reasonable means in a timely manner, at a charge no more
+ than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+ License, or sublicense it under different terms, provided that the
+ license for the Executable Form does not attempt to limit or alter
+ the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+* *
+* 6. Disclaimer of Warranty *
+* ------------------------- *
+* *
+* Covered Software is provided under this License on an "as is" *
+* basis, without warranty of any kind, either expressed, implied, or *
+* statutory, including, without limitation, warranties that the *
+* Covered Software is free of defects, merchantable, fit for a *
+* particular purpose or non-infringing. The entire risk as to the *
+* quality and performance of the Covered Software is with You. *
+* Should any Covered Software prove defective in any respect, You *
+* (not any Contributor) assume the cost of any necessary servicing, *
+* repair, or correction. This disclaimer of warranty constitutes an *
+* essential part of this License. No use of any Covered Software is *
+* authorized under this License except under this disclaimer. *
+* *
+************************************************************************
+
+************************************************************************
+* *
+* 7. Limitation of Liability *
+* -------------------------- *
+* *
+* Under no circumstances and under no legal theory, whether tort *
+* (including negligence), contract, or otherwise, shall any *
+* Contributor, or anyone who distributes Covered Software as *
+* permitted above, be liable to You for any direct, indirect, *
+* special, incidental, or consequential damages of any character *
+* including, without limitation, damages for lost profits, loss of *
+* goodwill, work stoppage, computer failure or malfunction, or any *
+* and all other commercial damages or losses, even if such party *
+* shall have been informed of the possibility of such damages. This *
+* limitation of liability shall not apply to liability for death or *
+* personal injury resulting from such party's negligence to the *
+* extent applicable law prohibits such limitation. Some *
+* jurisdictions do not allow the exclusion or limitation of *
+* incidental or consequential damages, so this exclusion and *
+* limitation may not apply to You. *
+* *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+ This Source Code Form is subject to the terms of the Mozilla Public
+ License, v. 2.0. If a copy of the MPL was not distributed with this
+ file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+ This Source Code Form is "Incompatible With Secondary Licenses", as
+ defined by the Mozilla Public License, v. 2.0.
diff --git a/src/app.ts b/src/app.ts
index b09c841..ab5aa33 100644
--- a/src/app.ts
+++ b/src/app.ts
@@ -121,7 +121,7 @@ function setUp(op: ToolOp) {
// Every tool that runs outside the qpdf worker. Engines load on first use.
const LOCAL: Partial> = {
'jpg-to-pdf': async (f) => (await import('./engine/local')).imagesToPdf(f),
- 'pdf-to-jpg': async (f, o) => (await import('./engine/local')).pdfToImages(f[0], o.format === 'png' ? 'png' : 'jpg', Number(o.dpi) || 150),
+ 'pdf-to-jpg': async (f, o) => (await import('./engine/local')).pdfToImages(f[0], o.format === 'png' ? 'png' : 'jpg', Number(o.dpi) || 150),
'page-numbers': async (f, o) =>
(await import('./engine/stamp')).addPageNumbers(f[0], {
position: o.position as 'bottom-center' | 'bottom-right' | 'top-right',
diff --git a/src/engine/background-worker.ts b/src/engine/background-worker.ts
index cc635c8..feb643d 100644
--- a/src/engine/background-worker.ts
+++ b/src/engine/background-worker.ts
@@ -9,7 +9,8 @@ import type * as Ort from 'onnxruntime-web';
import { planesFromRGBA, refine } from './matte';
export type BackgroundModel = 'birefnet-lite' | 'u2netp';
-export type ToBackground = { type: 'run'; id: number; image: ImageBitmap } | { type: 'mask'; id: number; image: ImageBitmap };
+/** `fast` asks for speed over the finest edges: animations use it, with many frames to do. */
+export type ToBackground = { type: 'run'; id: number; image: ImageBitmap; fast?: boolean } | { type: 'mask'; id: number; image: ImageBitmap; fast?: boolean };
export type FromBackground =
| { type: 'setup'; loaded: number; total: number }
| { type: 'progress'; id: number; fraction: number }
@@ -31,6 +32,8 @@ const MODELS: Record | undefined;
+const gpuReady = hasGpu();
+/** Whether the loaded small model was picked for speed (rather than for lack of memory). */
+let speedPick = false;
async function start(model?: BackgroundModel, allowGpu = true): Promise {
const cache = await caches.open(CACHE);
- const gpu = allowGpu && (await hasGpu());
+ const gpu = allowGpu && (await gpuReady);
const chosen = model ?? pickModel(gpu);
const runtime = gpu ? `${ORIGIN}/bg/ort/` : `${ORIGIN}/whisper/ort/`;
const runtimeFiles: Wanted[] = gpu
@@ -151,8 +157,16 @@ async function predict(engine: Engine, image: ImageBitmap): Promise {
+async function maskOf(image: ImageBitmap, fast = false): Promise<{ mask: Float32Array; model: BackgroundModel }> {
const fallbacks: [BackgroundModel, boolean][] = [];
+ // Without a GPU the big model takes seconds per picture: fine for a photo, too slow for 40 frames.
+ if (fast !== speedPick && !(await gpuReady)) {
+ // Switch to the small model for animations, and back to the default for the next photo.
+ const loaded = await engine?.catch(() => undefined);
+ await loaded?.session.release().catch(() => {});
+ engine = fast ? start('u2netp', false) : undefined;
+ speedPick = fast;
+ }
engine ??= start().catch((error) => {
// A GPU that can't even load the model: try the CPU before giving up.
engine = undefined;
@@ -201,14 +215,14 @@ function resizeMask(mask: Float32Array, size: number, w: number, h: number) {
return out;
}
-async function cutOut(id: number, image: ImageBitmap) {
+async function cutOut(id: number, image: ImageBitmap, fast?: boolean) {
const W = image.width;
const H = image.height;
post({ type: 'progress', id, fraction: 0.05 });
- const { mask, model } = await maskOf(image);
+ const { mask, model } = await maskOf(image, fast);
post({ type: 'progress', id, fraction: 0.7 });
// A reduced copy for the refinement, and the full-size pixels it is applied to.
- const scale = Math.min(1, REFINE_SIZE / Math.max(W, H));
+ const scale = Math.min(1, (fast ? REFINE_SIZE_FAST : REFINE_SIZE) / Math.max(W, H));
const w = Math.max(1, Math.round(W * scale));
const h = Math.max(1, Math.round(H * scale));
const smallCanvas = new OffscreenCanvas(w, h);
@@ -226,9 +240,9 @@ async function cutOut(id: number, image: ImageBitmap) {
self.onmessage = async ({ data }: MessageEvent) => {
try {
- if (data.type === 'run') await cutOut(data.id, data.image);
+ if (data.type === 'run') await cutOut(data.id, data.image, data.fast);
else {
- const { mask, model } = await maskOf(data.image);
+ const { mask, model } = await maskOf(data.image, data.fast);
data.image.close();
post({ type: 'mask', id: data.id, size: MODELS[model].size, mask, model }, [mask.buffer]);
}
diff --git a/src/engine/background.ts b/src/engine/background.ts
index b072357..ddedcee 100644
--- a/src/engine/background.ts
+++ b/src/engine/background.ts
@@ -4,6 +4,8 @@ import { LocalError } from './local';
import type { BackgroundModel, FromBackground, ToBackground } from './background-worker';
export interface Hooks {
+ /** Speed over the finest edges, for animations with many frames. */
+ fast?: boolean;
/** First-run download of the model and runtime: bytes so far and in total. */
onSetup?: (loaded: number, total: number) => void;
onProgress?: (fraction: number) => void;
@@ -47,7 +49,7 @@ function ask(message: Omit, hooks: Hooks): Promise {
pending.set(id, { resolve, reject, hooks });
- connect().postMessage({ ...message, id }, [message.image]);
+ connect().postMessage({ ...message, id, fast: hooks.fast }, [message.image]);
});
}
diff --git a/src/engine/gif.ts b/src/engine/gif.ts
new file mode 100644
index 0000000..2f31e44
--- /dev/null
+++ b/src/engine/gif.ts
@@ -0,0 +1,61 @@
+// Animated GIFs, read into whole frames and written back. gifuct-js (MIT) decodes, gifenc (MIT)
+// encodes; both are small, pure JavaScript, and run on the device like everything else.
+import { decompressFrames, parseGIF } from 'gifuct-js';
+import { GIFEncoder, applyPalette, quantize } from 'gifenc';
+
+export interface GifFrame {
+ /** The whole picture at this point of the animation (frames in GIFs are often just patches). */
+ image: ImageData;
+ /** How long it stays on screen, in milliseconds. */
+ delay: number;
+}
+
+/** Every frame of a GIF, composed the way a browser shows them. */
+export function decodeGif(bytes: ArrayBuffer): { width: number; height: number; frames: GifFrame[] } {
+ const gif = parseGIF(bytes);
+ const width = gif.lsd.width;
+ const height = gif.lsd.height;
+ const canvas = new Uint8ClampedArray(width * height * 4);
+ const frames: GifFrame[] = [];
+ for (const frame of decompressFrames(gif, true)) {
+ const { top, left, width: w, height: h } = frame.dims;
+ // Disposal 3 restores the picture as it was before this frame once the frame is over.
+ const before = frame.disposalType === 3 ? canvas.slice() : undefined;
+ for (let y = 0; y < h; y++) {
+ const cy = top + y;
+ if (cy < 0 || cy >= height) continue;
+ for (let x = 0; x < w; x++) {
+ const cx = left + x;
+ if (cx < 0 || cx >= width) continue;
+ const from = (y * w + x) * 4;
+ if (frame.patch[from + 3] === 0) continue; // transparent pixels show what was there
+ canvas.set(frame.patch.subarray(from, from + 4), (cy * width + cx) * 4);
+ }
+ }
+ frames.push({ image: new ImageData(canvas.slice(), width, height), delay: frame.delay || 100 });
+ if (frame.disposalType === 2) {
+ // Disposal 2 clears the frame's area to the background (transparent, as browsers do).
+ for (let y = Math.max(0, top); y < Math.min(height, top + h); y++) canvas.fill(0, (y * width + Math.max(0, left)) * 4, (y * width + Math.min(width, left + w)) * 4);
+ } else if (before) canvas.set(before);
+ }
+ return { width, height, frames };
+}
+
+/** A looping GIF from finished frames. With `transparent`, pixels under half opacity become see-through. */
+export function encodeGif(frames: { data: Uint8ClampedArray; delay: number }[], width: number, height: number, transparent: boolean): Uint8Array {
+ const gif = GIFEncoder();
+ frames.forEach(({ data, delay }, i) => {
+ if (transparent) {
+ // GIF transparency is all or nothing: one palette entry stands for "see-through".
+ const palette = quantize(data, 256, { format: 'rgba4444', oneBitAlpha: true, clearAlpha: true, clearAlphaThreshold: 128 });
+ const index = applyPalette(data, palette, 'rgba4444');
+ const transparentIndex = palette.findIndex((color) => color[3] === 0);
+ gif.writeFrame(index, width, height, { palette, delay, repeat: i === 0 ? 0 : undefined, transparent: transparentIndex >= 0, transparentIndex: Math.max(0, transparentIndex), dispose: 2 });
+ } else {
+ const palette = quantize(data, 256);
+ gif.writeFrame(applyPalette(data, palette), width, height, { palette, delay, repeat: i === 0 ? 0 : undefined });
+ }
+ });
+ gif.finish();
+ return gif.bytes();
+}
diff --git a/src/engine/local.ts b/src/engine/local.ts
index e8fa926..f90d981 100644
--- a/src/engine/local.ts
+++ b/src/engine/local.ts
@@ -17,7 +17,7 @@ export class LocalError extends Error {
| 'NOT_OFFICE' | 'NO_IMAGES' | 'BAD_IMAGE' | 'PDF_PASSWORD' | 'INVALID_PDF' | 'BAD_SIZE' | 'BAD_SCALE' | 'TOO_LARGE'
| 'BAD_TARGET' | 'TARGET_TOO_SMALL' | 'NO_TEXT' | 'NO_WATERMARK' | 'BAD_JSON' | 'BAD_JSON_AT' | 'SHEET_TOO_BIG'
| 'NO_DIAGRAM' | 'BAD_DIAGRAM' | 'NO_AUDIO_TRACK' | 'NO_SPEECH' | 'SETUP_FAILED' | 'TRANSCRIBE_FAILED'
- | 'BG_SETUP_FAILED' | 'BACKGROUND_FAILED' | 'IMAGE_TOO_LARGE',
+ | 'BG_SETUP_FAILED' | 'BACKGROUND_FAILED' | 'IMAGE_TOO_LARGE' | 'BAD_VIDEO' | 'NO_VIDEO_ENCODER',
/** Values for the message, e.g. { line: 3, column: 5 }. */
readonly vars?: Record,
) {
diff --git a/src/engine/video-background.ts b/src/engine/video-background.ts
new file mode 100644
index 0000000..8b47645
--- /dev/null
+++ b/src/engine/video-background.ts
@@ -0,0 +1,100 @@
+// Video background removal: every frame goes through the same model as photos, gets its new
+// backdrop, and is encoded again by the browser (WebCodecs, through Mediabunny, MPL-2.0). The
+// sound is carried over. Loaded only on the Remove Background pages, and only for videos.
+import { ALL_FORMATS, BlobSource, BufferTarget, CanvasSink, Conversion, Input, Mp4OutputFormat, Output, QUALITY_HIGH, WebMOutputFormat, canEncodeVideo } from 'mediabunny';
+import { compose, removeBackground, type Backdrop } from './background';
+import { LocalError } from './local';
+
+export interface VideoInfo {
+ width: number;
+ height: number;
+ duration: number;
+ /** The first frame, upright, at full size. */
+ first: ImageBitmap;
+}
+
+const open = (file: File) => new Input({ source: new BlobSource(file), formats: ALL_FORMATS });
+
+export async function videoInfo(file: File): Promise {
+ const input = open(file);
+ try {
+ const track = await input.getPrimaryVideoTrack();
+ if (!track || !(await track.canDecode())) throw new LocalError('BAD_VIDEO');
+ const sink = new CanvasSink(track);
+ const start = await track.getFirstTimestamp();
+ const frame = await sink.getCanvas(start);
+ if (!frame) throw new LocalError('BAD_VIDEO');
+ return { width: frame.canvas.width, height: frame.canvas.height, duration: await input.computeDuration(), first: await createImageBitmap(frame.canvas) };
+ } catch (error) {
+ throw error instanceof LocalError ? error : new LocalError('BAD_VIDEO');
+ } finally {
+ input.dispose();
+ }
+}
+
+/** Video sizes must be even for most encoders. */
+const even = (n: number) => Math.max(2, Math.round(n / 2) * 2);
+
+export interface VideoJob {
+ backdrop: Backdrop;
+ width: number;
+ height: number;
+ onProgress?: (fraction: number) => void;
+ onSetup?: (loaded: number, total: number) => void;
+}
+
+/** Green-screen green: what "no background" means for a video, ready to key out in any editor. */
+export const GREEN_SCREEN = '#00b140';
+
+/**
+ * The video with its background replaced. "None" gives a green screen: see-through video needs the
+ * encoder library to start helper workers from blob: URLs, which the page's CSP rightly refuses,
+ * and most players can't show it anyway.
+ */
+export async function replaceVideoBackground(file: File, job: VideoJob): Promise<{ blob: Blob; extension: 'mp4' | 'webm' }> {
+ const width = even(job.width);
+ const height = even(job.height);
+ const backdrop: Backdrop = job.backdrop.kind === 'none' ? { kind: 'color', color: GREEN_SCREEN } : job.backdrop;
+ // MP4 (H.264) plays everywhere; WebM (VP9) where the browser can't make MP4.
+ const mp4 = await canEncodeVideo('avc', { width, height });
+ if (!mp4 && !(await canEncodeVideo('vp9', { width, height }))) throw new LocalError('NO_VIDEO_ENCODER');
+ const input = open(file);
+ const target = new BufferTarget();
+ const output = new Output({ format: mp4 ? new Mp4OutputFormat({ fastStart: 'in-memory' }) : new WebMOutputFormat(), target });
+ const canvas = new OffscreenCanvas(width, height);
+ const frame = new OffscreenCanvas(1, 1);
+ const frameContext = frame.getContext('2d')!;
+ try {
+ const conversion = await Conversion.init({
+ input,
+ output,
+ video: {
+ codec: mp4 ? 'avc' : 'vp9',
+ quality: QUALITY_HIGH,
+ // Frames arrive upright, so a backdrop photo lines up with what people see.
+ allowTransformationMetadata: false,
+ forceTranscode: true,
+ processedWidth: width,
+ processedHeight: height,
+ process: async (sample) => {
+ frame.width = sample.displayWidth;
+ frame.height = sample.displayHeight;
+ sample.draw(frameContext, 0, 0);
+ const photo = await createImageBitmap(frame);
+ const { cutout } = await removeBackground(await createImageBitmap(photo), { fast: true, onSetup: job.onSetup });
+ const cut = await createImageBitmap(cutout);
+ compose(canvas, cut, photo, backdrop);
+ cut.close();
+ photo.close();
+ return canvas;
+ },
+ },
+ });
+ if (!conversion.isValid) throw new LocalError('BAD_VIDEO');
+ conversion.onProgress = (progress) => job.onProgress?.(progress);
+ await conversion.execute();
+ return { blob: new Blob([target.buffer!], { type: mp4 ? 'video/mp4' : 'video/webm' }), extension: mp4 ? 'mp4' : 'webm' };
+ } finally {
+ input.dispose();
+ }
+}
diff --git a/src/i18n.ts b/src/i18n.ts
index 3a05c9e..f6b04e1 100644
--- a/src/i18n.ts
+++ b/src/i18n.ts
@@ -177,6 +177,7 @@ export const UI = {
'ws.chooseAudio': 'Choose an MP3 or M4A file',
'ws.chooseAudios': 'Choose MP3 or M4A files',
'ws.chooseMedia': 'Choose an audio or video file',
+ 'ws.chooseVideo': 'Choose a video',
'ws.wmText': 'Watermark text',
'ws.wmDefault': 'CONFIDENTIAL',
'ws.opacity': 'Opacity',
@@ -241,6 +242,8 @@ export const UI = {
'error.TRANSCRIBE_FAILED': 'Transcription stopped unexpectedly. Try a shorter file, or a laptop for long recordings.',
'error.BG_SETUP_FAILED': 'The background remover couldn’t be loaded. Check your internet connection for the one-time download, then try again.',
'error.BACKGROUND_FAILED': 'Removing the background stopped unexpectedly, usually because this device ran out of memory. Try a smaller picture, or close other tabs and try again.',
+ 'error.BAD_VIDEO': 'This browser can’t read this video. Try an MP4 or WebM file, or the latest Chrome or Edge.',
+ 'error.NO_VIDEO_ENCODER': 'This browser can’t save videos. Please use the latest Chrome, Edge or Safari.',
'error.IMAGE_TOO_LARGE': 'This picture is too big for this browser to save at that size. Choose a smaller size under “Size”.',
'error.NO_DIAGRAM': 'Paste your Mermaid code, or choose a .mmd or .md file.',
'error.BAD_DIAGRAM': 'The diagram code has a mistake: {detail}',
@@ -308,10 +311,14 @@ export const UI = {
'bg.previewLabel': 'Your picture with its new background',
'bg.preparing': 'Getting the background remover ready: {loaded} of {total} MB. This download happens only once.',
'bg.working': 'Removing the background… {pct}%',
+ 'bg.frame': 'Removing the background: frame {n} of {total}…',
+ 'bg.gifNote': 'Animated GIF: every frame is done, and it saves as a GIF. GIFs can’t have soft edges, so on “None” the outline looks a little sharper.',
+ 'bg.videoNote': 'This is the first frame. Pick a background, then save: every frame is done on this device, which takes about {min} min here. Keep this tab open.',
'bg.lite': 'This device has little memory, so a lighter model was used. A laptop gives cleaner edges.',
'bg.compare': 'Hold to see the original',
'bg.background': 'Background',
'bg.none': 'None',
+ 'bg.greenScreen': 'Green screen',
'bg.white': 'White',
'bg.black': 'Black',
'bg.blue': 'Blue',
diff --git a/src/i18n/bn.json b/src/i18n/bn.json
index bf8d3bf..8cf80d3 100644
--- a/src/i18n/bn.json
+++ b/src/i18n/bn.json
@@ -322,7 +322,15 @@
"error.NO_AUDIO_TRACK": "এই ব্রাউজার ফাইলটির শব্দ পড়তে পারছে না। MP3, M4A, WAV বা MP4 ফাইল চেষ্টা করুন।",
"error.NO_SPEECH": "এই ফাইলে কোনো কথা পাওয়া যায়নি।",
"error.SETUP_FAILED": "স্পিচ মডেল লোড করা যায়নি। একবারের ডাউনলোডের জন্য ইন্টারনেট সংযোগ দেখে নিন, তারপর আবার চেষ্টা করুন।",
- "error.TRANSCRIBE_FAILED": "ট্রান্সক্রিপশন হঠাৎ থেমে গেছে। ছোট ফাইল চেষ্টা করুন, বা লম্বা রেকর্ডিংয়ের জন্য ল্যাপটপ ব্যবহার করুন।"
+ "error.TRANSCRIBE_FAILED": "ট্রান্সক্রিপশন হঠাৎ থেমে গেছে। ছোট ফাইল চেষ্টা করুন, বা লম্বা রেকর্ডিংয়ের জন্য ল্যাপটপ ব্যবহার করুন।",
+ "ws.chooseVideo": "ভিডিও বেছে নিন",
+ "error.BAD_VIDEO": "এই ব্রাউজার এই ভিডিওটি পড়তে পারছে না। MP4 বা WebM ফাইল, অথবা নতুন Chrome বা Edge চেষ্টা করুন।",
+ "error.NO_VIDEO_ENCODER": "এই ব্রাউজার ভিডিও সেভ করতে পারে না। দয়া করে নতুন Chrome, Edge বা Safari ব্যবহার করুন।",
+ "bg.frame": "ব্যাকগ্রাউন্ড সরানো হচ্ছে: ফ্রেম {n} / {total}…",
+ "bg.gifNote": "অ্যানিমেটেড GIF: প্রতিটি ফ্রেমে কাজ হয় এবং GIF হিসেবে সেভ হয়। GIF-এ নরম কিনারা থাকে না, তাই “কিছু না”-তে কিনারা একটু ধারালো দেখায়।",
+ "bg.videoNote": "এটি প্রথম ফ্রেম। ব্যাকগ্রাউন্ড বেছে সেভ করুন: প্রতিটি ফ্রেম এই ডিভাইসেই হয়, এখানে প্রায় {min} মিনিট লাগবে। এই ট্যাবটি খোলা রাখুন।",
+ "bg.greenScreen": "গ্রিন স্ক্রিন",
+ "ws.dpiLow": "কম (সবচেয়ে ছোট ফাইল, ওয়েবের জন্য)"
},
"home": {
"title": "Fizzdoc — ফ্রি PDF, ছবি, অডিও ও অফিস টুল। কোনো আপলোড নেই।",
@@ -2844,6 +2852,84 @@
"ITR PDF কীভাবে খুলবেন",
"আয়কর PDF আনলক"
]
+ },
+ "remove-video-background": {
+ "name": "ভিডিওর ব্যাকগ্রাউন্ড সরান",
+ "summary": "ভিডিও থেকে মানুষকে আলাদা করুন আর পেছনে রং, ঝাপসা বা ছবি দিন। শব্দ থাকে।",
+ "action": "ভিডিও ডাউনলোড করুন",
+ "title": "ভিডিওর ব্যাকগ্রাউন্ড সরান ফ্রি — গ্রিন স্ক্রিন ছাড়া | Fizzdoc",
+ "description": "গ্রিন স্ক্রিন ছাড়াই ভিডিওর ব্যাকগ্রাউন্ড বিনামূল্যে সরান বা বদলান: পেছনে রং, ঝাপসা বা ছবি দিন। শব্দ থাকে এবং কিছুই আপলোড হয় না।",
+ "h1": "ভিডিও থেকে ব্যাকগ্রাউন্ড সরান",
+ "lede": "গ্রিন স্ক্রিন লাগবে না। প্রতিটি ফ্রেম আপনার নিজের ডিভাইসে AI দিয়ে হয়, শব্দ থাকে, আর পেছনে রং, ঝাপসা বা ছবি দিতে পারেন। ফোনে ছোট ক্লিপ সবচেয়ে ভালো চলে।",
+ "steps": [
+ "একটি ভিডিও বেছে নিন (MP4, WebM বা MOV)।",
+ "প্রথম ফ্রেম দেখে পেছনে কী থাকবে বেছে নিন।",
+ "“ভিডিও ডাউনলোড করুন”-এ ক্লিক করুন এবং সব ফ্রেম না হওয়া পর্যন্ত ট্যাব খোলা রাখুন।"
+ ],
+ "faq": [
+ [
+ "আমার ফাইল কি কোথাও আপলোড হয়?",
+ "না। Fizzdoc পুরো কাজটা আপনার ব্রাউজার ট্যাবের ভেতরেই করে, WebAssembly ও JavaScript-এ কম্পাইল করা ওপেন-সোর্স ইঞ্জিন ব্যবহার করে। আপনার ফাইল আপনার ডিভাইস থেকে পড়া হয়, লোকালি প্রসেস হয়, আর ফলাফল সরাসরি আপনার ডিভাইসেই সেভ হয়। আপনি নিজেই যাচাই করতে পারেন: ব্রাউজারের ডেভেলপার টুলস খুলুন, Network ট্যাবে যান আর একটা কাজ চালান — কোনো রিকোয়েস্টে আপনার ফাইল যায় না।"
+ ],
+ [
+ "কতক্ষণ লাগে?",
+ "প্রতিটি ফ্রেম আপনার ডিভাইসে হয়, তাই এটি তার গতির উপর নির্ভর করে। শুরু করার আগে Fizzdoc আনুমানিক সময় দেখায়।"
+ ],
+ [
+ "এটি কি ভিডিও এডিটরে ব্যবহার করা যাবে?",
+ "হ্যাঁ। “গ্রিন স্ক্রিন” বেছে নিন, তারপর এডিটরে এক ক্লিকে সবুজ সরানো যায় (ক্রোমা কি)। ভিডিও MP4-এ, না হলে WebM-এ সেভ হয়।"
+ ],
+ [
+ "Fizzdoc কি ফ্রি?",
+ "হ্যাঁ, আর এটা সবসময় ফ্রি থাকবে: কোনো সাইন-আপ নেই, ওয়াটারমার্ক নেই, দৈনিক সীমা নেই, আর কোনো প্রিমিয়াম প্ল্যানও নেই। Fizzdoc Apache-2.0 লাইসেন্সের অধীনে ওপেন সোর্স, তাই যে কেউ নিজের কপি চালাতে পারে।"
+ ]
+ ],
+ "keywords": [
+ "ভিডিওর ব্যাকগ্রাউন্ড সরান",
+ "ভিডিওর ব্যাকগ্রাউন্ড বদলান",
+ "গ্রিন স্ক্রিন ছাড়া ভিডিও ব্যাকগ্রাউন্ড",
+ "ভিডিও ব্যাকগ্রাউন্ড রিমুভ ফ্রি",
+ "remove video background"
+ ]
+ },
+ "remove-gif-background": {
+ "name": "GIF-এর ব্যাকগ্রাউন্ড সরান",
+ "summary": "অ্যানিমেটেড GIF-এর ব্যাকগ্রাউন্ড প্রতিটি ফ্রেমে স্বচ্ছ বা নতুন রঙের করুন।",
+ "action": "GIF ডাউনলোড করুন",
+ "title": "GIF-এর ব্যাকগ্রাউন্ড সরান ফ্রি — স্বচ্ছ অ্যানিমেটেড GIF | Fizzdoc",
+ "description": "অ্যানিমেটেড GIF-এর ব্যাকগ্রাউন্ড বিনামূল্যে সরান: প্রতিটি ফ্রেম আপনার ডিভাইসে কাটা হয় এবং স্বচ্ছ বা নতুন রঙের GIF হিসেবে সেভ হয়। কিছুই আপলোড হয় না।",
+ "h1": "GIF থেকে ব্যাকগ্রাউন্ড সরান",
+ "lede": "আপনার অ্যানিমেটেড GIF-এর প্রতিটি ফ্রেম আপনার নিজের ডিভাইসে AI দিয়ে কাটা হয়। স্বচ্ছ রাখুন বা পেছনে রং, ঝাপসা বা ছবি দিন, তারপর আবার GIF হিসেবে সেভ করুন।",
+ "steps": [
+ "একটি অ্যানিমেটেড GIF বেছে নিন।",
+ "প্রিভিউ দেখুন এবং পেছনে কী থাকবে বেছে নিন।",
+ "সাইজ বেছে “GIF ডাউনলোড করুন”-এ ক্লিক করুন।"
+ ],
+ "faq": [
+ [
+ "আমার ফাইল কি কোথাও আপলোড হয়?",
+ "না। Fizzdoc পুরো কাজটা আপনার ব্রাউজার ট্যাবের ভেতরেই করে, WebAssembly ও JavaScript-এ কম্পাইল করা ওপেন-সোর্স ইঞ্জিন ব্যবহার করে। আপনার ফাইল আপনার ডিভাইস থেকে পড়া হয়, লোকালি প্রসেস হয়, আর ফলাফল সরাসরি আপনার ডিভাইসেই সেভ হয়। আপনি নিজেই যাচাই করতে পারেন: ব্রাউজারের ডেভেলপার টুলস খুলুন, Network ট্যাবে যান আর একটা কাজ চালান — কোনো রিকোয়েস্টে আপনার ফাইল যায় না।"
+ ],
+ [
+ "অ্যানিমেশনের সময় কি একই থাকবে?",
+ "হ্যাঁ। প্রতিটি ফ্রেম নিজের সময় রাখে এবং নতুন GIF মূলটির মতো লুপ করে।"
+ ],
+ [
+ "কিনারা PNG-এর চেয়ে ধারালো কেন?",
+ "GIF-এর পিক্সেল হয় পুরো স্বচ্ছ, নয়তো পুরো ভরাট। নরম কিনারার জন্য “কিছু না”-র বদলে পেছনে রং বা ছবি দিন।"
+ ],
+ [
+ "Fizzdoc কি ফ্রি?",
+ "হ্যাঁ, আর এটা সবসময় ফ্রি থাকবে: কোনো সাইন-আপ নেই, ওয়াটারমার্ক নেই, দৈনিক সীমা নেই, আর কোনো প্রিমিয়াম প্ল্যানও নেই। Fizzdoc Apache-2.0 লাইসেন্সের অধীনে ওপেন সোর্স, তাই যে কেউ নিজের কপি চালাতে পারে।"
+ ]
+ ],
+ "keywords": [
+ "GIF ব্যাকগ্রাউন্ড সরান",
+ "স্বচ্ছ GIF তৈরি",
+ "GIF ব্যাকগ্রাউন্ড রিমুভ ফ্রি",
+ "অ্যানিমেটেড GIF ব্যাকগ্রাউন্ড বদলান",
+ "remove gif background"
+ ]
}
}
}
diff --git a/src/i18n/de.json b/src/i18n/de.json
index 2c04f21..e01827d 100644
--- a/src/i18n/de.json
+++ b/src/i18n/de.json
@@ -322,7 +322,15 @@
"error.NO_AUDIO_TRACK": "Dieser Browser kann den Ton dieser Datei nicht lesen. Versuchen Sie eine MP3-, M4A-, WAV- oder MP4-Datei.",
"error.NO_SPEECH": "In dieser Datei wurde keine Sprache gefunden.",
"error.SETUP_FAILED": "Das Sprachmodell konnte nicht geladen werden. Prüfen Sie Ihre Internetverbindung für den einmaligen Download und versuchen Sie es erneut.",
- "error.TRANSCRIBE_FAILED": "Die Transkription wurde unerwartet beendet. Versuchen Sie eine kürzere Datei oder bei langen Aufnahmen einen Laptop."
+ "error.TRANSCRIBE_FAILED": "Die Transkription wurde unerwartet beendet. Versuchen Sie eine kürzere Datei oder bei langen Aufnahmen einen Laptop.",
+ "ws.chooseVideo": "Video auswählen",
+ "error.BAD_VIDEO": "Dieser Browser kann dieses Video nicht lesen. Versuchen Sie eine MP4- oder WebM-Datei oder das neueste Chrome oder Edge.",
+ "error.NO_VIDEO_ENCODER": "Dieser Browser kann keine Videos speichern. Bitte nutzen Sie das neueste Chrome, Edge oder Safari.",
+ "bg.frame": "Hintergrund wird entfernt: Bild {n} von {total}…",
+ "bg.gifNote": "Animiertes GIF: Jedes Bild wird bearbeitet und als GIF gespeichert. GIFs haben keine weichen Kanten, daher wirkt der Umriss bei „Keiner“ etwas schärfer.",
+ "bg.videoNote": "Das ist das erste Bild. Wählen Sie einen Hintergrund und speichern Sie: Jedes Bild wird auf diesem Gerät bearbeitet, hier etwa {min} Min. Lassen Sie diesen Tab offen.",
+ "bg.greenScreen": "Greenscreen",
+ "ws.dpiLow": "Niedrig (kleinste Datei, fürs Web)"
},
"home": {
"title": "Fizzdoc — Kostenlose PDF-, Bild-, Audio- & Office-Tools",
@@ -2844,6 +2852,84 @@
"ITR PDF öffnen",
"Einkommensteuer PDF entsperren"
]
+ },
+ "remove-video-background": {
+ "name": "Videohintergrund Entfernen",
+ "summary": "Eine Person aus einem Video freistellen und eine Farbe, Unschärfe oder ein Foto dahinter setzen. Mit Ton.",
+ "action": "Video herunterladen",
+ "title": "Videohintergrund Entfernen Kostenlos — Ohne Greenscreen | Fizzdoc",
+ "description": "Entfernen oder ändern Sie den Hintergrund eines Videos kostenlos, ohne Greenscreen: Farbe, Unschärfe oder Foto dahinter. Ton bleibt, kein Upload.",
+ "h1": "Hintergrund aus einem Video entfernen",
+ "lede": "Kein Greenscreen nötig. Eine KI bearbeitet jedes Bild auf Ihrem eigenen Gerät, der Ton bleibt, und Sie können eine Farbe, eine Unschärfe oder ein Foto dahinter setzen. Auf Handys klappen kurze Clips am besten.",
+ "steps": [
+ "Wählen Sie ein Video (MP4, WebM oder MOV).",
+ "Wählen Sie, was dahinter kommt – mit dem ersten Bild als Vorschau.",
+ "Klicken Sie auf „Video herunterladen“ und lassen Sie den Tab offen, bis jedes Bild fertig ist."
+ ],
+ "faq": [
+ [
+ "Werden meine Dateien irgendwohin hochgeladen?",
+ "Nein. Fizzdoc erledigt die Arbeit direkt in Ihrem Browser-Tab, mit Open-Source-Engines, die zu WebAssembly und JavaScript kompiliert sind. Ihre Datei wird von Ihrem Gerät gelesen, lokal verarbeitet, und das Ergebnis wird direkt wieder auf Ihrem Gerät gespeichert. Sie können das selbst überprüfen: Öffnen Sie die Entwicklertools Ihres Browsers, wechseln Sie zum Netzwerk-Tab und führen Sie einen Vorgang aus — keine Anfrage enthält Ihre Datei."
+ ],
+ [
+ "Wie lange dauert das?",
+ "Jedes Bild wird auf Ihrem Gerät bearbeitet, es hängt also von dessen Tempo ab. Fizzdoc zeigt vor dem Start eine Schätzung."
+ ],
+ [
+ "Kann ich das Ergebnis im Videoschnitt nutzen?",
+ "Ja. Wählen Sie „Greenscreen“, dann entfernt das Schnittprogramm das Grün mit einem Klick (Chroma Key). Videos werden als MP4 gespeichert, sonst als WebM."
+ ],
+ [
+ "Ist Fizzdoc kostenlos?",
+ "Ja, und das bleibt so: keine Anmeldung, kein Wasserzeichen, kein Tageslimit und keine Premium-Stufe. Fizzdoc ist Open Source unter der Apache-2.0-Lizenz, sodass jeder seine eigene Kopie betreiben kann."
+ ]
+ ],
+ "keywords": [
+ "Videohintergrund entfernen kostenlos",
+ "Video Hintergrund ändern",
+ "Hintergrund entfernen ohne Greenscreen",
+ "Video freistellen online",
+ "remove video background"
+ ]
+ },
+ "remove-gif-background": {
+ "name": "GIF-Hintergrund Entfernen",
+ "summary": "Den Hintergrund eines animierten GIFs Bild für Bild transparent oder neu einfärben.",
+ "action": "GIF herunterladen",
+ "title": "GIF-Hintergrund Entfernen Kostenlos — Transparentes GIF | Fizzdoc",
+ "description": "Entfernen Sie den Hintergrund eines animierten GIFs kostenlos: Jedes Bild wird auf Ihrem Gerät freigestellt und als transparentes GIF gespeichert. Ohne Upload.",
+ "h1": "Hintergrund aus einem GIF entfernen",
+ "lede": "Jedes Bild Ihres animierten GIFs wird von einer KI auf Ihrem eigenen Gerät freigestellt. Lassen Sie es transparent oder setzen Sie eine Farbe, Unschärfe oder ein Foto dahinter und speichern Sie es wieder als GIF.",
+ "steps": [
+ "Wählen Sie ein animiertes GIF.",
+ "Sehen Sie sich die Vorschau an und wählen Sie, was dahinter kommt.",
+ "Wählen Sie die Größe und klicken Sie auf „GIF herunterladen“."
+ ],
+ "faq": [
+ [
+ "Werden meine Dateien irgendwohin hochgeladen?",
+ "Nein. Fizzdoc erledigt die Arbeit direkt in Ihrem Browser-Tab, mit Open-Source-Engines, die zu WebAssembly und JavaScript kompiliert sind. Ihre Datei wird von Ihrem Gerät gelesen, lokal verarbeitet, und das Ergebnis wird direkt wieder auf Ihrem Gerät gespeichert. Sie können das selbst überprüfen: Öffnen Sie die Entwicklertools Ihres Browsers, wechseln Sie zum Netzwerk-Tab und führen Sie einen Vorgang aus — keine Anfrage enthält Ihre Datei."
+ ],
+ [
+ "Bleibt das Timing der Animation erhalten?",
+ "Ja. Jedes Bild behält seine Dauer, und das neue GIF läuft in Schleife wie das Original."
+ ],
+ [
+ "Warum sind die Kanten schärfer als bei PNG?",
+ "Ein GIF-Pixel ist entweder ganz durchsichtig oder ganz deckend. Für weiche Kanten wählen Sie statt „Keiner“ eine Farbe oder ein Foto."
+ ],
+ [
+ "Ist Fizzdoc kostenlos?",
+ "Ja, und das bleibt so: keine Anmeldung, kein Wasserzeichen, kein Tageslimit und keine Premium-Stufe. Fizzdoc ist Open Source unter der Apache-2.0-Lizenz, sodass jeder seine eigene Kopie betreiben kann."
+ ]
+ ],
+ "keywords": [
+ "GIF Hintergrund entfernen",
+ "GIF transparent machen",
+ "animiertes GIF Hintergrund entfernen",
+ "GIF Hintergrund ändern",
+ "remove gif background"
+ ]
}
}
}
diff --git a/src/i18n/es.json b/src/i18n/es.json
index 13aaab3..5840d50 100644
--- a/src/i18n/es.json
+++ b/src/i18n/es.json
@@ -322,7 +322,15 @@
"error.NO_AUDIO_TRACK": "Este navegador no puede leer el sonido de este archivo. Prueba con un archivo MP3, M4A, WAV o MP4.",
"error.NO_SPEECH": "No se encontró voz en este archivo.",
"error.SETUP_FAILED": "No se pudo cargar el modelo de voz. Revisa tu conexión a internet para la descarga única e inténtalo de nuevo.",
- "error.TRANSCRIBE_FAILED": "La transcripción se detuvo de forma inesperada. Prueba con un archivo más corto, o con un portátil para grabaciones largas."
+ "error.TRANSCRIBE_FAILED": "La transcripción se detuvo de forma inesperada. Prueba con un archivo más corto, o con un portátil para grabaciones largas.",
+ "ws.chooseVideo": "Elige un vídeo",
+ "error.BAD_VIDEO": "Este navegador no puede leer este vídeo. Prueba un archivo MP4 o WebM, o la última versión de Chrome o Edge.",
+ "error.NO_VIDEO_ENCODER": "Este navegador no puede guardar vídeos. Usa la última versión de Chrome, Edge o Safari.",
+ "bg.frame": "Quitando el fondo: fotograma {n} de {total}…",
+ "bg.gifNote": "GIF animado: se procesa cada fotograma y se guarda como GIF. Los GIF no admiten bordes suaves, así que con “Ninguno” el contorno se ve algo más nítido.",
+ "bg.videoNote": "Este es el primer fotograma. Elige un fondo y guarda: cada fotograma se procesa en este dispositivo, unos {min} min aquí. Deja esta pestaña abierta.",
+ "bg.greenScreen": "Pantalla verde",
+ "ws.dpiLow": "Baja (archivo más pequeño, para la web)"
},
"home": {
"title": "Fizzdoc — Herramientas Gratis de PDF, Imagen, Audio y Office",
@@ -2844,6 +2852,84 @@
"abrir PDF de ITR",
"desbloquear PDF impuesto sobre la renta"
]
+ },
+ "remove-video-background": {
+ "name": "Quitar Fondo de Vídeo",
+ "summary": "Recorta a una persona de un vídeo y pon detrás un color, un desenfoque o una foto. Con sonido.",
+ "action": "Descargar vídeo",
+ "title": "Quitar Fondo de Vídeo Gratis — Sin Pantalla Verde ni Subidas | Fizzdoc",
+ "description": "Quita o cambia el fondo de un vídeo gratis, sin pantalla verde: pon un color, un desenfoque o una foto detrás. El sonido se mantiene y no se sube nada.",
+ "h1": "Quita el fondo de un vídeo",
+ "lede": "No hace falta pantalla verde. Una IA procesa cada fotograma en tu propio dispositivo, el sonido se mantiene y puedes poner detrás un color, un desenfoque o una foto. En móviles van mejor los clips cortos.",
+ "steps": [
+ "Elige un vídeo (MP4, WebM o MOV).",
+ "Elige qué va detrás, con el primer fotograma como vista previa.",
+ "Pulsa “Descargar vídeo” y deja la pestaña abierta mientras se procesa cada fotograma."
+ ],
+ "faq": [
+ [
+ "¿Se suben mis archivos a algún sitio?",
+ "No. Fizzdoc hace todo el trabajo dentro de la pestaña de tu navegador, con motores de código abierto compilados a WebAssembly y JavaScript. Tu archivo se lee desde tu dispositivo, se procesa localmente y el resultado se guarda directamente en tu dispositivo. Puedes comprobarlo tú mismo: abre las herramientas de desarrollador de tu navegador, ve a la pestaña Red y ejecuta una tarea — ninguna solicitud lleva tu archivo."
+ ],
+ [
+ "¿Cuánto tarda?",
+ "Cada fotograma se procesa en tu dispositivo, así que depende de su velocidad. Fizzdoc muestra una estimación antes de empezar."
+ ],
+ [
+ "¿Puedo usar el recorte en un editor de vídeo?",
+ "Sí. Elige “Pantalla verde” y el editor podrá quitar el verde con un clic (croma). Los vídeos se guardan en MP4 si el navegador puede; si no, en WebM."
+ ],
+ [
+ "¿Es gratis Fizzdoc?",
+ "Sí, y seguirá siendo gratis: sin registro, sin marca de agua, sin límite diario y sin plan premium. Fizzdoc es de código abierto bajo la licencia Apache-2.0, así que cualquiera puede ejecutar su propia copia."
+ ]
+ ],
+ "keywords": [
+ "quitar fondo de video gratis",
+ "cambiar fondo de video",
+ "quitar fondo de video sin pantalla verde",
+ "eliminar fondo de video online",
+ "remove video background"
+ ]
+ },
+ "remove-gif-background": {
+ "name": "Quitar Fondo de GIF",
+ "summary": "Deja transparente o de otro color el fondo de un GIF animado, fotograma a fotograma.",
+ "action": "Descargar GIF",
+ "title": "Quitar Fondo de GIF Gratis — GIF Animado Transparente | Fizzdoc",
+ "description": "Quita el fondo de un GIF animado gratis: cada fotograma se recorta en tu dispositivo y se guarda como GIF transparente o con otro color. No se sube nada.",
+ "h1": "Quita el fondo de un GIF",
+ "lede": "Una IA recorta cada fotograma de tu GIF animado en tu propio dispositivo. Déjalo transparente o pon detrás un color, un desenfoque o una foto, y guárdalo otra vez como GIF.",
+ "steps": [
+ "Elige un GIF animado.",
+ "Mira la vista previa y elige qué va detrás.",
+ "Elige el tamaño y pulsa “Descargar GIF”."
+ ],
+ "faq": [
+ [
+ "¿Se suben mis archivos a algún sitio?",
+ "No. Fizzdoc hace todo el trabajo dentro de la pestaña de tu navegador, con motores de código abierto compilados a WebAssembly y JavaScript. Tu archivo se lee desde tu dispositivo, se procesa localmente y el resultado se guarda directamente en tu dispositivo. Puedes comprobarlo tú mismo: abre las herramientas de desarrollador de tu navegador, ve a la pestaña Red y ejecuta una tarea — ninguna solicitud lleva tu archivo."
+ ],
+ [
+ "¿Se mantiene el ritmo de la animación?",
+ "Sí. Cada fotograma conserva su duración y el nuevo GIF se repite como el original."
+ ],
+ [
+ "¿Por qué los bordes son más nítidos que en un PNG?",
+ "Un píxel de GIF solo puede ser totalmente transparente o totalmente sólido. Para bordes suaves, pon detrás un color o una foto en vez de “Ninguno”."
+ ],
+ [
+ "¿Es gratis Fizzdoc?",
+ "Sí, y seguirá siendo gratis: sin registro, sin marca de agua, sin límite diario y sin plan premium. Fizzdoc es de código abierto bajo la licencia Apache-2.0, así que cualquiera puede ejecutar su propia copia."
+ ]
+ ],
+ "keywords": [
+ "quitar fondo de gif",
+ "hacer gif transparente",
+ "quitar fondo gif animado gratis",
+ "cambiar fondo de gif",
+ "remove gif background"
+ ]
}
}
}
diff --git a/src/i18n/fr.json b/src/i18n/fr.json
index 021450d..98fb647 100644
--- a/src/i18n/fr.json
+++ b/src/i18n/fr.json
@@ -322,7 +322,15 @@
"error.NO_AUDIO_TRACK": "Ce navigateur ne peut pas lire le son de ce fichier. Essayez un fichier MP3, M4A, WAV ou MP4.",
"error.NO_SPEECH": "Aucune parole n’a été trouvée dans ce fichier.",
"error.SETUP_FAILED": "Le modèle vocal n’a pas pu être chargé. Vérifiez votre connexion internet pour le téléchargement unique, puis réessayez.",
- "error.TRANSCRIBE_FAILED": "La transcription s’est arrêtée de façon inattendue. Essayez un fichier plus court, ou un ordinateur portable pour les longs enregistrements."
+ "error.TRANSCRIBE_FAILED": "La transcription s’est arrêtée de façon inattendue. Essayez un fichier plus court, ou un ordinateur portable pour les longs enregistrements.",
+ "ws.chooseVideo": "Choisir une vidéo",
+ "error.BAD_VIDEO": "Ce navigateur ne peut pas lire cette vidéo. Essayez un fichier MP4 ou WebM, ou la dernière version de Chrome ou Edge.",
+ "error.NO_VIDEO_ENCODER": "Ce navigateur ne peut pas enregistrer de vidéos. Utilisez la dernière version de Chrome, Edge ou Safari.",
+ "bg.frame": "Suppression du fond : image {n} sur {total}…",
+ "bg.gifNote": "GIF animé : chaque image est traitée et le résultat est enregistré en GIF. Les GIF n’ont pas de bords doux, donc avec « Aucun » le contour est un peu plus net.",
+ "bg.videoNote": "Voici la première image. Choisissez un fond, puis enregistrez : chaque image est traitée sur cet appareil, environ {min} min ici. Gardez cet onglet ouvert.",
+ "bg.greenScreen": "Fond vert",
+ "ws.dpiLow": "Basse (fichier le plus léger, pour le web)"
},
"home": {
"title": "Fizzdoc — Outils Gratuits PDF, Image, Audio et Office",
@@ -2844,6 +2852,84 @@
"ouvrir PDF ITR",
"déverrouiller PDF impôt sur le revenu"
]
+ },
+ "remove-video-background": {
+ "name": "Supprimer le Fond d’une Vidéo",
+ "summary": "Détourez une personne dans une vidéo et mettez une couleur, un flou ou une photo derrière. Son conservé.",
+ "action": "Télécharger la vidéo",
+ "title": "Supprimer le Fond d’une Vidéo Gratuit — Sans Fond Vert | Fizzdoc",
+ "description": "Supprimez ou changez le fond d’une vidéo gratuitement, sans fond vert : mettez une couleur, un flou ou une photo derrière. Le son est gardé, rien n’est envoyé.",
+ "h1": "Supprimer le fond d’une vidéo",
+ "lede": "Pas besoin de fond vert. Une IA traite chaque image sur votre propre appareil, le son est gardé, et vous pouvez mettre une couleur, un flou ou une photo derrière. Sur téléphone, préférez les clips courts.",
+ "steps": [
+ "Choisissez une vidéo (MP4, WebM ou MOV).",
+ "Choisissez ce qui va derrière, avec la première image en aperçu.",
+ "Cliquez sur « Télécharger la vidéo » et gardez l’onglet ouvert pendant le traitement."
+ ],
+ "faq": [
+ [
+ "Mes fichiers sont-ils envoyés quelque part ?",
+ "Non. Fizzdoc effectue tout le travail dans votre onglet de navigateur, grâce à des moteurs open source compilés en WebAssembly et en JavaScript. Votre fichier est lu depuis votre appareil, traité localement, puis le résultat est enregistré directement sur votre appareil. Vous pouvez le vérifier vous-même : ouvrez les outils de développement de votre navigateur, allez dans l'onglet Réseau et lancez une opération — aucune requête ne transporte votre fichier."
+ ],
+ [
+ "Combien de temps cela prend-il ?",
+ "Chaque image est traitée sur votre appareil, donc cela dépend de sa vitesse. Fizzdoc affiche une estimation avant de commencer."
+ ],
+ [
+ "Puis-je utiliser le détourage dans un logiciel de montage ?",
+ "Oui. Choisissez « Fond vert » : le logiciel retire le vert en un clic (incrustation). Les vidéos sont enregistrées en MP4 si possible, sinon en WebM."
+ ],
+ [
+ "Est-ce que Fizzdoc est gratuit ?",
+ "Oui, et ça restera gratuit : pas d'inscription, pas de filigrane, pas de limite quotidienne et pas d'offre premium. Fizzdoc est open source sous licence Apache-2.0, donc n'importe qui peut faire tourner sa propre copie."
+ ]
+ ],
+ "keywords": [
+ "supprimer le fond d’une vidéo gratuit",
+ "changer le fond d’une vidéo",
+ "enlever le fond vidéo sans fond vert",
+ "détourer une vidéo en ligne",
+ "remove video background"
+ ]
+ },
+ "remove-gif-background": {
+ "name": "Supprimer le Fond d’un GIF",
+ "summary": "Rendez transparent ou recolorez le fond d’un GIF animé, image par image.",
+ "action": "Télécharger le GIF",
+ "title": "Supprimer le Fond d’un GIF Gratuit — GIF Animé Transparent | Fizzdoc",
+ "description": "Supprimez le fond d’un GIF animé gratuitement : chaque image est détourée sur votre appareil et enregistrée en GIF transparent ou recoloré. Rien n’est envoyé.",
+ "h1": "Supprimer le fond d’un GIF",
+ "lede": "Chaque image de votre GIF animé est détourée par une IA sur votre propre appareil. Gardez-le transparent ou mettez une couleur, un flou ou une photo derrière, puis enregistrez-le en GIF.",
+ "steps": [
+ "Choisissez un GIF animé.",
+ "Regardez l’aperçu et choisissez ce qui va derrière.",
+ "Choisissez la taille et cliquez sur « Télécharger le GIF »."
+ ],
+ "faq": [
+ [
+ "Mes fichiers sont-ils envoyés quelque part ?",
+ "Non. Fizzdoc effectue tout le travail dans votre onglet de navigateur, grâce à des moteurs open source compilés en WebAssembly et en JavaScript. Votre fichier est lu depuis votre appareil, traité localement, puis le résultat est enregistré directement sur votre appareil. Vous pouvez le vérifier vous-même : ouvrez les outils de développement de votre navigateur, allez dans l'onglet Réseau et lancez une opération — aucune requête ne transporte votre fichier."
+ ],
+ [
+ "L’animation garde-t-elle son rythme ?",
+ "Oui. Chaque image garde sa durée et le nouveau GIF boucle comme l’original."
+ ],
+ [
+ "Pourquoi les bords sont-ils plus nets qu’en PNG ?",
+ "Un pixel de GIF est soit totalement transparent, soit totalement opaque. Pour des bords doux, mettez une couleur ou une photo derrière au lieu de « Aucun »."
+ ],
+ [
+ "Est-ce que Fizzdoc est gratuit ?",
+ "Oui, et ça restera gratuit : pas d'inscription, pas de filigrane, pas de limite quotidienne et pas d'offre premium. Fizzdoc est open source sous licence Apache-2.0, donc n'importe qui peut faire tourner sa propre copie."
+ ]
+ ],
+ "keywords": [
+ "supprimer le fond d’un gif",
+ "rendre un gif transparent",
+ "enlever le fond gif animé gratuit",
+ "changer le fond d’un gif",
+ "remove gif background"
+ ]
}
}
}
diff --git a/src/i18n/hi.json b/src/i18n/hi.json
index 9ab25c5..7f582cb 100644
--- a/src/i18n/hi.json
+++ b/src/i18n/hi.json
@@ -322,7 +322,15 @@
"error.NO_AUDIO_TRACK": "यह ब्राउज़र इस फ़ाइल की आवाज़ नहीं पढ़ पा रहा। MP3, M4A, WAV या MP4 फ़ाइल आज़माएँ।",
"error.NO_SPEECH": "इस फ़ाइल में कोई बोली हुई आवाज़ नहीं मिली।",
"error.SETUP_FAILED": "स्पीच मॉडल लोड नहीं हो सका। एक बार के डाउनलोड के लिए अपना इंटरनेट कनेक्शन जाँचें, फिर दोबारा कोशिश करें।",
- "error.TRANSCRIBE_FAILED": "ट्रांसक्रिप्शन अचानक रुक गया। छोटी फ़ाइल आज़माएँ, या लंबी रिकॉर्डिंग के लिए लैपटॉप इस्तेमाल करें।"
+ "error.TRANSCRIBE_FAILED": "ट्रांसक्रिप्शन अचानक रुक गया। छोटी फ़ाइल आज़माएँ, या लंबी रिकॉर्डिंग के लिए लैपटॉप इस्तेमाल करें।",
+ "ws.chooseVideo": "वीडियो चुनें",
+ "error.BAD_VIDEO": "यह ब्राउज़र यह वीडियो नहीं पढ़ सकता। MP4 या WebM फ़ाइल आज़माएँ, या नया Chrome या Edge।",
+ "error.NO_VIDEO_ENCODER": "यह ब्राउज़र वीडियो सेव नहीं कर सकता। कृपया नया Chrome, Edge या Safari इस्तेमाल करें।",
+ "bg.frame": "बैकग्राउंड हटाई जा रही है: फ़्रेम {n} / {total}…",
+ "bg.gifNote": "एनिमेटेड GIF: हर फ़्रेम पर काम होता है और यह GIF के रूप में सेव होता है। GIF में मुलायम किनारे नहीं होते, इसलिए “कुछ नहीं” पर किनारा थोड़ा तीखा दिखता है।",
+ "bg.videoNote": "यह पहला फ़्रेम है। बैकग्राउंड चुनें, फिर सेव करें: हर फ़्रेम इसी डिवाइस पर बनता है, जिसमें यहाँ लगभग {min} मिनट लगेंगे। यह टैब खुला रखें।",
+ "bg.greenScreen": "ग्रीन स्क्रीन",
+ "ws.dpiLow": "कम (सबसे छोटी फ़ाइल, वेब के लिए)"
},
"home": {
"title": "Fizzdoc — फ्री PDF, फोटो, ऑडियो और ऑफिस टूल्स, बिना अपलोड",
@@ -2844,6 +2852,84 @@
"ITR PDF कैसे खोलें",
"इनकम टैक्स PDF अनलॉक"
]
+ },
+ "remove-video-background": {
+ "name": "वीडियो बैकग्राउंड हटाएँ",
+ "summary": "वीडियो से व्यक्ति को अलग करें और पीछे रंग, धुंधलापन या फ़ोटो लगाएँ। आवाज़ साथ रहती है।",
+ "action": "वीडियो डाउनलोड करें",
+ "title": "वीडियो बैकग्राउंड हटाएँ फ्री — बिना ग्रीन स्क्रीन | Fizzdoc",
+ "description": "बिना ग्रीन स्क्रीन के वीडियो की बैकग्राउंड मुफ़्त में हटाएँ या बदलें: पीछे रंग, धुंधलापन या फ़ोटो लगाएँ। आवाज़ बनी रहती है और कुछ भी अपलोड नहीं होता।",
+ "h1": "वीडियो से बैकग्राउंड हटाएँ",
+ "lede": "ग्रीन स्क्रीन की ज़रूरत नहीं। हर फ़्रेम आपके अपने डिवाइस पर AI से बनता है, आवाज़ बनी रहती है, और पीछे रंग, धुंधलापन या फ़ोटो लगा सकते हैं। फ़ोन पर छोटे क्लिप सबसे अच्छे चलते हैं।",
+ "steps": [
+ "एक वीडियो चुनें (MP4, WebM या MOV)।",
+ "पहले फ़्रेम को देखकर चुनें कि पीछे क्या लगाना है।",
+ "“वीडियो डाउनलोड करें” पर क्लिक करें और हर फ़्रेम बनने तक टैब खुला रखें।"
+ ],
+ "faq": [
+ [
+ "क्या मेरी फ़ाइलें कहीं अपलोड होती हैं?",
+ "नहीं। Fizzdoc यह काम आपके ब्राउज़र टैब के अंदर ही करता है, ओपन-सोर्स इंजन की मदद से जो WebAssembly और JavaScript में कंपाइल किए गए हैं। आपकी फ़ाइल आपके डिवाइस से पढ़ी जाती है, लोकली प्रोसेस होती है, और नतीजा सीधे आपके डिवाइस पर सेव हो जाता है। आप खुद चेक कर सकते हैं: अपने ब्राउज़र के डेवलपर टूल्स खोलें, Network टैब पर जाएँ और कोई काम चलाएँ — कोई भी रिक्वेस्ट आपकी फ़ाइल नहीं ले जाती।"
+ ],
+ [
+ "कितना समय लगता है?",
+ "हर फ़्रेम आपके डिवाइस पर बनता है, इसलिए यह उसकी गति पर निर्भर है। Fizzdoc शुरू करने से पहले अनुमानित समय दिखाता है।"
+ ],
+ [
+ "क्या मैं इसे वीडियो एडिटर में इस्तेमाल कर सकता हूँ?",
+ "हाँ। “ग्रीन स्क्रीन” चुनें, फिर एडिटर में एक क्लिक में हरा रंग हटा सकते हैं (क्रोमा की)। वीडियो MP4 में, या WebM में सेव होता है।"
+ ],
+ [
+ "क्या Fizzdoc मुफ़्त है?",
+ "हाँ, और यह हमेशा फ्री रहेगा: कोई साइन-अप नहीं, कोई वॉटरमार्क नहीं, कोई डेली लिमिट नहीं और कोई प्रीमियम प्लान नहीं। Fizzdoc, Apache-2.0 लाइसेंस के तहत ओपन सोर्स है, इसलिए कोई भी अपनी खुद की कॉपी चला सकता है।"
+ ]
+ ],
+ "keywords": [
+ "वीडियो बैकग्राउंड हटाएँ",
+ "वीडियो बैकग्राउंड बदलें",
+ "बिना ग्रीन स्क्रीन वीडियो बैकग्राउंड",
+ "वीडियो बैकग्राउंड रिमूव फ्री",
+ "remove video background"
+ ]
+ },
+ "remove-gif-background": {
+ "name": "GIF बैकग्राउंड हटाएँ",
+ "summary": "एनिमेटेड GIF की बैकग्राउंड हर फ़्रेम में पारदर्शी या नए रंग की बनाएँ।",
+ "action": "GIF डाउनलोड करें",
+ "title": "GIF बैकग्राउंड हटाएँ फ्री — पारदर्शी एनिमेटेड GIF | Fizzdoc",
+ "description": "एनिमेटेड GIF की बैकग्राउंड मुफ़्त में हटाएँ: हर फ़्रेम आपके डिवाइस पर काटा जाता है और पारदर्शी या नए रंग वाली GIF में सेव होता है। कुछ अपलोड नहीं होता।",
+ "h1": "GIF से बैकग्राउंड हटाएँ",
+ "lede": "आपकी एनिमेटेड GIF का हर फ़्रेम आपके अपने डिवाइस पर AI से काटा जाता है। उसे पारदर्शी रखें या पीछे रंग, धुंधलापन या फ़ोटो लगाएँ और फिर GIF में सेव करें।",
+ "steps": [
+ "एक एनिमेटेड GIF चुनें।",
+ "प्रीव्यू देखें और चुनें कि पीछे क्या लगाना है।",
+ "साइज़ चुनें और “GIF डाउनलोड करें” पर क्लिक करें।"
+ ],
+ "faq": [
+ [
+ "क्या मेरी फ़ाइलें कहीं अपलोड होती हैं?",
+ "नहीं। Fizzdoc यह काम आपके ब्राउज़र टैब के अंदर ही करता है, ओपन-सोर्स इंजन की मदद से जो WebAssembly और JavaScript में कंपाइल किए गए हैं। आपकी फ़ाइल आपके डिवाइस से पढ़ी जाती है, लोकली प्रोसेस होती है, और नतीजा सीधे आपके डिवाइस पर सेव हो जाता है। आप खुद चेक कर सकते हैं: अपने ब्राउज़र के डेवलपर टूल्स खोलें, Network टैब पर जाएँ और कोई काम चलाएँ — कोई भी रिक्वेस्ट आपकी फ़ाइल नहीं ले जाती।"
+ ],
+ [
+ "क्या एनिमेशन की टाइमिंग वही रहेगी?",
+ "हाँ। हर फ़्रेम का अपना समय बना रहता है और नई GIF मूल की तरह लूप करती है।"
+ ],
+ [
+ "किनारे PNG से थोड़े तीखे क्यों हैं?",
+ "GIF का पिक्सल या तो पूरा पारदर्शी होता है या पूरा ठोस, इसलिए मुलायम किनारे नहीं रहते। मुलायम किनारों के लिए पीछे रंग या फ़ोटो चुनें।"
+ ],
+ [
+ "क्या Fizzdoc मुफ़्त है?",
+ "हाँ, और यह हमेशा फ्री रहेगा: कोई साइन-अप नहीं, कोई वॉटरमार्क नहीं, कोई डेली लिमिट नहीं और कोई प्रीमियम प्लान नहीं। Fizzdoc, Apache-2.0 लाइसेंस के तहत ओपन सोर्स है, इसलिए कोई भी अपनी खुद की कॉपी चला सकता है।"
+ ]
+ ],
+ "keywords": [
+ "GIF बैकग्राउंड हटाएँ",
+ "पारदर्शी GIF बनाएँ",
+ "GIF बैकग्राउंड रिमूव फ्री",
+ "एनिमेटेड GIF बैकग्राउंड बदलें",
+ "remove gif background"
+ ]
}
}
}
diff --git a/src/i18n/id.json b/src/i18n/id.json
index 143905c..ac75e6b 100644
--- a/src/i18n/id.json
+++ b/src/i18n/id.json
@@ -322,7 +322,15 @@
"error.NO_AUDIO_TRACK": "Browser ini tidak bisa membaca suara di file ini. Coba file MP3, M4A, WAV, atau MP4.",
"error.NO_SPEECH": "Tidak ada ucapan yang ditemukan di file ini.",
"error.SETUP_FAILED": "Model suara tidak bisa dimuat. Periksa koneksi internet Anda untuk unduhan satu kali, lalu coba lagi.",
- "error.TRANSCRIBE_FAILED": "Transkripsi berhenti tiba-tiba. Coba file yang lebih pendek, atau gunakan laptop untuk rekaman panjang."
+ "error.TRANSCRIBE_FAILED": "Transkripsi berhenti tiba-tiba. Coba file yang lebih pendek, atau gunakan laptop untuk rekaman panjang.",
+ "ws.chooseVideo": "Pilih video",
+ "error.BAD_VIDEO": "Browser ini tidak bisa membaca video ini. Coba file MP4 atau WebM, atau Chrome atau Edge terbaru.",
+ "error.NO_VIDEO_ENCODER": "Browser ini tidak bisa menyimpan video. Gunakan Chrome, Edge, atau Safari terbaru.",
+ "bg.frame": "Menghapus latar: bingkai {n} dari {total}…",
+ "bg.gifNote": "GIF animasi: setiap bingkai diproses dan disimpan sebagai GIF. GIF tidak punya tepi halus, jadi pada “Tidak ada” garis tepinya sedikit lebih tajam.",
+ "bg.videoNote": "Ini bingkai pertama. Pilih latar lalu simpan: setiap bingkai diproses di perangkat ini, sekitar {min} menit di sini. Biarkan tab ini terbuka.",
+ "bg.greenScreen": "Layar hijau",
+ "ws.dpiLow": "Rendah (file terkecil, untuk web)"
},
"home": {
"title": "Fizzdoc — Alat PDF, Gambar, Audio & Office Gratis. Tanpa Upload.",
@@ -2844,6 +2852,84 @@
"buka pdf ITR",
"buka kunci pdf pajak penghasilan"
]
+ },
+ "remove-video-background": {
+ "name": "Hapus Latar Belakang Video",
+ "summary": "Pisahkan orang dari video dan beri warna, blur, atau foto di belakangnya. Suara tetap ada.",
+ "action": "Unduh video",
+ "title": "Hapus Latar Belakang Video Gratis — Tanpa Layar Hijau | Fizzdoc",
+ "description": "Hapus atau ganti latar belakang video secara gratis, tanpa layar hijau: beri warna, blur, atau foto di belakang. Suara tetap ada dan tidak ada yang diunggah.",
+ "h1": "Hapus latar belakang dari video",
+ "lede": "Tidak perlu layar hijau. AI memproses setiap bingkai di perangkat Anda sendiri, suara tetap ada, dan Anda bisa memberi warna, blur, atau foto di belakang. Di ponsel, klip pendek paling cocok.",
+ "steps": [
+ "Pilih video (MP4, WebM, atau MOV).",
+ "Pilih latar belakangnya, dengan bingkai pertama sebagai pratinjau.",
+ "Klik “Unduh video” dan biarkan tab terbuka sampai semua bingkai selesai."
+ ],
+ "faq": [
+ [
+ "Apakah file saya diunggah ke suatu tempat?",
+ "Tidak. Fizzdoc melakukan semua proses di dalam tab browser Anda, menggunakan mesin open source yang dikompilasi ke WebAssembly dan JavaScript. File Anda dibaca dari perangkat Anda, diproses secara lokal, dan hasilnya langsung disimpan kembali ke perangkat Anda. Anda bisa membuktikannya sendiri: buka developer tools browser Anda, lihat tab Network, lalu jalankan sebuah proses — tidak ada request yang membawa file Anda."
+ ],
+ [
+ "Berapa lama prosesnya?",
+ "Setiap bingkai diproses di perangkat Anda, jadi tergantung kecepatannya. Fizzdoc menampilkan perkiraan sebelum mulai."
+ ],
+ [
+ "Bisakah hasilnya dipakai di editor video?",
+ "Bisa. Pilih “Layar hijau”, lalu editor bisa menghapus hijaunya dengan satu klik (chroma key). Video disimpan sebagai MP4 jika bisa, jika tidak sebagai WebM."
+ ],
+ [
+ "Apakah Fizzdoc gratis?",
+ "Ya, dan akan tetap gratis: tanpa daftar, tanpa watermark, tanpa batas harian, dan tanpa paket berbayar. Fizzdoc adalah open source di bawah lisensi Apache-2.0, jadi siapa pun bisa menjalankan salinannya sendiri."
+ ]
+ ],
+ "keywords": [
+ "hapus background video gratis",
+ "ganti background video",
+ "hapus background video tanpa green screen",
+ "menghilangkan latar video online",
+ "remove video background"
+ ]
+ },
+ "remove-gif-background": {
+ "name": "Hapus Latar Belakang GIF",
+ "summary": "Buat latar GIF animasi transparan atau berwarna baru, bingkai demi bingkai.",
+ "action": "Unduh GIF",
+ "title": "Hapus Latar Belakang GIF Gratis — GIF Animasi Transparan | Fizzdoc",
+ "description": "Hapus latar belakang GIF animasi secara gratis: setiap bingkai dipotong di perangkat Anda dan disimpan sebagai GIF transparan atau berwarna. Tanpa unggah.",
+ "h1": "Hapus latar belakang dari GIF",
+ "lede": "Setiap bingkai GIF animasi Anda dipotong oleh AI di perangkat Anda sendiri. Biarkan transparan atau beri warna, blur, atau foto di belakang, lalu simpan lagi sebagai GIF.",
+ "steps": [
+ "Pilih GIF animasi.",
+ "Lihat pratinjau dan pilih latar belakangnya.",
+ "Pilih ukuran lalu klik “Unduh GIF”."
+ ],
+ "faq": [
+ [
+ "Apakah file saya diunggah ke suatu tempat?",
+ "Tidak. Fizzdoc melakukan semua proses di dalam tab browser Anda, menggunakan mesin open source yang dikompilasi ke WebAssembly dan JavaScript. File Anda dibaca dari perangkat Anda, diproses secara lokal, dan hasilnya langsung disimpan kembali ke perangkat Anda. Anda bisa membuktikannya sendiri: buka developer tools browser Anda, lihat tab Network, lalu jalankan sebuah proses — tidak ada request yang membawa file Anda."
+ ],
+ [
+ "Apakah waktu animasinya tetap sama?",
+ "Ya. Setiap bingkai mempertahankan durasinya dan GIF baru berulang seperti aslinya."
+ ],
+ [
+ "Kenapa tepinya lebih tajam daripada PNG?",
+ "Piksel GIF hanya bisa transparan penuh atau padat penuh. Untuk tepi halus, pilih warna atau foto di belakang, bukan “Tidak ada”."
+ ],
+ [
+ "Apakah Fizzdoc gratis?",
+ "Ya, dan akan tetap gratis: tanpa daftar, tanpa watermark, tanpa batas harian, dan tanpa paket berbayar. Fizzdoc adalah open source di bawah lisensi Apache-2.0, jadi siapa pun bisa menjalankan salinannya sendiri."
+ ]
+ ],
+ "keywords": [
+ "hapus background gif",
+ "buat gif transparan",
+ "hapus latar gif animasi gratis",
+ "ganti background gif",
+ "remove gif background"
+ ]
}
}
}
diff --git a/src/i18n/it.json b/src/i18n/it.json
index 5c42ead..793b560 100644
--- a/src/i18n/it.json
+++ b/src/i18n/it.json
@@ -322,7 +322,15 @@
"error.NO_AUDIO_TRACK": "Questo browser non riesce a leggere l’audio di questo file. Prova con un file MP3, M4A, WAV o MP4.",
"error.NO_SPEECH": "Nessun parlato trovato in questo file.",
"error.SETUP_FAILED": "Non è stato possibile caricare il modello vocale. Controlla la connessione a internet per il download una tantum e riprova.",
- "error.TRANSCRIBE_FAILED": "La trascrizione si è interrotta inaspettatamente. Prova con un file più breve, o con un portatile per le registrazioni lunghe."
+ "error.TRANSCRIBE_FAILED": "La trascrizione si è interrotta inaspettatamente. Prova con un file più breve, o con un portatile per le registrazioni lunghe.",
+ "ws.chooseVideo": "Scegli un video",
+ "error.BAD_VIDEO": "Questo browser non riesce a leggere questo video. Prova un file MP4 o WebM, o l’ultima versione di Chrome o Edge.",
+ "error.NO_VIDEO_ENCODER": "Questo browser non può salvare video. Usa l’ultima versione di Chrome, Edge o Safari.",
+ "bg.frame": "Rimozione dello sfondo: fotogramma {n} di {total}…",
+ "bg.gifNote": "GIF animata: ogni fotogramma viene elaborato e salvato come GIF. Le GIF non hanno bordi morbidi, quindi con “Nessuno” il contorno è un po’ più netto.",
+ "bg.videoNote": "Questo è il primo fotogramma. Scegli uno sfondo e salva: ogni fotogramma viene elaborato su questo dispositivo, circa {min} min qui. Tieni aperta questa scheda.",
+ "bg.greenScreen": "Green screen",
+ "ws.dpiLow": "Bassa (file più piccolo, per il web)"
},
"home": {
"title": "Fizzdoc — Strumenti Gratis per PDF, Immagini e Audio",
@@ -2844,6 +2852,84 @@
"aprire PDF ITR",
"sbloccare PDF imposte sul reddito"
]
+ },
+ "remove-video-background": {
+ "name": "Rimuovi Sfondo da Video",
+ "summary": "Scontorna una persona in un video e metti dietro un colore, una sfocatura o una foto. Audio incluso.",
+ "action": "Scarica video",
+ "title": "Rimuovi Sfondo da Video Gratis — Senza Green Screen | Fizzdoc",
+ "description": "Rimuovi o cambia lo sfondo di un video gratis, senza green screen: metti dietro un colore, una sfocatura o una foto. L’audio resta e nulla viene caricato.",
+ "h1": "Rimuovi lo sfondo da un video",
+ "lede": "Niente green screen. Un’IA elabora ogni fotogramma sul tuo dispositivo, l’audio resta e puoi mettere dietro un colore, una sfocatura o una foto. Sui telefoni funzionano meglio le clip brevi.",
+ "steps": [
+ "Scegli un video (MP4, WebM o MOV).",
+ "Scegli cosa mettere dietro, con il primo fotogramma come anteprima.",
+ "Fai clic su “Scarica video” e tieni aperta la scheda durante l’elaborazione."
+ ],
+ "faq": [
+ [
+ "I miei file vengono caricati da qualche parte?",
+ "No. Fizzdoc esegue il lavoro direttamente nella scheda del browser, usando motori open source compilati in WebAssembly e JavaScript. Il file viene letto dal tuo dispositivo, elaborato in locale, e il risultato viene salvato di nuovo sul tuo dispositivo. Puoi verificarlo tu stesso: apri gli strumenti per sviluppatori del browser, vai alla scheda Rete ed esegui un'operazione — nessuna richiesta trasporta il tuo file."
+ ],
+ [
+ "Quanto tempo ci vuole?",
+ "Ogni fotogramma è elaborato sul tuo dispositivo, quindi dipende dalla sua velocità. Fizzdoc mostra una stima prima di iniziare."
+ ],
+ [
+ "Posso usare lo scontorno in un editor video?",
+ "Sì. Scegli “Green screen” e l’editor toglie il verde con un clic (chroma key). I video si salvano in MP4 se possibile, altrimenti in WebM."
+ ],
+ [
+ "Fizzdoc è gratuito?",
+ "Sì, e resterà gratuito: niente registrazione, niente filigrana, nessun limite giornaliero e nessun piano premium. Fizzdoc è open source con licenza Apache-2.0, quindi chiunque può eseguire la propria copia."
+ ]
+ ],
+ "keywords": [
+ "rimuovere sfondo video gratis",
+ "cambiare sfondo video",
+ "togliere sfondo video senza green screen",
+ "scontornare video online",
+ "remove video background"
+ ]
+ },
+ "remove-gif-background": {
+ "name": "Rimuovi Sfondo da GIF",
+ "summary": "Rendi trasparente o di un altro colore lo sfondo di una GIF animata, fotogramma per fotogramma.",
+ "action": "Scarica GIF",
+ "title": "Rimuovi Sfondo da GIF Gratis — GIF Animata Trasparente | Fizzdoc",
+ "description": "Rimuovi lo sfondo da una GIF animata gratis: ogni fotogramma è scontornato sul tuo dispositivo e salvato come GIF trasparente o ricolorata. Niente upload.",
+ "h1": "Rimuovi lo sfondo da una GIF",
+ "lede": "Ogni fotogramma della tua GIF animata viene scontornato da un’IA sul tuo dispositivo. Lasciala trasparente o metti dietro un colore, una sfocatura o una foto, e salvala di nuovo come GIF.",
+ "steps": [
+ "Scegli una GIF animata.",
+ "Guarda l’anteprima e scegli cosa mettere dietro.",
+ "Scegli la dimensione e fai clic su “Scarica GIF”."
+ ],
+ "faq": [
+ [
+ "I miei file vengono caricati da qualche parte?",
+ "No. Fizzdoc esegue il lavoro direttamente nella scheda del browser, usando motori open source compilati in WebAssembly e JavaScript. Il file viene letto dal tuo dispositivo, elaborato in locale, e il risultato viene salvato di nuovo sul tuo dispositivo. Puoi verificarlo tu stesso: apri gli strumenti per sviluppatori del browser, vai alla scheda Rete ed esegui un'operazione — nessuna richiesta trasporta il tuo file."
+ ],
+ [
+ "L’animazione mantiene i tempi?",
+ "Sì. Ogni fotogramma mantiene la sua durata e la nuova GIF si ripete come l’originale."
+ ],
+ [
+ "Perché i bordi sono più netti che in un PNG?",
+ "Un pixel GIF può essere solo del tutto trasparente o del tutto pieno. Per bordi morbidi metti dietro un colore o una foto invece di “Nessuno”."
+ ],
+ [
+ "Fizzdoc è gratuito?",
+ "Sì, e resterà gratuito: niente registrazione, niente filigrana, nessun limite giornaliero e nessun piano premium. Fizzdoc è open source con licenza Apache-2.0, quindi chiunque può eseguire la propria copia."
+ ]
+ ],
+ "keywords": [
+ "rimuovere sfondo gif",
+ "rendere gif trasparente",
+ "togliere sfondo gif animata gratis",
+ "cambiare sfondo gif",
+ "remove gif background"
+ ]
}
}
}
diff --git a/src/i18n/mr.json b/src/i18n/mr.json
index 9a468ad..c70539d 100644
--- a/src/i18n/mr.json
+++ b/src/i18n/mr.json
@@ -322,7 +322,15 @@
"error.NO_AUDIO_TRACK": "हा ब्राउझर या फाइलमधील आवाज वाचू शकत नाही. MP3, M4A, WAV किंवा MP4 फाइल वापरून पहा.",
"error.NO_SPEECH": "या फाइलमध्ये कोणतेही बोलणे सापडले नाही.",
"error.SETUP_FAILED": "स्पीच मॉडेल लोड होऊ शकले नाही. एकदाच होणाऱ्या डाउनलोडसाठी इंटरनेट कनेक्शन तपासा, मग पुन्हा प्रयत्न करा.",
- "error.TRANSCRIBE_FAILED": "ट्रान्स्क्रिप्शन अचानक थांबले. लहान फाइल वापरून पहा, किंवा लांब रेकॉर्डिंगसाठी लॅपटॉप वापरा."
+ "error.TRANSCRIBE_FAILED": "ट्रान्स्क्रिप्शन अचानक थांबले. लहान फाइल वापरून पहा, किंवा लांब रेकॉर्डिंगसाठी लॅपटॉप वापरा.",
+ "ws.chooseVideo": "व्हिडिओ निवडा",
+ "error.BAD_VIDEO": "हा ब्राउझर हा व्हिडिओ वाचू शकत नाही. MP4 किंवा WebM फाइल वापरून पहा, किंवा नवीन Chrome किंवा Edge.",
+ "error.NO_VIDEO_ENCODER": "हा ब्राउझर व्हिडिओ सेव्ह करू शकत नाही. कृपया नवीन Chrome, Edge किंवा Safari वापरा.",
+ "bg.frame": "बॅकग्राउंड काढत आहे: फ्रेम {n} / {total}…",
+ "bg.gifNote": "ॲनिमेटेड GIF: प्रत्येक फ्रेमवर काम होते आणि ते GIF म्हणून सेव्ह होते. GIF मध्ये मऊ कडा नसतात, म्हणून “काहीही नाही” वर कडा थोडी तीक्ष्ण दिसते.",
+ "bg.videoNote": "ही पहिली फ्रेम आहे. बॅकग्राउंड निवडा, मग सेव्ह करा: प्रत्येक फ्रेम याच डिव्हाइसवर बनते, इथे सुमारे {min} मिनिटे लागतील. हा टॅब उघडा ठेवा.",
+ "bg.greenScreen": "ग्रीन स्क्रीन",
+ "ws.dpiLow": "कमी (सर्वात लहान फाइल, वेबसाठी)"
},
"home": {
"title": "Fizzdoc — मोफत PDF, फोटो, ऑडिओ आणि ऑफिस टूल्स, विना अपलोड",
@@ -2844,6 +2852,84 @@
"ITR PDF कसा उघडावा",
"आयकर PDF अनलॉक"
]
+ },
+ "remove-video-background": {
+ "name": "व्हिडिओ बॅकग्राउंड काढा",
+ "summary": "व्हिडिओतून व्यक्तीला वेगळे करा आणि मागे रंग, धूसरपणा किंवा फोटो लावा. आवाज राहतो.",
+ "action": "व्हिडिओ डाउनलोड करा",
+ "title": "व्हिडिओ बॅकग्राउंड काढा मोफत — ग्रीन स्क्रीनशिवाय | Fizzdoc",
+ "description": "ग्रीन स्क्रीनशिवाय व्हिडिओची बॅकग्राउंड मोफत काढा किंवा बदला: मागे रंग, धूसरपणा किंवा फोटो लावा. आवाज राहतो आणि काहीही अपलोड होत नाही.",
+ "h1": "व्हिडिओतून बॅकग्राउंड काढा",
+ "lede": "ग्रीन स्क्रीनची गरज नाही. प्रत्येक फ्रेम तुमच्या स्वतःच्या डिव्हाइसवर AI ने बनते, आवाज राहतो, आणि मागे रंग, धूसरपणा किंवा फोटो लावू शकता. फोनवर छोट्या क्लिप सर्वोत्तम चालतात.",
+ "steps": [
+ "एक व्हिडिओ निवडा (MP4, WebM किंवा MOV).",
+ "पहिली फ्रेम पाहून मागे काय लावायचे ते निवडा.",
+ "“व्हिडिओ डाउनलोड करा” वर क्लिक करा आणि सर्व फ्रेम होईपर्यंत टॅब उघडा ठेवा."
+ ],
+ "faq": [
+ [
+ "माझ्या फाइल्स कुठेही अपलोड होतात का?",
+ "नाही. Fizzdoc हे काम तुमच्या ब्राउझर टॅबमध्येच करतो, WebAssembly आणि JavaScript मध्ये कंपाइल केलेल्या ओपन-सोर्स इंजिनांचा वापर करून. तुमची फाइल तुमच्या डिव्हाइसवरून वाचली जाते, स्थानिक पातळीवर प्रोसेस होते आणि निकाल थेट तुमच्या डिव्हाइसवर सेव्ह होतो. हे तुम्ही स्वतः पडताळून पाहू शकता: ब्राउझरचे डेव्हलपर टूल्स उघडा, Network टॅबवर जा आणि एखादे काम चालवा — कोणतीही रिक्वेस्ट तुमची फाइल घेऊन जात नाही."
+ ],
+ [
+ "किती वेळ लागतो?",
+ "प्रत्येक फ्रेम तुमच्या डिव्हाइसवर बनते, म्हणून ते त्याच्या वेगावर अवलंबून आहे. Fizzdoc सुरू करण्यापूर्वी अंदाजे वेळ दाखवते."
+ ],
+ [
+ "हे व्हिडिओ एडिटरमध्ये वापरता येईल का?",
+ "हो. “ग्रीन स्क्रीन” निवडा, मग एडिटरमध्ये एका क्लिकने हिरवा रंग काढता येतो (क्रोमा की). व्हिडिओ MP4 मध्ये, नाहीतर WebM मध्ये सेव्ह होतो."
+ ],
+ [
+ "Fizzdoc मोफत आहे का?",
+ "होय, आणि हा कायम मोफत राहील: साइन-अप नाही, वॉटरमार्क नाही, रोजची मर्यादा नाही आणि प्रीमियम प्लॅनही नाही. Fizzdoc हा Apache-2.0 लायसन्स अंतर्गत ओपन सोर्स आहे, त्यामुळे कोणीही स्वतःची कॉपी चालवू शकतो."
+ ]
+ ],
+ "keywords": [
+ "व्हिडिओ बॅकग्राउंड काढा",
+ "व्हिडिओ बॅकग्राउंड बदला",
+ "ग्रीन स्क्रीनशिवाय व्हिडिओ बॅकग्राउंड",
+ "व्हिडिओ बॅकग्राउंड रिमूव्ह मोफत",
+ "remove video background"
+ ]
+ },
+ "remove-gif-background": {
+ "name": "GIF बॅकग्राउंड काढा",
+ "summary": "ॲनिमेटेड GIF ची बॅकग्राउंड प्रत्येक फ्रेममध्ये पारदर्शक किंवा नव्या रंगाची करा.",
+ "action": "GIF डाउनलोड करा",
+ "title": "GIF बॅकग्राउंड काढा मोफत — पारदर्शक ॲनिमेटेड GIF | Fizzdoc",
+ "description": "ॲनिमेटेड GIF ची बॅकग्राउंड मोफत काढा: प्रत्येक फ्रेम तुमच्या डिव्हाइसवर कापली जाते आणि पारदर्शक किंवा नव्या रंगाच्या GIF मध्ये सेव्ह होते. काहीही अपलोड नाही.",
+ "h1": "GIF मधून बॅकग्राउंड काढा",
+ "lede": "तुमच्या ॲनिमेटेड GIF ची प्रत्येक फ्रेम तुमच्या स्वतःच्या डिव्हाइसवर AI ने कापली जाते. ती पारदर्शक ठेवा किंवा मागे रंग, धूसरपणा किंवा फोटो लावा आणि पुन्हा GIF म्हणून सेव्ह करा.",
+ "steps": [
+ "एक ॲनिमेटेड GIF निवडा.",
+ "प्रीव्ह्यू पहा आणि मागे काय लावायचे ते निवडा.",
+ "साइज निवडा आणि “GIF डाउनलोड करा” वर क्लिक करा."
+ ],
+ "faq": [
+ [
+ "माझ्या फाइल्स कुठेही अपलोड होतात का?",
+ "नाही. Fizzdoc हे काम तुमच्या ब्राउझर टॅबमध्येच करतो, WebAssembly आणि JavaScript मध्ये कंपाइल केलेल्या ओपन-सोर्स इंजिनांचा वापर करून. तुमची फाइल तुमच्या डिव्हाइसवरून वाचली जाते, स्थानिक पातळीवर प्रोसेस होते आणि निकाल थेट तुमच्या डिव्हाइसवर सेव्ह होतो. हे तुम्ही स्वतः पडताळून पाहू शकता: ब्राउझरचे डेव्हलपर टूल्स उघडा, Network टॅबवर जा आणि एखादे काम चालवा — कोणतीही रिक्वेस्ट तुमची फाइल घेऊन जात नाही."
+ ],
+ [
+ "ॲनिमेशनची वेळ तशीच राहील का?",
+ "हो. प्रत्येक फ्रेमचा स्वतःचा वेळ राहतो आणि नवीन GIF मूळप्रमाणे लूप होते."
+ ],
+ [
+ "कडा PNG पेक्षा तीक्ष्ण का आहेत?",
+ "GIF चा पिक्सेल एकतर पूर्ण पारदर्शक किंवा पूर्ण भरलेला असतो. मऊ कडांसाठी “काहीही नाही” ऐवजी मागे रंग किंवा फोटो निवडा."
+ ],
+ [
+ "Fizzdoc मोफत आहे का?",
+ "होय, आणि हा कायम मोफत राहील: साइन-अप नाही, वॉटरमार्क नाही, रोजची मर्यादा नाही आणि प्रीमियम प्लॅनही नाही. Fizzdoc हा Apache-2.0 लायसन्स अंतर्गत ओपन सोर्स आहे, त्यामुळे कोणीही स्वतःची कॉपी चालवू शकतो."
+ ]
+ ],
+ "keywords": [
+ "GIF बॅकग्राउंड काढा",
+ "पारदर्शक GIF बनवा",
+ "GIF बॅकग्राउंड रिमूव्ह मोफत",
+ "ॲनिमेटेड GIF बॅकग्राउंड बदला",
+ "remove gif background"
+ ]
}
}
}
diff --git a/src/i18n/nl.json b/src/i18n/nl.json
index 091d742..cd5c467 100644
--- a/src/i18n/nl.json
+++ b/src/i18n/nl.json
@@ -322,7 +322,15 @@
"error.NO_AUDIO_TRACK": "Deze browser kan het geluid in dit bestand niet lezen. Probeer een MP3-, M4A-, WAV- of MP4-bestand.",
"error.NO_SPEECH": "Er is geen spraak gevonden in dit bestand.",
"error.SETUP_FAILED": "Het spraakmodel kon niet worden geladen. Controleer je internetverbinding voor de eenmalige download en probeer het opnieuw.",
- "error.TRANSCRIBE_FAILED": "De transcriptie is onverwacht gestopt. Probeer een korter bestand, of een laptop voor lange opnames."
+ "error.TRANSCRIBE_FAILED": "De transcriptie is onverwacht gestopt. Probeer een korter bestand, of een laptop voor lange opnames.",
+ "ws.chooseVideo": "Kies een video",
+ "error.BAD_VIDEO": "Deze browser kan deze video niet lezen. Probeer een MP4- of WebM-bestand, of de nieuwste Chrome of Edge.",
+ "error.NO_VIDEO_ENCODER": "Deze browser kan geen video’s opslaan. Gebruik de nieuwste Chrome, Edge of Safari.",
+ "bg.frame": "Achtergrond verwijderen: beeld {n} van {total}…",
+ "bg.gifNote": "Geanimeerde GIF: elk beeld wordt bewerkt en als GIF opgeslagen. GIF’s hebben geen zachte randen, dus bij “Geen” is de omtrek iets scherper.",
+ "bg.videoNote": "Dit is het eerste beeld. Kies een achtergrond en sla op: elk beeld wordt op dit apparaat bewerkt, hier ongeveer {min} min. Houd dit tabblad open.",
+ "bg.greenScreen": "Green screen",
+ "ws.dpiLow": "Laag (kleinste bestand, voor het web)"
},
"home": {
"title": "Fizzdoc — Gratis PDF-, Afbeeldings- & Audiotools. Geen Upload.",
@@ -2844,6 +2852,84 @@
"ITR pdf openen",
"belasting pdf ontgrendelen"
]
+ },
+ "remove-video-background": {
+ "name": "Video Achtergrond Verwijderen",
+ "summary": "Knip een persoon uit een video en zet er een kleur, vervaging of foto achter. Met geluid.",
+ "action": "Video downloaden",
+ "title": "Video Achtergrond Verwijderen Gratis — Zonder Green Screen | Fizzdoc",
+ "description": "Verwijder of wijzig gratis de achtergrond van een video, zonder green screen: zet er een kleur, vervaging of foto achter. Geluid blijft en niets wordt geüpload.",
+ "h1": "Verwijder de achtergrond uit een video",
+ "lede": "Geen green screen nodig. Een AI bewerkt elk beeld op je eigen apparaat, het geluid blijft, en je kunt er een kleur, vervaging of foto achter zetten. Op telefoons werken korte clips het best.",
+ "steps": [
+ "Kies een video (MP4, WebM of MOV).",
+ "Kies wat erachter komt, met het eerste beeld als voorbeeld.",
+ "Klik op “Video downloaden” en houd het tabblad open tot elk beeld klaar is."
+ ],
+ "faq": [
+ [
+ "Worden mijn bestanden ergens geüpload?",
+ "Nee. Fizzdoc doet het werk in je browsertab, met opensource-engines die zijn gecompileerd naar WebAssembly en JavaScript. Je bestand wordt van je apparaat gelezen, lokaal verwerkt, en het resultaat wordt direct weer op je apparaat opgeslagen. Je kunt dit zelf controleren: open de ontwikkelaarstools van je browser, ga naar het tabblad Netwerk en voer een taak uit — er wordt geen enkel verzoek met je bestand verstuurd."
+ ],
+ [
+ "Hoe lang duurt het?",
+ "Elk beeld wordt op je apparaat bewerkt, dus het hangt af van de snelheid ervan. Fizzdoc toont vooraf een schatting."
+ ],
+ [
+ "Kan ik het resultaat in een video-editor gebruiken?",
+ "Ja. Kies “Green screen” en de editor haalt het groen met één klik weg (chroma key). Video’s worden als MP4 opgeslagen, anders als WebM."
+ ],
+ [
+ "Is Fizzdoc gratis?",
+ "Ja, en het blijft gratis: geen account, geen watermerk, geen dagelijkse limiet en geen premium-abonnement. Fizzdoc is open source onder de Apache-2.0-licentie, dus iedereen kan zijn eigen versie draaien."
+ ]
+ ],
+ "keywords": [
+ "video achtergrond verwijderen gratis",
+ "video achtergrond veranderen",
+ "achtergrond verwijderen zonder green screen",
+ "video achtergrond weghalen online",
+ "remove video background"
+ ]
+ },
+ "remove-gif-background": {
+ "name": "GIF Achtergrond Verwijderen",
+ "summary": "Maak de achtergrond van een geanimeerde GIF transparant of een nieuwe kleur, beeld voor beeld.",
+ "action": "GIF downloaden",
+ "title": "GIF Achtergrond Verwijderen Gratis — Transparante GIF | Fizzdoc",
+ "description": "Verwijder gratis de achtergrond van een geanimeerde GIF: elk beeld wordt op je apparaat uitgeknipt en als transparante of nieuw gekleurde GIF opgeslagen.",
+ "h1": "Verwijder de achtergrond uit een GIF",
+ "lede": "Elk beeld van je geanimeerde GIF wordt door een AI op je eigen apparaat uitgeknipt. Laat hem transparant of zet er een kleur, vervaging of foto achter en sla hem weer op als GIF.",
+ "steps": [
+ "Kies een geanimeerde GIF.",
+ "Bekijk het voorbeeld en kies wat erachter komt.",
+ "Kies de grootte en klik op “GIF downloaden”."
+ ],
+ "faq": [
+ [
+ "Worden mijn bestanden ergens geüpload?",
+ "Nee. Fizzdoc doet het werk in je browsertab, met opensource-engines die zijn gecompileerd naar WebAssembly en JavaScript. Je bestand wordt van je apparaat gelezen, lokaal verwerkt, en het resultaat wordt direct weer op je apparaat opgeslagen. Je kunt dit zelf controleren: open de ontwikkelaarstools van je browser, ga naar het tabblad Netwerk en voer een taak uit — er wordt geen enkel verzoek met je bestand verstuurd."
+ ],
+ [
+ "Blijft de timing van de animatie gelijk?",
+ "Ja. Elk beeld houdt zijn eigen duur en de nieuwe GIF herhaalt zich zoals het origineel."
+ ],
+ [
+ "Waarom zijn de randen scherper dan in een PNG?",
+ "Een GIF-pixel is alleen helemaal doorzichtig of helemaal dicht. Kies voor zachte randen een kleur of foto in plaats van “Geen”."
+ ],
+ [
+ "Is Fizzdoc gratis?",
+ "Ja, en het blijft gratis: geen account, geen watermerk, geen dagelijkse limiet en geen premium-abonnement. Fizzdoc is open source onder de Apache-2.0-licentie, dus iedereen kan zijn eigen versie draaien."
+ ]
+ ],
+ "keywords": [
+ "gif achtergrond verwijderen",
+ "gif transparant maken",
+ "geanimeerde gif achtergrond verwijderen",
+ "gif achtergrond veranderen",
+ "remove gif background"
+ ]
}
}
}
diff --git a/src/i18n/pl.json b/src/i18n/pl.json
index 029c23e..8eedb2f 100644
--- a/src/i18n/pl.json
+++ b/src/i18n/pl.json
@@ -322,7 +322,15 @@
"error.NO_AUDIO_TRACK": "Ta przeglądarka nie może odczytać dźwięku z tego pliku. Spróbuj pliku MP3, M4A, WAV lub MP4.",
"error.NO_SPEECH": "W tym pliku nie znaleziono mowy.",
"error.SETUP_FAILED": "Nie udało się wczytać modelu mowy. Sprawdź połączenie z internetem na czas jednorazowego pobierania i spróbuj ponownie.",
- "error.TRANSCRIBE_FAILED": "Transkrypcja nieoczekiwanie się zatrzymała. Spróbuj krótszego pliku albo laptopa przy długich nagraniach."
+ "error.TRANSCRIBE_FAILED": "Transkrypcja nieoczekiwanie się zatrzymała. Spróbuj krótszego pliku albo laptopa przy długich nagraniach.",
+ "ws.chooseVideo": "Wybierz film",
+ "error.BAD_VIDEO": "Ta przeglądarka nie może odczytać tego filmu. Spróbuj pliku MP4 lub WebM albo najnowszego Chrome lub Edge.",
+ "error.NO_VIDEO_ENCODER": "Ta przeglądarka nie może zapisywać filmów. Użyj najnowszego Chrome, Edge lub Safari.",
+ "bg.frame": "Usuwanie tła: klatka {n} z {total}…",
+ "bg.gifNote": "Animowany GIF: każda klatka jest przetwarzana i zapisywana jako GIF. GIF nie ma miękkich krawędzi, więc przy „Brak” kontur jest nieco ostrzejszy.",
+ "bg.videoNote": "To pierwsza klatka. Wybierz tło i zapisz: każda klatka jest robiona na tym urządzeniu, tutaj około {min} min. Nie zamykaj tej karty.",
+ "bg.greenScreen": "Zielony ekran",
+ "ws.dpiLow": "Niska (najmniejszy plik, do internetu)"
},
"home": {
"title": "Fizzdoc — Darmowe PDF, obrazy, audio i Office. Bez wysyłania.",
@@ -2844,6 +2852,84 @@
"otwórz pdf ITR",
"odblokuj pdf podatkowy"
]
+ },
+ "remove-video-background": {
+ "name": "Usuń Tło z Filmu",
+ "summary": "Wytnij osobę z filmu i umieść za nią kolor, rozmycie lub zdjęcie. Z dźwiękiem.",
+ "action": "Pobierz film",
+ "title": "Usuń Tło z Filmu za Darmo — Bez Zielonego Ekranu | Fizzdoc",
+ "description": "Usuń lub zmień tło filmu za darmo, bez zielonego ekranu: umieść za osobą kolor, rozmycie lub zdjęcie. Dźwięk zostaje, a nic nie jest wysyłane.",
+ "h1": "Usuń tło z filmu",
+ "lede": "Bez zielonego ekranu. AI przetwarza każdą klatkę na Twoim urządzeniu, dźwięk zostaje, a za osobą możesz dać kolor, rozmycie lub zdjęcie. Na telefonach najlepiej działają krótkie klipy.",
+ "steps": [
+ "Wybierz film (MP4, WebM lub MOV).",
+ "Wybierz, co ma być z tyłu, patrząc na pierwszą klatkę.",
+ "Kliknij „Pobierz film” i nie zamykaj karty, aż każda klatka będzie gotowa."
+ ],
+ "faq": [
+ [
+ "Czy moje pliki są gdzieś przesyłane?",
+ "Nie. Fizzdoc wykonuje całą pracę w karcie przeglądarki, korzystając z otwartoźródłowych silników skompilowanych do WebAssembly i JavaScript. Twój plik jest odczytywany z urządzenia, przetwarzany lokalnie, a wynik trafia od razu z powrotem na Twoje urządzenie. Możesz to sam sprawdzić: otwórz narzędzia deweloperskie przeglądarki, przejdź do zakładki Sieć i uruchom zadanie — żadne żądanie nie przenosi Twojego pliku."
+ ],
+ [
+ "Ile to trwa?",
+ "Każda klatka jest przetwarzana na Twoim urządzeniu, więc zależy to od jego szybkości. Fizzdoc pokazuje szacowany czas przed startem."
+ ],
+ [
+ "Czy mogę użyć wyniku w edytorze wideo?",
+ "Tak. Wybierz „Zielony ekran”, a edytor usunie zieleń jednym kliknięciem (chroma key). Filmy zapisują się jako MP4, a jeśli się nie da, jako WebM."
+ ],
+ [
+ "Czy Fizzdoc jest darmowy?",
+ "Tak, i zawsze będzie za darmo: bez rejestracji, bez znaku wodnego, bez dziennego limitu i bez płatnej wersji. Fizzdoc jest open source na licencji Apache-2.0, więc każdy może uruchomić własną kopię."
+ ]
+ ],
+ "keywords": [
+ "usuń tło z filmu za darmo",
+ "zmień tło filmu",
+ "usuwanie tła wideo bez zielonego ekranu",
+ "usuń tło z wideo online",
+ "remove video background"
+ ]
+ },
+ "remove-gif-background": {
+ "name": "Usuń Tło z GIF-a",
+ "summary": "Zrób przezroczyste lub nowe tło animowanego GIF-a, klatka po klatce.",
+ "action": "Pobierz GIF",
+ "title": "Usuń Tło z GIF-a za Darmo — Przezroczysty Animowany GIF | Fizzdoc",
+ "description": "Usuń tło z animowanego GIF-a za darmo: każda klatka jest wycinana na Twoim urządzeniu i zapisywana jako przezroczysty lub nowy GIF. Nic nie jest wysyłane.",
+ "h1": "Usuń tło z GIF-a",
+ "lede": "Każda klatka Twojego animowanego GIF-a jest wycinana przez AI na Twoim urządzeniu. Zostaw ją przezroczystą lub daj z tyłu kolor, rozmycie albo zdjęcie i zapisz znów jako GIF.",
+ "steps": [
+ "Wybierz animowany GIF.",
+ "Obejrzyj podgląd i wybierz, co ma być z tyłu.",
+ "Wybierz rozmiar i kliknij „Pobierz GIF”."
+ ],
+ "faq": [
+ [
+ "Czy moje pliki są gdzieś przesyłane?",
+ "Nie. Fizzdoc wykonuje całą pracę w karcie przeglądarki, korzystając z otwartoźródłowych silników skompilowanych do WebAssembly i JavaScript. Twój plik jest odczytywany z urządzenia, przetwarzany lokalnie, a wynik trafia od razu z powrotem na Twoje urządzenie. Możesz to sam sprawdzić: otwórz narzędzia deweloperskie przeglądarki, przejdź do zakładki Sieć i uruchom zadanie — żadne żądanie nie przenosi Twojego pliku."
+ ],
+ [
+ "Czy animacja zachowa tempo?",
+ "Tak. Każda klatka zachowuje swój czas, a nowy GIF zapętla się jak oryginał."
+ ],
+ [
+ "Dlaczego krawędzie są ostrzejsze niż w PNG?",
+ "Piksel GIF-a jest albo całkiem przezroczysty, albo całkiem pełny. Dla miękkich krawędzi wybierz z tyłu kolor lub zdjęcie zamiast „Brak”."
+ ],
+ [
+ "Czy Fizzdoc jest darmowy?",
+ "Tak, i zawsze będzie za darmo: bez rejestracji, bez znaku wodnego, bez dziennego limitu i bez płatnej wersji. Fizzdoc jest open source na licencji Apache-2.0, więc każdy może uruchomić własną kopię."
+ ]
+ ],
+ "keywords": [
+ "usuń tło z gifa",
+ "przezroczysty gif",
+ "usuwanie tła animowanego gifa",
+ "zmień tło gifa",
+ "remove gif background"
+ ]
}
}
}
diff --git a/src/i18n/pt.json b/src/i18n/pt.json
index d6a0769..bf5c337 100644
--- a/src/i18n/pt.json
+++ b/src/i18n/pt.json
@@ -322,7 +322,15 @@
"error.NO_AUDIO_TRACK": "Este navegador não consegue ler o som deste arquivo. Tente um arquivo MP3, M4A, WAV ou MP4.",
"error.NO_SPEECH": "Nenhuma fala foi encontrada neste arquivo.",
"error.SETUP_FAILED": "Não foi possível carregar o modelo de voz. Verifique sua conexão com a internet para o download único e tente de novo.",
- "error.TRANSCRIBE_FAILED": "A transcrição parou inesperadamente. Tente um arquivo mais curto, ou um notebook para gravações longas."
+ "error.TRANSCRIBE_FAILED": "A transcrição parou inesperadamente. Tente um arquivo mais curto, ou um notebook para gravações longas.",
+ "ws.chooseVideo": "Escolher um vídeo",
+ "error.BAD_VIDEO": "Este navegador não consegue ler este vídeo. Tente um arquivo MP4 ou WebM, ou a versão mais recente do Chrome ou Edge.",
+ "error.NO_VIDEO_ENCODER": "Este navegador não consegue salvar vídeos. Use a versão mais recente do Chrome, Edge ou Safari.",
+ "bg.frame": "Removendo o fundo: quadro {n} de {total}…",
+ "bg.gifNote": "GIF animado: cada quadro é processado e salvo como GIF. GIFs não têm bordas suaves, então em “Nenhum” o contorno fica um pouco mais nítido.",
+ "bg.videoNote": "Este é o primeiro quadro. Escolha um fundo e salve: cada quadro é feito neste aparelho, cerca de {min} min aqui. Mantenha esta aba aberta.",
+ "bg.greenScreen": "Tela verde",
+ "ws.dpiLow": "Baixa (arquivo menor, para a web)"
},
"home": {
"title": "Fizzdoc — Ferramentas Grátis de PDF, Imagem, Áudio e Office",
@@ -2844,6 +2852,84 @@
"abrir PDF de ITR",
"desbloquear PDF imposto de renda"
]
+ },
+ "remove-video-background": {
+ "name": "Remover Fundo de Vídeo",
+ "summary": "Recorte uma pessoa de um vídeo e coloque uma cor, um desfoque ou uma foto atrás. Com som.",
+ "action": "Baixar vídeo",
+ "title": "Remover Fundo de Vídeo Grátis — Sem Tela Verde, Sem Enviar | Fizzdoc",
+ "description": "Remova ou troque o fundo de um vídeo grátis, sem tela verde: coloque uma cor, um desfoque ou uma foto atrás. O som é mantido e nada é enviado.",
+ "h1": "Remova o fundo de um vídeo",
+ "lede": "Não precisa de tela verde. Uma IA processa cada quadro no seu próprio aparelho, o som é mantido e você pode colocar uma cor, um desfoque ou uma foto atrás. Em celulares, clipes curtos funcionam melhor.",
+ "steps": [
+ "Escolha um vídeo (MP4, WebM ou MOV).",
+ "Escolha o que vai atrás, usando o primeiro quadro como prévia.",
+ "Clique em “Baixar vídeo” e mantenha a aba aberta enquanto cada quadro é feito."
+ ],
+ "faq": [
+ [
+ "Meus arquivos são enviados para algum lugar?",
+ "Não. O Fizzdoc faz todo o trabalho dentro da aba do seu navegador, usando mecanismos de código aberto compilados para WebAssembly e JavaScript. Seu arquivo é lido do seu dispositivo, processado localmente, e o resultado é salvo direto de volta nele. Você pode conferir por conta própria: abra as ferramentas de desenvolvedor do navegador, vá até a aba Rede e rode uma tarefa — nenhuma requisição leva seu arquivo."
+ ],
+ [
+ "Quanto tempo leva?",
+ "Cada quadro é processado no seu aparelho, então depende da velocidade dele. O Fizzdoc mostra uma estimativa antes de começar."
+ ],
+ [
+ "Posso usar o recorte em um editor de vídeo?",
+ "Sim. Escolha “Tela verde” e o editor remove o verde com um clique (chroma key). Os vídeos são salvos em MP4 quando possível, senão em WebM."
+ ],
+ [
+ "O Fizzdoc é gratuito?",
+ "Sim, e vai continuar sendo grátis: sem cadastro, sem marca d'água, sem limite diário e sem plano premium. O Fizzdoc é open source sob a licença Apache-2.0, então qualquer um pode rodar sua própria cópia."
+ ]
+ ],
+ "keywords": [
+ "remover fundo de vídeo grátis",
+ "trocar fundo de vídeo",
+ "remover fundo de vídeo sem tela verde",
+ "apagar fundo de vídeo online",
+ "remove video background"
+ ]
+ },
+ "remove-gif-background": {
+ "name": "Remover Fundo de GIF",
+ "summary": "Deixe o fundo de um GIF animado transparente ou de outra cor, quadro a quadro.",
+ "action": "Baixar GIF",
+ "title": "Remover Fundo de GIF Grátis — GIF Animado Transparente | Fizzdoc",
+ "description": "Remova o fundo de um GIF animado grátis: cada quadro é recortado no seu aparelho e salvo como GIF transparente ou com nova cor. Nada é enviado.",
+ "h1": "Remova o fundo de um GIF",
+ "lede": "Cada quadro do seu GIF animado é recortado por uma IA no seu próprio aparelho. Deixe transparente ou coloque uma cor, um desfoque ou uma foto atrás e salve como GIF de novo.",
+ "steps": [
+ "Escolha um GIF animado.",
+ "Veja a prévia e escolha o que vai atrás.",
+ "Escolha o tamanho e clique em “Baixar GIF”."
+ ],
+ "faq": [
+ [
+ "Meus arquivos são enviados para algum lugar?",
+ "Não. O Fizzdoc faz todo o trabalho dentro da aba do seu navegador, usando mecanismos de código aberto compilados para WebAssembly e JavaScript. Seu arquivo é lido do seu dispositivo, processado localmente, e o resultado é salvo direto de volta nele. Você pode conferir por conta própria: abra as ferramentas de desenvolvedor do navegador, vá até a aba Rede e rode uma tarefa — nenhuma requisição leva seu arquivo."
+ ],
+ [
+ "A animação mantém o ritmo?",
+ "Sim. Cada quadro mantém sua duração e o novo GIF repete como o original."
+ ],
+ [
+ "Por que as bordas ficam mais nítidas que num PNG?",
+ "Um pixel de GIF só pode ser totalmente transparente ou totalmente sólido. Para bordas suaves, coloque uma cor ou uma foto atrás em vez de “Nenhum”."
+ ],
+ [
+ "O Fizzdoc é gratuito?",
+ "Sim, e vai continuar sendo grátis: sem cadastro, sem marca d'água, sem limite diário e sem plano premium. O Fizzdoc é open source sob a licença Apache-2.0, então qualquer um pode rodar sua própria cópia."
+ ]
+ ],
+ "keywords": [
+ "remover fundo de gif",
+ "fazer gif transparente",
+ "remover fundo de gif animado grátis",
+ "trocar fundo de gif",
+ "remove gif background"
+ ]
}
}
}
diff --git a/src/i18n/ta.json b/src/i18n/ta.json
index db273df..04fa941 100644
--- a/src/i18n/ta.json
+++ b/src/i18n/ta.json
@@ -322,7 +322,15 @@
"error.NO_AUDIO_TRACK": "இந்தப் பிரௌசரால் இந்தக் கோப்பிலுள்ள ஒலியைப் படிக்க முடியவில்லை. MP3, M4A, WAV அல்லது MP4 கோப்பை முயற்சிக்கவும்.",
"error.NO_SPEECH": "இந்தக் கோப்பில் பேச்சு எதுவும் கிடைக்கவில்லை.",
"error.SETUP_FAILED": "ஸ்பீச் மாடலை ஏற்ற முடியவில்லை. ஒருமுறை பதிவிறக்க உங்கள் இணைய இணைப்பைச் சரிபார்த்து, மீண்டும் முயற்சிக்கவும்.",
- "error.TRANSCRIBE_FAILED": "டிரான்ஸ்கிரிப்ஷன் எதிர்பாராமல் நின்றுவிட்டது. சிறிய கோப்பை முயற்சிக்கவும், அல்லது நீண்ட பதிவுகளுக்கு லேப்டாப் பயன்படுத்தவும்."
+ "error.TRANSCRIBE_FAILED": "டிரான்ஸ்கிரிப்ஷன் எதிர்பாராமல் நின்றுவிட்டது. சிறிய கோப்பை முயற்சிக்கவும், அல்லது நீண்ட பதிவுகளுக்கு லேப்டாப் பயன்படுத்தவும்.",
+ "ws.chooseVideo": "வீடியோவைத் தேர்ந்தெடுக்கவும்",
+ "error.BAD_VIDEO": "இந்த உலாவியால் இந்த வீடியோவைப் படிக்க முடியவில்லை. MP4 அல்லது WebM கோப்பு, அல்லது புதிய Chrome அல்லது Edge முயற்சிக்கவும்.",
+ "error.NO_VIDEO_ENCODER": "இந்த உலாவியால் வீடியோக்களைச் சேமிக்க முடியாது. புதிய Chrome, Edge அல்லது Safari பயன்படுத்தவும்.",
+ "bg.frame": "பின்னணி நீக்கப்படுகிறது: பிரேம் {n} / {total}…",
+ "bg.gifNote": "அனிமேட்டட் GIF: ஒவ்வொரு பிரேமும் செயலாக்கப்பட்டு GIF ஆகச் சேமிக்கப்படும். GIF-இல் மென்மையான ஓரங்கள் இருக்காது, எனவே “இல்லை” என்றால் ஓரம் சற்று கூர்மையாகத் தெரியும்.",
+ "bg.videoNote": "இது முதல் பிரேம். பின்னணியைத் தேர்ந்தெடுத்துச் சேமிக்கவும்: ஒவ்வொரு பிரேமும் இந்தச் சாதனத்திலேயே செய்யப்படும், இங்கே சுமார் {min} நிமிடம் ஆகும். இந்த டேபைத் திறந்து வைக்கவும்.",
+ "bg.greenScreen": "பச்சைத் திரை",
+ "ws.dpiLow": "குறைவு (சிறிய கோப்பு, இணையத்துக்கு)"
},
"home": {
"title": "Fizzdoc — இலவச PDF, படம், ஆடியோ, ஆஃபீஸ் கருவிகள். பதிவேற்றம் இல்லை.",
@@ -2844,6 +2852,84 @@
"ITR PDF திறப்பது எப்படி",
"வருமான வரி PDF அன்லாக்"
]
+ },
+ "remove-video-background": {
+ "name": "வீடியோ பின்னணி நீக்கு",
+ "summary": "வீடியோவிலிருந்து நபரைப் பிரித்து, பின்னால் நிறம், மங்கல் அல்லது படம் வைக்கவும். ஒலி இருக்கும்.",
+ "action": "வீடியோவைப் பதிவிறக்கு",
+ "title": "வீடியோ பின்னணி நீக்க இலவசம் — பச்சைத் திரை தேவையில்லை | Fizzdoc",
+ "description": "பச்சைத் திரை இல்லாமல் வீடியோவின் பின்னணியை இலவசமாக நீக்கவும் அல்லது மாற்றவும்: நிறம், மங்கல் அல்லது படம் வைக்கவும். ஒலி இருக்கும், எதுவும் பதிவேற்றப்படாது.",
+ "h1": "வீடியோவிலிருந்து பின்னணியை நீக்கவும்",
+ "lede": "பச்சைத் திரை தேவையில்லை. ஒவ்வொரு பிரேமும் உங்கள் சொந்தச் சாதனத்தில் AI மூலம் செய்யப்படும், ஒலி இருக்கும், பின்னால் நிறம், மங்கல் அல்லது படம் வைக்கலாம். போன்களில் சிறிய கிளிப்கள் சிறப்பாக வேலை செய்யும்.",
+ "steps": [
+ "ஒரு வீடியோவைத் தேர்ந்தெடுக்கவும் (MP4, WebM அல்லது MOV).",
+ "முதல் பிரேமைப் பார்த்து பின்னால் என்ன வேண்டும் எனத் தேர்ந்தெடுக்கவும்.",
+ "“வீடியோவைப் பதிவிறக்கு” என்பதைக் கிளிக் செய்து, முடியும் வரை டேபைத் திறந்து வைக்கவும்."
+ ],
+ "faq": [
+ [
+ "எனது கோப்புகள் எங்காவது பதிவேற்றப்படுமா?",
+ "இல்லை. Fizzdoc உங்கள் பிரௌசர் டேபிற்குள்ளேயே வேலை செய்கிறது, WebAssembly மற்றும் JavaScript-ல் தொகுக்கப்பட்ட ஓப்பன் சோர்ஸ் இன்ஜின்களைப் பயன்படுத்தி. உங்கள் கோப்பு உங்கள் டிவைஸிலிருந்து படிக்கப்பட்டு, அதிலேயே செயலாக்கப்பட்டு, முடிவு நேரடியாக உங்கள் டிவைஸில் சேமிக்கப்படுகிறது. இதை நீங்களே சரிபார்க்கலாம்: உங்கள் பிரௌசரின் டெவலப்பர் டூல்ஸை திறந்து, Network டேபிற்குச் சென்று, ஒரு பணியை இயக்குங்கள் — எந்த ரிக்வெஸ்ட்டும் உங்கள் கோப்பை எடுத்துச் செல்லாது."
+ ],
+ [
+ "எவ்வளவு நேரம் ஆகும்?",
+ "ஒவ்வொரு பிரேமும் உங்கள் சாதனத்தில் செய்யப்படுவதால், அதன் வேகத்தைப் பொறுத்தது. தொடங்கும் முன் Fizzdoc மதிப்பீட்டைக் காட்டும்."
+ ],
+ [
+ "இதை வீடியோ எடிட்டரில் பயன்படுத்தலாமா?",
+ "ஆம். “பச்சைத் திரை” தேர்ந்தெடுத்தால், எடிட்டரில் ஒரே கிளிக்கில் பச்சையை நீக்கலாம் (குரோமா கீ). வீடியோ MP4 அல்லது WebM ஆகச் சேமிக்கப்படும்."
+ ],
+ [
+ "Fizzdoc இலவசமா?",
+ "ஆம், இது எப்போதும் இலவசமாகவே இருக்கும்: சைன் அப் இல்லை, வாட்டர்மார்க் இல்லை, தினசரி வரம்பு இல்லை, பிரீமியம் திட்டமும் இல்லை. Fizzdoc Apache-2.0 லைசென்ஸின் கீழ் ஓப்பன் சோர்ஸ், எனவே யார் வேண்டுமானாலும் தங்கள் சொந்தக் காப்பியை இயக்கலாம்."
+ ]
+ ],
+ "keywords": [
+ "வீடியோ பின்னணி நீக்க",
+ "வீடியோ பின்னணி மாற்ற",
+ "பச்சைத் திரை இல்லாமல் வீடியோ பின்னணி",
+ "வீடியோ பேக்கிரவுண்ட் ரிமூவ் இலவசம்",
+ "remove video background"
+ ]
+ },
+ "remove-gif-background": {
+ "name": "GIF பின்னணி நீக்கு",
+ "summary": "அனிமேட்டட் GIF-இன் பின்னணியை ஒவ்வொரு பிரேமிலும் வெளிப்படையாக அல்லது புதிய நிறமாக்கவும்.",
+ "action": "GIF-ஐப் பதிவிறக்கு",
+ "title": "GIF பின்னணி நீக்க இலவசம் — வெளிப்படையான அனிமேட்டட் GIF | Fizzdoc",
+ "description": "அனிமேட்டட் GIF-இன் பின்னணியை இலவசமாக நீக்கவும்: ஒவ்வொரு பிரேமும் உங்கள் சாதனத்தில் வெட்டப்பட்டு வெளிப்படையான GIF ஆகச் சேமிக்கப்படும். பதிவேற்றம் இல்லை.",
+ "h1": "GIF-இலிருந்து பின்னணியை நீக்கவும்",
+ "lede": "உங்கள் அனிமேட்டட் GIF-இன் ஒவ்வொரு பிரேமும் உங்கள் சொந்தச் சாதனத்தில் AI மூலம் வெட்டப்படும். வெளிப்படையாக வைக்கவும் அல்லது நிறம், மங்கல், படம் வைத்து மீண்டும் GIF ஆகச் சேமிக்கவும்.",
+ "steps": [
+ "ஒரு அனிமேட்டட் GIF-ஐத் தேர்ந்தெடுக்கவும்.",
+ "முன்னோட்டத்தைப் பார்த்து பின்னால் என்ன வேண்டும் எனத் தேர்ந்தெடுக்கவும்.",
+ "அளவைத் தேர்ந்தெடுத்து “GIF-ஐப் பதிவிறக்கு” என்பதைக் கிளிக் செய்யவும்."
+ ],
+ "faq": [
+ [
+ "எனது கோப்புகள் எங்காவது பதிவேற்றப்படுமா?",
+ "இல்லை. Fizzdoc உங்கள் பிரௌசர் டேபிற்குள்ளேயே வேலை செய்கிறது, WebAssembly மற்றும் JavaScript-ல் தொகுக்கப்பட்ட ஓப்பன் சோர்ஸ் இன்ஜின்களைப் பயன்படுத்தி. உங்கள் கோப்பு உங்கள் டிவைஸிலிருந்து படிக்கப்பட்டு, அதிலேயே செயலாக்கப்பட்டு, முடிவு நேரடியாக உங்கள் டிவைஸில் சேமிக்கப்படுகிறது. இதை நீங்களே சரிபார்க்கலாம்: உங்கள் பிரௌசரின் டெவலப்பர் டூல்ஸை திறந்து, Network டேபிற்குச் சென்று, ஒரு பணியை இயக்குங்கள் — எந்த ரிக்வெஸ்ட்டும் உங்கள் கோப்பை எடுத்துச் செல்லாது."
+ ],
+ [
+ "அனிமேஷன் நேரம் மாறாமல் இருக்குமா?",
+ "ஆம். ஒவ்வொரு பிரேமும் அதன் நேரத்தை வைத்திருக்கும், புதிய GIF அசல் போலவே சுழலும்."
+ ],
+ [
+ "ஓரங்கள் PNG-ஐ விடக் கூர்மையாக இருப்பது ஏன்?",
+ "GIF பிக்சல் முழுவதும் வெளிப்படையாகவோ முழுவதும் திடமாகவோ மட்டுமே இருக்கும். மென்மையான ஓரங்களுக்கு “இல்லை” என்பதற்குப் பதில் நிறம் அல்லது படம் தேர்ந்தெடுக்கவும்."
+ ],
+ [
+ "Fizzdoc இலவசமா?",
+ "ஆம், இது எப்போதும் இலவசமாகவே இருக்கும்: சைன் அப் இல்லை, வாட்டர்மார்க் இல்லை, தினசரி வரம்பு இல்லை, பிரீமியம் திட்டமும் இல்லை. Fizzdoc Apache-2.0 லைசென்ஸின் கீழ் ஓப்பன் சோர்ஸ், எனவே யார் வேண்டுமானாலும் தங்கள் சொந்தக் காப்பியை இயக்கலாம்."
+ ]
+ ],
+ "keywords": [
+ "GIF பின்னணி நீக்க",
+ "வெளிப்படையான GIF உருவாக்க",
+ "GIF பேக்கிரவுண்ட் ரிமூவ் இலவசம்",
+ "அனிமேட்டட் GIF பின்னணி மாற்ற",
+ "remove gif background"
+ ]
}
}
}
diff --git a/src/i18n/te.json b/src/i18n/te.json
index 7120705..e5b4de4 100644
--- a/src/i18n/te.json
+++ b/src/i18n/te.json
@@ -322,7 +322,15 @@
"error.NO_AUDIO_TRACK": "ఈ బ్రౌజర్ ఈ ఫైల్లోని శబ్దాన్ని చదవలేకపోతోంది. MP3, M4A, WAV లేదా MP4 ఫైల్ను ప్రయత్నించండి.",
"error.NO_SPEECH": "ఈ ఫైల్లో మాటలేవీ కనిపించలేదు.",
"error.SETUP_FAILED": "స్పీచ్ మోడల్ను లోడ్ చేయలేకపోయాం. ఒక్కసారి డౌన్లోడ్ కోసం మీ ఇంటర్నెట్ కనెక్షన్ను చూసి, మళ్లీ ప్రయత్నించండి.",
- "error.TRANSCRIBE_FAILED": "ట్రాన్స్క్రిప్షన్ అనుకోకుండా ఆగిపోయింది. చిన్న ఫైల్ను ప్రయత్నించండి, లేదా పొడవైన రికార్డింగ్లకు ల్యాప్టాప్ వాడండి."
+ "error.TRANSCRIBE_FAILED": "ట్రాన్స్క్రిప్షన్ అనుకోకుండా ఆగిపోయింది. చిన్న ఫైల్ను ప్రయత్నించండి, లేదా పొడవైన రికార్డింగ్లకు ల్యాప్టాప్ వాడండి.",
+ "ws.chooseVideo": "వీడియోను ఎంచుకోండి",
+ "error.BAD_VIDEO": "ఈ బ్రౌజర్ ఈ వీడియోను చదవలేకపోతోంది. MP4 లేదా WebM ఫైల్, లేదా తాజా Chrome లేదా Edge ప్రయత్నించండి.",
+ "error.NO_VIDEO_ENCODER": "ఈ బ్రౌజర్ వీడియోలను సేవ్ చేయలేదు. దయచేసి తాజా Chrome, Edge లేదా Safari వాడండి.",
+ "bg.frame": "బ్యాక్గ్రౌండ్ తీసివేస్తోంది: ఫ్రేమ్ {n} / {total}…",
+ "bg.gifNote": "యానిమేటెడ్ GIF: ప్రతి ఫ్రేమ్ ప్రాసెస్ అయి GIFగా సేవ్ అవుతుంది. GIFలో మృదువైన అంచులు ఉండవు, కాబట్టి “ఏదీ లేదు”లో అంచు కొంచెం పదునుగా కనిపిస్తుంది.",
+ "bg.videoNote": "ఇది మొదటి ఫ్రేమ్. బ్యాక్గ్రౌండ్ ఎంచుకుని సేవ్ చేయండి: ప్రతి ఫ్రేమ్ ఈ పరికరంలోనే జరుగుతుంది, ఇక్కడ సుమారు {min} నిమిషాలు పడుతుంది. ఈ ట్యాబ్ తెరిచి ఉంచండి.",
+ "bg.greenScreen": "గ్రీన్ స్క్రీన్",
+ "ws.dpiLow": "తక్కువ (చిన్న ఫైల్, వెబ్ కోసం)"
},
"home": {
"title": "Fizzdoc — ఉచిత PDF, ఫోటో, ఆడియో & ఆఫీస్ టూల్స్. అప్లోడ్ లేదు.",
@@ -2844,6 +2852,84 @@
"ITR PDF ఎలా ఓపెన్ చేయాలి",
"ఆదాయపు పన్ను PDF అన్లాక్"
]
+ },
+ "remove-video-background": {
+ "name": "వీడియో బ్యాక్గ్రౌండ్ తీసివేయండి",
+ "summary": "వీడియో నుండి వ్యక్తిని వేరు చేసి, వెనుక రంగు, బ్లర్ లేదా ఫోటో పెట్టండి. శబ్దం ఉంటుంది.",
+ "action": "వీడియో డౌన్లోడ్ చేయండి",
+ "title": "వీడియో బ్యాక్గ్రౌండ్ తీసివేయండి ఉచితం — అప్లోడ్ లేదు | Fizzdoc",
+ "description": "గ్రీన్ స్క్రీన్ లేకుండా వీడియో బ్యాక్గ్రౌండ్ను ఉచితంగా తీసివేయండి లేదా మార్చండి: వెనుక రంగు, బ్లర్ లేదా ఫోటో పెట్టండి. శబ్దం ఉంటుంది, ఏదీ అప్లోడ్ కాదు.",
+ "h1": "వీడియో నుండి బ్యాక్గ్రౌండ్ తీసివేయండి",
+ "lede": "గ్రీన్ స్క్రీన్ అవసరం లేదు. ప్రతి ఫ్రేమ్ మీ సొంత పరికరంలో AIతో జరుగుతుంది, శబ్దం ఉంటుంది, వెనుక రంగు, బ్లర్ లేదా ఫోటో పెట్టవచ్చు. ఫోన్లలో చిన్న క్లిప్లు బాగా పనిచేస్తాయి.",
+ "steps": [
+ "ఒక వీడియోను ఎంచుకోండి (MP4, WebM లేదా MOV).",
+ "మొదటి ఫ్రేమ్ చూసి వెనుక ఏం ఉండాలో ఎంచుకోండి.",
+ "“వీడియో డౌన్లోడ్ చేయండి” క్లిక్ చేసి, పూర్తయ్యే వరకు ట్యాబ్ తెరిచి ఉంచండి."
+ ],
+ "faq": [
+ [
+ "మీ ఫైల్స్ ఎక్కడైనా అప్లోడ్ అవుతాయా?",
+ "లేదు. Fizzdoc ఈ పనిని మీ బ్రౌజర్ ట్యాబ్లోనే చేస్తుంది, WebAssembly మరియు JavaScriptకి కంపైల్ చేసిన ఓపెన్ సోర్స్ ఇంజన్లతో. మీ ఫైల్ మీ డివైజ్ నుండి చదవబడి, స్థానికంగా ప్రాసెస్ చేయబడి, ఫలితం నేరుగా మీ డివైజ్కే తిరిగి సేవ్ చేయబడుతుంది. మీరే దీన్ని చెక్ చేసుకోవచ్చు: బ్రౌజర్ డెవలపర్ టూల్స్ తెరిచి, Network ట్యాబ్కి వెళ్లి ఒక జాబ్ రన్ చేయండి — ఏ రిక్వెస్ట్ కూడా మీ ఫైల్ను తీసుకెళ్లదు."
+ ],
+ [
+ "ఎంత సమయం పడుతుంది?",
+ "ప్రతి ఫ్రేమ్ మీ పరికరంలో జరుగుతుంది, కాబట్టి దాని వేగంపై ఆధారపడి ఉంటుంది. మొదలుపెట్టే ముందు Fizzdoc అంచనా సమయం చూపిస్తుంది."
+ ],
+ [
+ "దీన్ని వీడియో ఎడిటర్లో వాడవచ్చా?",
+ "అవును. “గ్రీన్ స్క్రీన్” ఎంచుకుంటే, ఎడిటర్లో ఒక్క క్లిక్తో ఆకుపచ్చను తీసేయవచ్చు (క్రోమా కీ). వీడియో MP4లో, లేకపోతే WebMలో సేవ్ అవుతుంది."
+ ],
+ [
+ "Fizzdoc ఉచితమా?",
+ "అవును, ఇది ఎప్పటికీ ఉచితంగానే ఉంటుంది: సైన్-అప్ లేదు, వాటర్మార్క్ లేదు, రోజువారీ పరిమితి లేదు, ప్రీమియం ప్లాన్ కూడా లేదు. Fizzdoc Apache-2.0 లైసెన్స్ కింద ఓపెన్ సోర్స్, కాబట్టి ఎవరైనా తమ సొంత కాపీని రన్ చేసుకోవచ్చు."
+ ]
+ ],
+ "keywords": [
+ "వీడియో బ్యాక్గ్రౌండ్ తీసివేయండి",
+ "వీడియో బ్యాక్గ్రౌండ్ మార్చండి",
+ "గ్రీన్ స్క్రీన్ లేకుండా వీడియో బ్యాక్గ్రౌండ్",
+ "వీడియో బ్యాక్గ్రౌండ్ రిమూవ్ ఉచితం",
+ "remove video background"
+ ]
+ },
+ "remove-gif-background": {
+ "name": "GIF బ్యాక్గ్రౌండ్ తీసివేయండి",
+ "summary": "యానిమేటెడ్ GIF బ్యాక్గ్రౌండ్ను ప్రతి ఫ్రేమ్లో పారదర్శకంగా లేదా కొత్త రంగులో చేయండి.",
+ "action": "GIF డౌన్లోడ్ చేయండి",
+ "title": "GIF బ్యాక్గ్రౌండ్ తీసివేయండి ఉచితం — పారదర్శక GIF | Fizzdoc",
+ "description": "యానిమేటెడ్ GIF బ్యాక్గ్రౌండ్ను ఉచితంగా తీసివేయండి: ప్రతి ఫ్రేమ్ మీ పరికరంలో కత్తిరించబడి పారదర్శక లేదా కొత్త రంగు GIFగా సేవ్ అవుతుంది. అప్లోడ్ లేదు.",
+ "h1": "GIF నుండి బ్యాక్గ్రౌండ్ తీసివేయండి",
+ "lede": "మీ యానిమేటెడ్ GIFలోని ప్రతి ఫ్రేమ్ మీ సొంత పరికరంలో AIతో కత్తిరించబడుతుంది. పారదర్శకంగా ఉంచండి లేదా వెనుక రంగు, బ్లర్ లేదా ఫోటో పెట్టి మళ్లీ GIFగా సేవ్ చేయండి.",
+ "steps": [
+ "ఒక యానిమేటెడ్ GIF ఎంచుకోండి.",
+ "ప్రివ్యూ చూసి వెనుక ఏం ఉండాలో ఎంచుకోండి.",
+ "సైజ్ ఎంచుకుని “GIF డౌన్లోడ్ చేయండి” క్లిక్ చేయండి."
+ ],
+ "faq": [
+ [
+ "మీ ఫైల్స్ ఎక్కడైనా అప్లోడ్ అవుతాయా?",
+ "లేదు. Fizzdoc ఈ పనిని మీ బ్రౌజర్ ట్యాబ్లోనే చేస్తుంది, WebAssembly మరియు JavaScriptకి కంపైల్ చేసిన ఓపెన్ సోర్స్ ఇంజన్లతో. మీ ఫైల్ మీ డివైజ్ నుండి చదవబడి, స్థానికంగా ప్రాసెస్ చేయబడి, ఫలితం నేరుగా మీ డివైజ్కే తిరిగి సేవ్ చేయబడుతుంది. మీరే దీన్ని చెక్ చేసుకోవచ్చు: బ్రౌజర్ డెవలపర్ టూల్స్ తెరిచి, Network ట్యాబ్కి వెళ్లి ఒక జాబ్ రన్ చేయండి — ఏ రిక్వెస్ట్ కూడా మీ ఫైల్ను తీసుకెళ్లదు."
+ ],
+ [
+ "యానిమేషన్ టైమింగ్ అలాగే ఉంటుందా?",
+ "అవును. ప్రతి ఫ్రేమ్ తన సమయాన్ని ఉంచుకుంటుంది, కొత్త GIF అసలు దానిలాగే లూప్ అవుతుంది."
+ ],
+ [
+ "అంచులు PNG కంటే పదునుగా ఎందుకు ఉన్నాయి?",
+ "GIF పిక్సెల్ పూర్తిగా పారదర్శకంగా లేదా పూర్తిగా ఘనంగా మాత్రమే ఉంటుంది. మృదువైన అంచుల కోసం “ఏదీ లేదు” బదులు రంగు లేదా ఫోటో ఎంచుకోండి."
+ ],
+ [
+ "Fizzdoc ఉచితమా?",
+ "అవును, ఇది ఎప్పటికీ ఉచితంగానే ఉంటుంది: సైన్-అప్ లేదు, వాటర్మార్క్ లేదు, రోజువారీ పరిమితి లేదు, ప్రీమియం ప్లాన్ కూడా లేదు. Fizzdoc Apache-2.0 లైసెన్స్ కింద ఓపెన్ సోర్స్, కాబట్టి ఎవరైనా తమ సొంత కాపీని రన్ చేసుకోవచ్చు."
+ ]
+ ],
+ "keywords": [
+ "GIF బ్యాక్గ్రౌండ్ తీసివేయండి",
+ "పారదర్శక GIF తయారీ",
+ "GIF బ్యాక్గ్రౌండ్ రిమూవ్ ఉచితం",
+ "యానిమేటెడ్ GIF బ్యాక్గ్రౌండ్ మార్చండి",
+ "remove gif background"
+ ]
}
}
}
diff --git a/src/i18n/tr.json b/src/i18n/tr.json
index 70660d3..e07f0c2 100644
--- a/src/i18n/tr.json
+++ b/src/i18n/tr.json
@@ -322,7 +322,15 @@
"error.NO_AUDIO_TRACK": "Bu tarayıcı bu dosyadaki sesi okuyamıyor. MP3, M4A, WAV veya MP4 dosyası deneyin.",
"error.NO_SPEECH": "Bu dosyada konuşma bulunamadı.",
"error.SETUP_FAILED": "Konuşma modeli yüklenemedi. Tek seferlik indirme için internet bağlantınızı kontrol edin, sonra tekrar deneyin.",
- "error.TRANSCRIBE_FAILED": "Yazıya dökme beklenmedik şekilde durdu. Daha kısa bir dosya deneyin; uzun kayıtlar için bilgisayar kullanın."
+ "error.TRANSCRIBE_FAILED": "Yazıya dökme beklenmedik şekilde durdu. Daha kısa bir dosya deneyin; uzun kayıtlar için bilgisayar kullanın.",
+ "ws.chooseVideo": "Video seçin",
+ "error.BAD_VIDEO": "Bu tarayıcı bu videoyu okuyamıyor. MP4 veya WebM dosyası ya da en yeni Chrome veya Edge deneyin.",
+ "error.NO_VIDEO_ENCODER": "Bu tarayıcı video kaydedemiyor. Lütfen en yeni Chrome, Edge veya Safari kullanın.",
+ "bg.frame": "Arka plan siliniyor: kare {n} / {total}…",
+ "bg.gifNote": "Hareketli GIF: her kare işlenir ve GIF olarak kaydedilir. GIF’lerde yumuşak kenar olmaz, bu yüzden “Yok” seçiliyken kenar biraz daha keskin görünür.",
+ "bg.videoNote": "Bu ilk kare. Bir arka plan seçip kaydedin: her kare bu cihazda işlenir, burada yaklaşık {min} dk sürer. Bu sekmeyi açık tutun.",
+ "bg.greenScreen": "Yeşil ekran",
+ "ws.dpiLow": "Düşük (en küçük dosya, web için)"
},
"home": {
"title": "Fizzdoc — Ücretsiz PDF, Görsel, Ses ve Office. Yüklemesiz.",
@@ -2844,6 +2852,84 @@
"ITR PDF açma",
"gelir vergisi PDF kilit açma"
]
+ },
+ "remove-video-background": {
+ "name": "Video Arka Planı Silme",
+ "summary": "Videodaki kişiyi ayırın ve arkasına renk, bulanıklık veya fotoğraf koyun. Ses korunur.",
+ "action": "Videoyu indir",
+ "title": "Video Arka Planı Silme Ücretsiz — Yeşil Ekransız | Fizzdoc",
+ "description": "Bir videonun arka planını yeşil ekran olmadan ücretsiz silin veya değiştirin: arkaya renk, bulanıklık ya da fotoğraf koyun. Ses korunur, hiçbir şey yüklenmez.",
+ "h1": "Videodan arka planı silin",
+ "lede": "Yeşil ekrana gerek yok. Her kare kendi cihazınızda bir yapay zekâ ile işlenir, ses korunur ve arkaya renk, bulanıklık veya fotoğraf koyabilirsiniz. Telefonlarda kısa klipler en iyisidir.",
+ "steps": [
+ "Bir video seçin (MP4, WebM veya MOV).",
+ "İlk kareyi önizleme olarak kullanıp arkaya ne geleceğini seçin.",
+ "“Videoyu indir”e tıklayın ve her kare bitene kadar sekmeyi açık tutun."
+ ],
+ "faq": [
+ [
+ "Dosyalarım herhangi bir yere yükleniyor mu?",
+ "Hayır. Fizzdoc, WebAssembly ve JavaScript'e derlenmiş açık kaynaklı motorları kullanarak işlemi tarayıcı sekmenizin içinde yapar. Dosyanız cihazınızdan okunur, yerel olarak işlenir ve sonuç doğrudan cihazınıza kaydedilir. Bunu kendiniz de kontrol edebilirsiniz: tarayıcınızın geliştirici araçlarını açın, Ağ (Network) sekmesine gidin ve bir işlem çalıştırın — hiçbir istek dosyanızı taşımaz."
+ ],
+ [
+ "Ne kadar sürer?",
+ "Her kare cihazınızda işlenir, bu yüzden hızına bağlıdır. Fizzdoc başlamadan önce tahmini süreyi gösterir."
+ ],
+ [
+ "Sonucu bir video düzenleyicide kullanabilir miyim?",
+ "Evet. “Yeşil ekran”ı seçin; düzenleyici yeşili tek tıkla kaldırır (chroma key). Videolar mümkünse MP4, değilse WebM olarak kaydedilir."
+ ],
+ [
+ "Fizzdoc ücretsiz mi?",
+ "Evet, ve ücretsiz kalacak: kayıt yok, filigran yok, günlük limit yok, ücretli katman yok. Fizzdoc, Apache-2.0 lisansıyla açık kaynaktır, bu yüzden herkes kendi kopyasını çalıştırabilir."
+ ]
+ ],
+ "keywords": [
+ "video arka planı silme ücretsiz",
+ "video arka planı değiştirme",
+ "yeşil ekransız arka plan silme",
+ "videodan arka plan kaldırma",
+ "remove video background"
+ ]
+ },
+ "remove-gif-background": {
+ "name": "GIF Arka Planı Silme",
+ "summary": "Hareketli bir GIF’in arka planını kare kare şeffaf yapın veya yeni renge boyayın.",
+ "action": "GIF’i indir",
+ "title": "GIF Arka Planı Silme Ücretsiz — Şeffaf Hareketli GIF | Fizzdoc",
+ "description": "Hareketli bir GIF’in arka planını ücretsiz silin: her kare cihazınızda kesilir ve şeffaf ya da yeni renkli bir GIF olarak kaydedilir. Hiçbir şey yüklenmez.",
+ "h1": "GIF’ten arka planı silin",
+ "lede": "Hareketli GIF’inizin her karesi kendi cihazınızda bir yapay zekâ ile kesilir. Şeffaf bırakın ya da arkaya renk, bulanıklık veya fotoğraf koyun ve yeniden GIF olarak kaydedin.",
+ "steps": [
+ "Hareketli bir GIF seçin.",
+ "Önizlemeye bakın ve arkaya ne geleceğini seçin.",
+ "Boyutu seçip “GIF’i indir”e tıklayın."
+ ],
+ "faq": [
+ [
+ "Dosyalarım herhangi bir yere yükleniyor mu?",
+ "Hayır. Fizzdoc, WebAssembly ve JavaScript'e derlenmiş açık kaynaklı motorları kullanarak işlemi tarayıcı sekmenizin içinde yapar. Dosyanız cihazınızdan okunur, yerel olarak işlenir ve sonuç doğrudan cihazınıza kaydedilir. Bunu kendiniz de kontrol edebilirsiniz: tarayıcınızın geliştirici araçlarını açın, Ağ (Network) sekmesine gidin ve bir işlem çalıştırın — hiçbir istek dosyanızı taşımaz."
+ ],
+ [
+ "Animasyonun zamanlaması korunur mu?",
+ "Evet. Her kare kendi süresini korur ve yeni GIF orijinali gibi döngüye girer."
+ ],
+ [
+ "Kenarlar neden PNG’den daha keskin?",
+ "Bir GIF pikseli ya tamamen şeffaf ya da tamamen dolu olabilir. Yumuşak kenar için “Yok” yerine arkaya renk veya fotoğraf seçin."
+ ],
+ [
+ "Fizzdoc ücretsiz mi?",
+ "Evet, ve ücretsiz kalacak: kayıt yok, filigran yok, günlük limit yok, ücretli katman yok. Fizzdoc, Apache-2.0 lisansıyla açık kaynaktır, bu yüzden herkes kendi kopyasını çalıştırabilir."
+ ]
+ ],
+ "keywords": [
+ "gif arka planı silme",
+ "şeffaf gif yapma",
+ "hareketli gif arka planı silme",
+ "gif arka planı değiştirme",
+ "remove gif background"
+ ]
}
}
}
diff --git a/src/i18n/vi.json b/src/i18n/vi.json
index 523dc1f..58b16d2 100644
--- a/src/i18n/vi.json
+++ b/src/i18n/vi.json
@@ -322,7 +322,15 @@
"error.NO_AUDIO_TRACK": "Trình duyệt này không đọc được âm thanh trong tệp này. Hãy thử tệp MP3, M4A, WAV hoặc MP4.",
"error.NO_SPEECH": "Không tìm thấy giọng nói trong tệp này.",
"error.SETUP_FAILED": "Không tải được mô hình giọng nói. Hãy kiểm tra kết nối internet cho lần tải một lần, rồi thử lại.",
- "error.TRANSCRIBE_FAILED": "Quá trình chuyển thành văn bản dừng đột ngột. Hãy thử tệp ngắn hơn, hoặc dùng laptop cho bản ghi dài."
+ "error.TRANSCRIBE_FAILED": "Quá trình chuyển thành văn bản dừng đột ngột. Hãy thử tệp ngắn hơn, hoặc dùng laptop cho bản ghi dài.",
+ "ws.chooseVideo": "Chọn video",
+ "error.BAD_VIDEO": "Trình duyệt này không đọc được video này. Hãy thử tệp MP4 hoặc WebM, hoặc Chrome hay Edge mới nhất.",
+ "error.NO_VIDEO_ENCODER": "Trình duyệt này không lưu được video. Hãy dùng Chrome, Edge hoặc Safari mới nhất.",
+ "bg.frame": "Đang xóa nền: khung {n}/{total}…",
+ "bg.gifNote": "GIF động: mọi khung hình đều được xử lý và lưu thành GIF. GIF không có viền mềm, nên khi chọn “Không” viền sẽ sắc hơn một chút.",
+ "bg.videoNote": "Đây là khung hình đầu tiên. Chọn nền rồi lưu: mọi khung hình được xử lý trên thiết bị này, khoảng {min} phút. Hãy giữ tab này mở.",
+ "bg.greenScreen": "Phông xanh",
+ "ws.dpiLow": "Thấp (tệp nhỏ nhất, cho web)"
},
"home": {
"title": "Fizzdoc — Công Cụ PDF, Ảnh, Âm Thanh & Office Miễn Phí",
@@ -2844,6 +2852,84 @@
"mở pdf ITR",
"mở khóa pdf thuế thu nhập"
]
+ },
+ "remove-video-background": {
+ "name": "Xóa Nền Video",
+ "summary": "Tách người khỏi video và đặt màu, làm mờ hoặc ảnh phía sau. Giữ nguyên âm thanh.",
+ "action": "Tải video",
+ "title": "Xóa Nền Video Miễn Phí — Không Cần Phông Xanh | Fizzdoc",
+ "description": "Xóa hoặc thay nền video miễn phí, không cần phông xanh: đặt màu, làm mờ hoặc ảnh phía sau. Âm thanh được giữ nguyên và không có gì được tải lên.",
+ "h1": "Xóa nền khỏi video",
+ "lede": "Không cần phông xanh. AI xử lý từng khung hình ngay trên thiết bị của bạn, giữ nguyên âm thanh, và bạn có thể đặt màu, làm mờ hoặc ảnh phía sau. Trên điện thoại, clip ngắn chạy tốt nhất.",
+ "steps": [
+ "Chọn video (MP4, WebM hoặc MOV).",
+ "Chọn nền phía sau, xem trước bằng khung hình đầu tiên.",
+ "Bấm “Tải video” và giữ tab mở đến khi xử lý xong."
+ ],
+ "faq": [
+ [
+ "Tệp của tôi có được tải lên đâu không?",
+ "Không. Fizzdoc xử lý mọi thứ ngay trong tab trình duyệt của bạn, sử dụng các engine mã nguồn mở được biên dịch sang WebAssembly và JavaScript. Tệp của bạn được đọc từ thiết bị, xử lý cục bộ, rồi kết quả được lưu thẳng trở lại thiết bị. Bạn có thể tự kiểm chứng: mở công cụ dành cho nhà phát triển của trình duyệt, vào tab Network và thực hiện một thao tác — sẽ không có yêu cầu nào mang theo tệp của bạn."
+ ],
+ [
+ "Mất bao lâu?",
+ "Mỗi khung hình được xử lý trên thiết bị của bạn, nên tùy vào tốc độ máy. Fizzdoc hiển thị thời gian ước tính trước khi bắt đầu."
+ ],
+ [
+ "Có dùng kết quả trong trình dựng video được không?",
+ "Được. Chọn “Phông xanh” rồi trình dựng xóa màu xanh chỉ với một cú nhấp (chroma key). Video lưu dạng MP4 nếu được, nếu không thì WebM."
+ ],
+ [
+ "Fizzdoc có miễn phí không?",
+ "Có, và sẽ luôn miễn phí: không cần đăng ký, không watermark, không giới hạn hằng ngày và không có gói trả phí. Fizzdoc là mã nguồn mở theo giấy phép Apache-2.0, nên ai cũng có thể tự chạy một bản sao của riêng mình."
+ ]
+ ],
+ "keywords": [
+ "xóa nền video miễn phí",
+ "đổi nền video",
+ "xóa phông video không cần phông xanh",
+ "tách nền video online",
+ "remove video background"
+ ]
+ },
+ "remove-gif-background": {
+ "name": "Xóa Nền GIF",
+ "summary": "Làm nền GIF động trong suốt hoặc đổi màu, từng khung hình.",
+ "action": "Tải GIF",
+ "title": "Xóa Nền GIF Miễn Phí — GIF Động Trong Suốt | Fizzdoc",
+ "description": "Xóa nền GIF động miễn phí: từng khung hình được tách ngay trên thiết bị của bạn và lưu thành GIF trong suốt hoặc đổi màu. Không tải lên gì cả.",
+ "h1": "Xóa nền khỏi GIF",
+ "lede": "Từng khung hình trong GIF động của bạn được AI tách nền ngay trên thiết bị. Giữ trong suốt hoặc đặt màu, làm mờ hay ảnh phía sau, rồi lưu lại thành GIF.",
+ "steps": [
+ "Chọn một GIF động.",
+ "Xem trước và chọn nền phía sau.",
+ "Chọn kích thước rồi bấm “Tải GIF”."
+ ],
+ "faq": [
+ [
+ "Tệp của tôi có được tải lên đâu không?",
+ "Không. Fizzdoc xử lý mọi thứ ngay trong tab trình duyệt của bạn, sử dụng các engine mã nguồn mở được biên dịch sang WebAssembly và JavaScript. Tệp của bạn được đọc từ thiết bị, xử lý cục bộ, rồi kết quả được lưu thẳng trở lại thiết bị. Bạn có thể tự kiểm chứng: mở công cụ dành cho nhà phát triển của trình duyệt, vào tab Network và thực hiện một thao tác — sẽ không có yêu cầu nào mang theo tệp của bạn."
+ ],
+ [
+ "Nhịp của ảnh động có giữ nguyên không?",
+ "Có. Mỗi khung hình giữ thời lượng riêng và GIF mới lặp lại như bản gốc."
+ ],
+ [
+ "Sao viền sắc hơn PNG?",
+ "Điểm ảnh GIF chỉ có thể trong suốt hoàn toàn hoặc đặc hoàn toàn. Muốn viền mềm, hãy chọn màu hoặc ảnh phía sau thay vì “Không”."
+ ],
+ [
+ "Fizzdoc có miễn phí không?",
+ "Có, và sẽ luôn miễn phí: không cần đăng ký, không watermark, không giới hạn hằng ngày và không có gói trả phí. Fizzdoc là mã nguồn mở theo giấy phép Apache-2.0, nên ai cũng có thể tự chạy một bản sao của riêng mình."
+ ]
+ ],
+ "keywords": [
+ "xóa nền gif",
+ "tạo gif trong suốt",
+ "xóa nền gif động miễn phí",
+ "đổi nền gif",
+ "remove gif background"
+ ]
}
}
}
diff --git a/src/modules.d.ts b/src/modules.d.ts
new file mode 100644
index 0000000..7b99cca
--- /dev/null
+++ b/src/modules.d.ts
@@ -0,0 +1,28 @@
+// Types for modules that ship without their own, or that are aliased in vite.config.ts.
+
+// 'ort-webgpu' is ONNX Runtime's WebGPU build, aliased in vite.config.ts (the package name itself is
+// pointed at the CPU build for Audio to Text). Same API as the package.
+declare module 'ort-webgpu' {
+ export * from 'onnxruntime-web';
+}
+
+// gifenc ships without types; these are the parts Fizzdoc uses.
+declare module 'gifenc' {
+ type Palette = number[][];
+ export function quantize(
+ rgba: Uint8Array | Uint8ClampedArray,
+ maxColors: number,
+ options?: { format?: 'rgb565' | 'rgb444' | 'rgba4444'; oneBitAlpha?: boolean | number; clearAlpha?: boolean; clearAlphaThreshold?: number; clearAlphaColor?: number },
+ ): Palette;
+ export function applyPalette(rgba: Uint8Array | Uint8ClampedArray, palette: Palette, format?: 'rgb565' | 'rgb444' | 'rgba4444'): Uint8Array;
+ export function GIFEncoder(): {
+ writeFrame(
+ index: Uint8Array,
+ width: number,
+ height: number,
+ options?: { palette?: Palette; delay?: number; repeat?: number; transparent?: boolean; transparentIndex?: number; dispose?: number },
+ ): void;
+ finish(): void;
+ bytes(): Uint8Array;
+ };
+}
diff --git a/src/ort-webgpu.d.ts b/src/ort-webgpu.d.ts
deleted file mode 100644
index 7a109dc..0000000
--- a/src/ort-webgpu.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-// 'ort-webgpu' is ONNX Runtime's WebGPU build, aliased in vite.config.ts (the package name itself is
-// pointed at the CPU build for Audio to Text). Same API as the package.
-declare module 'ort-webgpu' {
- export * from 'onnxruntime-web';
-}
diff --git a/src/seo.ts b/src/seo.ts
index faf824c..7257288 100644
--- a/src/seo.ts
+++ b/src/seo.ts
@@ -196,6 +196,8 @@ function input(c: Copy, tool: Tool) {
const ext = /\.\w+/.exec(accept)?.[0] ?? '';
const choose = accept.startsWith('audio/*,video/*')
? c.t('ws.chooseMedia')
+ : accept.startsWith('video/')
+ ? c.t('ws.chooseVideo')
: accept.startsWith('.mp3')
? c.t(multiple ? 'ws.chooseAudios' : 'ws.chooseAudio')
: accept.startsWith('application/pdf')
@@ -260,7 +262,7 @@ function optionsHtml(c: Copy, tool: Tool) {
`;
if (tool.op === 'pdf-to-jpg')
- return ``;
+ return ``;
if (tool.op === 'excel-to-json') return ``;
if (tool.op === 'compress-pdf' || tool.op === 'office-compress')
return ``;
diff --git a/src/site.ts b/src/site.ts
index 267d0fe..d2d2acf 100644
--- a/src/site.ts
+++ b/src/site.ts
@@ -1228,6 +1228,61 @@ TOOLS.push(
],
input: { accept: 'image/*' },
},
+ {
+ op: 'remove-bg',
+ format: 'image',
+ slug: 'remove-video-background',
+ name: 'Remove Video Background',
+ summary: 'Cut a person out of a video and put a colour, blur or photo behind. Sound included.',
+ action: 'Download video',
+ title: 'Remove Video Background Free — No Green Screen, No Upload | Fizzdoc',
+ description:
+ 'Remove or change a video’s background for free, without a green screen: put a colour, a blur or a photo behind. Sound is kept and nothing is uploaded.',
+ h1: 'Remove the background from a video',
+ lede: 'No green screen needed. Every frame is done by an AI on your own device, the sound is kept, and you can put a colour, a blur or a photo behind. Short clips work best on phones.',
+ steps: [
+ 'Choose a video (MP4, WebM or MOV).',
+ 'Pick what goes behind, using the first frame as a preview.',
+ 'Click “Download video” and keep the tab open while every frame is done.',
+ ],
+ faq: [
+ PRIVACY_FAQ[0],
+ [
+ 'How long does it take?',
+ 'Every frame is processed on your own device, so it depends on its speed. A recent laptop or phone with a graphics chip is fastest; older phones can take about a minute for a few seconds of video. Fizzdoc shows an estimate before you start.',
+ ],
+ [
+ 'Can I use the cut-out in a video editor?',
+ 'Yes. Choose “Green screen” and the person is saved on a solid green background, which video editors can remove in one click (chroma key). Videos save as MP4 where the browser can, otherwise WebM.',
+ ],
+ PRIVACY_FAQ[1],
+ ],
+ input: { accept: 'video/*' },
+ },
+ {
+ op: 'remove-bg',
+ format: 'image',
+ slug: 'remove-gif-background',
+ name: 'Remove GIF Background',
+ summary: 'Make an animated GIF’s background clear or a new colour, frame by frame.',
+ action: 'Download GIF',
+ title: 'Remove GIF Background Free — Transparent Animated GIF | Fizzdoc',
+ description:
+ 'Remove the background from an animated GIF for free: every frame is cut out on your device and saved as a clear or recoloured GIF. Nothing is uploaded.',
+ h1: 'Remove the background from a GIF',
+ lede: 'Every frame of your animated GIF is cut out by an AI on your own device. Keep it clear, or put a colour, a blur or a photo behind, and save it as a GIF again.',
+ steps: ['Choose an animated GIF.', 'Watch the preview and pick what goes behind.', 'Choose the size and click “Download GIF”.'],
+ faq: [
+ PRIVACY_FAQ[0],
+ ['Will the animation keep its timing?', 'Yes. Every frame keeps its own delay, and the new GIF loops like the original.'],
+ [
+ 'Why are the edges a little sharper than in a PNG?',
+ 'A GIF pixel can only be fully see-through or fully solid, so soft edges can’t be kept on a clear background. For soft edges, pick a colour or a photo behind instead of “None”.',
+ ],
+ PRIVACY_FAQ[1],
+ ],
+ input: { accept: 'image/gif,.gif' },
+ },
);
// Popular searches that are the same job with a different file type get their own page and copy.
@@ -1699,6 +1754,20 @@ const KEYWORDS: Record = {
'bulk image converter',
'image to WebP'
],
+ 'remove-video-background': [
+ 'remove background from video free',
+ 'video background remover',
+ 'change video background',
+ 'remove video background without green screen',
+ 'transparent background video',
+ ],
+ 'remove-gif-background': [
+ 'remove gif background',
+ 'transparent gif maker',
+ 'make gif background transparent',
+ 'gif background remover free',
+ 'change animated gif background',
+ ],
'remove-background': [
'remove background from image free',
'make background transparent',
diff --git a/src/tools/remove-bg.ts b/src/tools/remove-bg.ts
index 57bf2ff..c0b0200 100644
--- a/src/tools/remove-bg.ts
+++ b/src/tools/remove-bg.ts
@@ -3,6 +3,7 @@
// spot the model missed. Built for big buttons and few decisions; everything stays on the device.
import './remove-bg.css';
import { compose, removeBackground, render, type Backdrop, type SaveFormat } from '../engine/background';
+import { decodeGif, encodeGif, type GifFrame } from '../engine/gif';
import type { Output } from '../engine/local';
import { t } from '../i18n';
@@ -31,13 +32,28 @@ const element = (tag: K, className = '',
};
export async function openBackgroundEditor(file: File, viewer: HTMLElement, preset: Record = {}): Promise {
+ // Videos: the first frame is the preview; the whole video is done when it's saved.
+ const video = file.type.startsWith('video/') || /\.(mp4|m4v|mov|webm|mkv)$/i.test(file.name) ? await import('../engine/video-background') : undefined;
+ const info = video && (await video.videoInfo(file));
let photo: ImageBitmap;
- try {
- photo = await createImageBitmap(file);
- } catch {
- const { LocalError } = await import('../engine/local');
- throw new LocalError('BAD_IMAGE');
+ if (info) photo = info.first;
+ else
+ try {
+ photo = await createImageBitmap(file);
+ } catch {
+ const { LocalError } = await import('../engine/local');
+ throw new LocalError('BAD_IMAGE');
+ }
+ // Animated GIFs: every frame gets its background removed, and the result is saved as a GIF.
+ let gifFrames: GifFrame[] = [];
+ if (file.type === 'image/gif' || /\.gif$/i.test(file.name)) {
+ try {
+ gifFrames = decodeGif(await file.arrayBuffer()).frames;
+ } catch {
+ gifFrames = []; // unreadable as an animation: treat it as a still picture
+ }
}
+ const animated = gifFrames.length > 1;
const W = photo.width;
const H = photo.height;
@@ -85,18 +101,49 @@ export async function openBackgroundEditor(file: File, viewer: HTMLElement, pres
bar.style.setProperty('--pct', `${pct}%`);
return pct;
};
- const source = await createImageBitmap(photo);
- const { cutout, model } = await removeBackground(source, {
- onSetup: (loaded, total) => {
- setBar(loaded / total);
- busyText.textContent = t('bg.preparing', { loaded: Math.round(loaded / 1e6), total: Math.round(total / 1e6) });
- },
- onProgress: (fraction) => {
- busyText.textContent = t('bg.working', { pct: setBar(fraction) });
- },
- });
+ const onSetup = (loaded: number, total: number) => {
+ setBar(loaded / total);
+ busyText.textContent = t('bg.preparing', { loaded: Math.round(loaded / 1e6), total: Math.round(total / 1e6) });
+ };
+ // Frames of an animation: their own photos and cut-outs, and how long each one shows.
+ const frames: { photo: ImageBitmap; cut: ImageBitmap; delay: number }[] = [];
+ let cutout!: ImageData;
+ let model = '';
+ if (animated) {
+ for (const [i, frame] of gifFrames.entries()) {
+ const framePhoto = await createImageBitmap(frame.image);
+ const result = await removeBackground(await createImageBitmap(framePhoto), {
+ fast: true,
+ onSetup,
+ onProgress: (fraction) => {
+ busyText.textContent = t('bg.frame', { n: i + 1, total: gifFrames.length });
+ setBar((i + fraction) / gifFrames.length);
+ },
+ });
+ frames.push({ photo: framePhoto, cut: await createImageBitmap(result.cutout), delay: frame.delay });
+ ({ cutout, model } = result);
+ }
+ note.textContent = t('bg.gifNote');
+ } else {
+ const started = performance.now();
+ let ready = started; // when the one-time download finished
+ ({ cutout, model } = await removeBackground(await createImageBitmap(photo), {
+ fast: !!info,
+ onSetup: (loaded, total) => {
+ onSetup(loaded, total);
+ ready = performance.now();
+ },
+ onProgress: (fraction) => {
+ busyText.textContent = t('bg.working', { pct: setBar(fraction) });
+ },
+ }));
+ if (info) {
+ // A rough idea of the wait: this frame's time, for every frame at 30 per second.
+ const minutes = Math.max(1, Math.round(((performance.now() - ready) / 1000) * info.duration * 30 / 60));
+ note.textContent = t('bg.videoNote', { min: minutes });
+ } else if (model === 'u2netp') note.textContent = t('bg.lite');
+ }
busy.hidden = true;
- if (model === 'u2netp') note.textContent = t('bg.lite');
// The full-size cut-out lives on its own canvas; touch-ups change it in place.
const cut = new OffscreenCanvas(W, H);
@@ -107,7 +154,17 @@ export async function openBackgroundEditor(file: File, viewer: HTMLElement, pres
let backdrop: Backdrop = { kind: 'none' };
let ownPhoto: ImageBitmap | undefined;
- const draw = () => compose(canvas, cut, photo, backdrop);
+ // Animations play in the preview; `shown` is the frame on screen.
+ let shown = 0;
+ const draw = () => (animated ? compose(canvas, frames[shown].cut, frames[shown].photo, backdrop) : compose(canvas, cut, photo, backdrop));
+ let timer: ReturnType | undefined;
+ const play = () => {
+ draw();
+ timer = setTimeout(() => {
+ shown = (shown + 1) % frames.length;
+ play();
+ }, Math.max(20, frames[shown].delay));
+ };
// ---- Backdrop choices ----
const buttons: HTMLButtonElement[] = [];
@@ -128,10 +185,11 @@ export async function openBackgroundEditor(file: File, viewer: HTMLElement, pres
choices.append(button);
return button;
};
- const none = choice(t('bg.none'), () => {
- backdrop = { kind: 'none' };
- });
- none.querySelector('.bg-chip')!.classList.add('bg-chip-clear');
+ // For videos, "no background" is a green screen (see engine/video-background.ts).
+ const none = choice(info ? t('bg.greenScreen') : t('bg.none'), () => {
+ backdrop = info && video ? { kind: 'color', color: video.GREEN_SCREEN } : { kind: 'none' };
+ }, info && video ? video.GREEN_SCREEN : undefined);
+ if (!info) none.querySelector('.bg-chip')!.classList.add('bg-chip-clear');
const colors = new Map();
for (const [key, color] of SWATCHES)
colors.set(
@@ -250,6 +308,7 @@ export async function openBackgroundEditor(file: File, viewer: HTMLElement, pres
undo.disabled = true;
tools.append(modeButton('erase'), modeButton('restore'), brushLabel, undo);
touch.append(tools);
+ touch.hidden = animated || !!info; // touch-ups are for still pictures
// Each stroke remembers the 64×64 tiles it changed, so Undo restores just those.
type Snapshot = Map;
@@ -353,7 +412,7 @@ export async function openBackgroundEditor(file: File, viewer: HTMLElement, pres
const showOriginal = (on: boolean) => {
if (on) {
preview.clearRect(0, 0, canvas.width, canvas.height);
- preview.drawImage(photo, 0, 0, canvas.width, canvas.height);
+ preview.drawImage(animated ? frames[shown].photo : photo, 0, 0, canvas.width, canvas.height);
} else draw();
compare.classList.toggle('active', on);
};
@@ -363,12 +422,36 @@ export async function openBackgroundEditor(file: File, viewer: HTMLElement, pres
if (event.key === ' ' || event.key === 'Enter') showOriginal(true);
});
compare.addEventListener('keyup', () => showOriginal(false));
- draw();
+ if (animated) play();
+ else draw();
const base = file.name.replace(/\.[^.]+$/, '');
return {
async save(options, onProgress) {
+ if (video) {
+ const w = outputWidth();
+ const { blob, extension } = await video.replaceVideoBackground(file, { backdrop, width: w, height: Math.round((H * w) / W), onProgress });
+ return { blob, name: `${base}-new-bg.${extension}`, summary: `${w} × ${Math.round((H * w) / W)} px` };
+ }
onProgress?.(0.2);
+ if (animated) {
+ const w = outputWidth();
+ const h = Math.max(1, Math.round((H * w) / W));
+ const canvas = new OffscreenCanvas(w, h);
+ const context = canvas.getContext('2d', { willReadFrequently: true })!;
+ const rendered = frames.map((frame, i) => {
+ compose(canvas, frame.cut, frame.photo, backdrop);
+ onProgress?.(0.2 + (0.5 * (i + 1)) / frames.length);
+ return { data: context.getImageData(0, 0, w, h).data, delay: frame.delay };
+ });
+ const bytes = encodeGif(rendered, w, h, backdrop.kind === 'none');
+ onProgress?.(1);
+ return {
+ blob: new Blob([bytes as Uint8Array], { type: 'image/gif' }),
+ name: `${base}-${backdrop.kind === 'none' ? 'no-bg' : 'new-bg'}.gif`,
+ summary: `${w} × ${h} px`,
+ };
+ }
const chosen = (['png', 'jpg', 'webp'] as SaveFormat[]).find((f) => f === options.format) ?? (backdrop.kind === 'none' ? 'png' : 'jpg');
const w = outputWidth();
const h = Math.max(1, Math.round((H * w) / W));
@@ -381,6 +464,11 @@ export async function openBackgroundEditor(file: File, viewer: HTMLElement, pres
};
},
destroy() {
+ clearTimeout(timer);
+ for (const frame of frames) {
+ frame.photo.close();
+ frame.cut.close();
+ }
photo.close();
ownPhoto?.close();
viewer.classList.remove('bg-editor');