image

File in Image

Embed one arbitrary file into image pixels and recover it later from the generated PNG, with optional password protection.

Local processing
About your filesFiles and content selected in this tool are processed in your browser and are not uploaded to a Browser Kitty backend.
Operation demo See the basic workflow in a short video.

About this tool

File in Image uses a PNG, JPEG, or WebP carrier image to hold one arbitrary file inside its pixels, then recovers the original file later from the generated PNG. One payload can be embedded per run, up to 32 MiB.

Capacity is based on fully opaque RGB pixels and the actual stored body size after optional GZIP, not only on the source file size. Optional password protection encrypts embedded data, including the original filename, with PBKDF2-HMAC-SHA-256 and AES-256-GCM.

Before Save is enabled, the app re-opens the generated PNG, runs the normal extraction path, recovers the original payload, and checks its SHA-256. The carrier image, payload, password, generated PNG, and recovered bytes are processed in the browser rather than uploaded to Browser Kitty for conversion.

Good for

  • Keep an image and one related small file together as a single PNG for local storage
  • Embed arbitrary file bytes into an image and later recover the original bytes with the same tool
  • Password-protect the embedded data, including the original filename

What it can do

Key capabilities available in this tool.

How to use

  1. Choose or drag and drop a PNG, JPEG, or WebP carrier image.
  2. Choose the one file to embed. The source payload can be up to 32 MiB.
  3. Review the available capacity and actual stored size shown by the app.
  4. If needed, enable password protection and enter the same password twice.
  5. Run Embed in image and wait for adaptive embedding and automatic recovery verification of the generated PNG.
  6. After SHA-256 verification succeeds, optionally edit the output filename and save the PNG.
  7. To recover the file, switch to Extract, load the generated PNG, enter the password when required, and save the recovered file.

Supported

  • Carrier input: PNG / JPEG / WebP. The generated carrier output is PNG only.
  • Payload: one arbitrary file up to 32 MiB. Carrier images are limited to 32 MP, and only fully opaque pixels contribute embedding capacity.
  • Compression: the complete BKFC container is GZIP-compressed only when the compressed form is smaller.
  • Password protection: PBKDF2-HMAC-SHA-256 with 600,000 iterations derives material for AES-256-GCM protection of the body containing filename, MIME, SHA-256, and original data.
  • Recovery verification: before saving, the generated PNG is decoded again and passed through the normal recovery path, then SHA-256, filename, MIME, and byte length are checked.
  • Compatibility: v1.0.0 writes format version 1 and can also read version 0 images created by v0.2.0–v0.8.0.

Limitations and notes

  • One file can be embedded per run and the source payload is limited to 32 MiB. Actual capacity depends on carrier dimensions, fully opaque pixels, and compressed stored size.
  • Output is PNG only. Resizing, cropping, filtering, taking a screenshot, or converting the generated PNG to JPEG or lossy WebP can destroy the embedded data.
  • Social or messaging services may recompress or convert images and make recovery impossible. Keep or transfer the generated PNG without editing it.
  • Adaptive placement distributes 1-bit RGB changes toward higher-detail areas. It does not guarantee resistance to image editing or make the embedded data undetectable.
  • High-resolution images can use significant device memory for Canvas / ImageData and Worker processing.
  • GZIP recovery requires DecompressionStream, password protection requires Web Crypto, and adaptive image processing requires a Blob Web Worker. Missing browser capabilities can limit some operations.

Frequently asked questions

What kinds of files can I embed?

Any file type can be used. One payload up to 32 MiB can be embedded per run, but actual fit depends on the carrier's available fully opaque RGB pixels and the stored size after optional GZIP.

Which carrier image formats are supported?

PNG, JPEG, and WebP can be used as carrier inputs. The generated image is saved as PNG.

Can I protect the embedded file with a password?

Yes. Optional password protection uses PBKDF2-HMAC-SHA-256 and AES-256-GCM for new output and protects embedded data including the original filename.

Can I resize or compress the generated PNG and still recover the file?

Not reliably. The data is stored in pixel LSBs, so resizing, cropping, editing, JPEG conversion, lossy WebP conversion, or recompression can destroy it. Keep the generated PNG unchanged.

Does the app verify that the generated PNG can really recover the file?

Yes. It re-opens the generated PNG, runs the standard extraction path, and enables saving only after SHA-256, filename, MIME, and byte length match.

Are the carrier image or embedded file uploaded to a server?

No. The hosted version first loads the application HTML, but image loading, compression, encryption, embedding, recovery verification, and extraction run in the browser, and user files are not sent to Browser Kitty.

Offline version and source code

The dist/index.html published through GitHub Pages is generated as a standalone HTML containing the application code. Save it and open it directly with file:// in a supported browser to load images, use GZIP, apply optional password protection, perform adaptive embedding, verify generated PNG recovery, and extract files without runtime external networking.

View source on GitHub