Click the image to upload your own file.
This tool is an implementation of methodology from this research paper. It works by dividing each pixel (module) from the original QR code into 3x3 submodules, we bind the center submodule to its original colour, then the remaining submodules are free to be assigned to any other value. In my implementation I also added a submodule factor parameter with which you can increase the resolution of the 8 free pixels.
This property makes it very easy to embed a monochromatic image into the QR code. This differs from more commonly used embedding practices which paste a bitmap image onto the center of the QR code as those methods rely on error correction to make up for the erased bits. This algorithm, ideally doesn't cause any bits to be read improperly (though this doesn't always happen and error correction does have to kick in sometimes).
This works in most cases, success however varies by real-world conditions such as lighting and the performance of the QR code scanner used. It can get especially difficult with larger images. Realisitically, there's nothing stopping this tool from being used up to QR code type 40, but in this implementation it becomes very difficult for most readers to properly scan them. I specifically had a lot of trouble getting zbar to scan halftone QR codes, but my phone had no such problem.
In the original paper, they found it important for scannability to not touch the timing and format bits, in my experimentation it didn't seem to affect readability so I've left them unprotected. The only bits I found that are necessary to leave untouched are the positioning and alignment patterns.