Importing a PIL drawer from
qrcode.image.styles.moduledrawershas been deprecated. Update your code to import directly from thepilmodule instead:from qrcode.image.styles.moduledrawers import SquareModuleDrawer # Old from qrcode.image.styles.moduledrawers.pil import SquareModuleDrawer # New
Calling
QRCode.make_imageorStyledPilImagewith the argumentsembeded_imageorembeded_image_pathhave been deprecated due to typographical errors. Update your code to use the correct argumentsembedded_imageandembededd_image_path:qr = QRCode() qr.make_image(embeded_image=..., embeded_image_path=...) # Old qr.make_image(embedded_image=..., embedded_image_path=...) # New StyledPilImage(embeded_image=..., embeded_image_path=...) # Old StyledPilImage(embedded_image=..., embedded_image_path=...) # New
The
widthandheightattributes will be removed from the<svg>tag. Instead, theviewBoxattribute is now used for defining the dimensions. Additionally, all SVG elements now utilize pixel units rather than millimeters, which may cause rendering differences in browsers.
- Added
GappedCircleModuleDrawer(PIL) to render QR code modules as non-contiguous circles. (BenwestGate in #373) - Added ability to execute as a Python module:
python -m qrcode --output qrcode.png "hello world"(stefansjs in #400) - Removed the hardcoded 'id' argument from SVG elements. The fixed element ID caused conflicts when embedding multiple QR codes in a single document. (m000 in #385)
- Fixed typos in code that used
embededinstead ofembedded. For backwards compatibility, the misspelled parameter names are still accepted but now emit deprecation warnings. These deprecated parameter names will be removed in v9.0. (benjnicholls in #349) - Fixed an issue where an
<svg:prefix in the SVG output caused invalid markup when inlined within HTML documents. (bartTC in #412) - Migrate pyproject.toml to PEP 621-compliant [project] metadata format. (hroncok in #399)
- Improved test coveraged (akx in #315)
- Implement Ruff rules and perform comprehensive code cleanup. (bartTC in #408)
- Modernize development setup: use
uvandjust, add support for Python 3.14, and drop support for Python 3.9. (hugovk in #420) - Fix
QRCode.clear()to properly reset the internal state, allowing instance reuse. (m000 in #411) - Significant performance improvement for
SolidFillColorMask. (heitor in #397) - Fix thread safety issue in
bisect_leftusage. (Fixes #421) - Fix
ValueError: glog(0)when encoding zero-heavy data. (Fixes #330) - Fix mask evaluation to include format info, version info, and the dark module per ISO 18004 §7.8.3.1. (Jaimeetxebarria in #389)
- Optimize QRColorMask apply_mask method for enhanced performance
- Fix typos on StyledPilImage embeded_* parameters. The old parameters with the typos are still accepted for backward compatibility.
- Added support for Python 3.13.
- Added support for Python 3.11 and 3.12.
- Drop support for Python <=3.8.
- Change local development setup to use Poetry.
- Testsuite and code quality checks are done through Github Actions.
- Code quality and formatting utilises ruff.
- Removed
typing_extensionsas a dependency, as it's no longer required with having Python 3.9+ as a requirement. having Python 3.9+ as a requirement. - Only allow high error correction rate (qrcode.ERROR_CORRECT_H) when generating QR codes with embedded images to ensure content is readable
- Allow
pypngfactory to allow for saving to a string (likeqr.save("some_file.png")) in addition to file-like objects.
- Fix bad over-optimization in v7.4 that broke large QR codes. Thanks to mattiasj-axis!
- Restructure the factory drawers, allowing different shapes in SVG image factories as well.
- Add a
--factory-draweroption to theqrconsole script. - Optimize the output for the
SVGPathImagefactory (more than 30% reduction in file sizes). - Add a
pypngimage factory as a pure Python PNG solution. Ifpillowis not installed, then this becomes the default factory. - The
pymagingimage factory has been removed, but its factory shortcut and the actual PymagingImage factory class now just link to the PyPNGImage factory.
- Improvements for embedded image.
- Skip color mask if QR is black and white
- Add Styled PIL image factory, allowing different color masks and shapes in QR codes
- Small performance inprovement
- Add check for border size parameter
- Add --ascii parameter to command line interface allowing to output ascii when stdout is piped
- Add --output parameter to command line interface to specify output file
- Accept RGB tuples in fill_color and back_color
- Add to_string method to SVG images
- Replace inline styles with SVG attributes to avoid CSP issues
- Add Python3.10 to supported versions
- Drop Python < 3.6 support.
- Fix short chunks of data not being optimized to the correct mode.
- Tests fixed for Python 3
- Fix optimize length being ignored in
QRCode.add_data. - Better calculation of the best mask pattern and related optimizations. Big thanks to cryptogun!
- Fix incomplete block table for QR version 15. Thanks Rodrigo Queiro for the report and Jacob Welsh for the investigation and fix.
- Avoid unnecessary dependency for non MS platforms, thanks to Noah Vesely.
- Make
BaseImage.get_image()actually work.
- Add
--error-correctionoption to qr script. - Fix script piping to stdout in Python 3 and reading non-UTF-8 characters in Python 3.
- Fix script piping in Windows.
- Add some useful behind-the-curtain methods for tinkerers.
- Fix terminal output when using Python 2.6
- Fix terminal output to display correctly on MS command line.
- Small fix to terminal output in Python 3 (and fix tests)
- Revert some terminal changes from 5.2 that broke Python 3's real life tty code generation and introduce a better way from Jacob Welsh.
- Make
qrscript work in Windows. Thanks Ionel Cristian Mărieș - Fixed print_ascii function in Python 3.
- Out-of-bounds code version numbers are handled more consistently with a ValueError.
- Much better test coverage (now only officially supporting Python 2.6+)
- Speed optimizations.
- Change the output when using the
qrscript to use ASCII rather than just colors, better using the terminal real estate. - Fix a bug in passing bytecode data directly when in Python 3.
- Substation speed optimizations to best-fit algorithm (thanks Jacob Welsh!).
- Introduce a
print_asciimethod and use it as the default for theqrscript rather thanprint_tty.
- Update version numbers correctly.
- Made qrcode work on Python 2.4 - Thanks tcely. Note: officially, qrcode only supports 2.5+.
- Support pure-python PNG generation (via pymaging) for Python 2.6+ -- thanks Adam Wisniewski!
- SVG image generation now supports alternate sizing (the default box size of 10 -- 1mm per rectangle).
- SVG path image generation allows cleaner SVG output by combining all QR rects into a single path. Thank you, Viktor Stískala.
- Added some extra simple SVG factories that fill the background white.
- Fix the pymaging backend not able to save the image to a buffer. Thanks ilj!
- Fix incorrect regex causing a comma to be considered part of the alphanumeric set.
- Switch to using setuptools for setup.py.
- Fix bad QR code generation due to the regex comma fix in version 4.0.2.
- Bad version number for previous hotfix release.
- Important fixes for incorrect matches of the alphanumeric encoding mode.
Previously, the pattern would match if a single line was alphanumeric only
(even if others wern't). Also, the two characters
{and}had snuck in as valid characters. Thanks to Eran Tromer for the report and fix. - Optimized chunking -- if the parts of the data stream can be encoded more efficiently, the data will be split into chunks of the most efficient modes.
- Update change log to contain version 3.1 changes. :P
- Give the
qrscript an--optimizeargument to control the chunk optimization setting.
- Python 3 support.
- Add QRCode.get_matrix, an easy way to get the matrix array of a QR code including the border. Thanks Hugh Rawlinson.
- Add in a workaround so that Python 2.6 users can use SVG generation (they
must install
lxml). - Some initial tests! And tox support (
pip install tox) for testing across Python platforms.
- Fix incorrect termination padding.
- Fix the first four columns incorrectly shifted by one. Thanks to Josep Gómez-Suay for the report and fix.
- Fix strings within 4 bits of the QR version limit being incorrectly terminated. Thanks to zhjie231 for the report.
- The PilImage wrapper is more transparent - you can use any methods or attributes available to the underlying PIL Image instance.
- Fixed the first column of the QR Code coming up empty! Thanks to BecoKo.
- Fix installation error on Windows.
- Use a pluggable backend system for generating images, thanks to Branko Čibej! Comes with PIL and SVG backends built in.
- Fix a packaging issue
- Added a
showmethod to the PIL image wrapper so therun_examplefunction actually works.
- When adding data, auto-select the more efficient encoding methods for numbers and alphanumeric data (KANJI still not supported).
- Encode unicode to utf-8 bytestrings when adding data to a QRCode.
- Fixed tty output to work on both white and black backgrounds.
- Added border parameter to allow customizing of the number of boxes used to create the border of the QR code
- Added a
qrscript which can be used to output a qr code to the tty using background colors, or to a file via a pipe.