Join GitHub today
GitHub is home to over 28 million developers working together to host and review code, manage projects, and build software together.Sign up
cannot write mode RGBA as JPEG (4.2.0) #2609
What did you do?
Tried to save JPG file (any JPG file).
What did you expect to happen?
Saving without any exceptions (was working in 4.1.1 version)
What actually happened?
File /usr/lib/python3.6/site-packages/PIL/Image.py, line 1893, in save
What versions of Pillow and Python are you using?
4.2.0 (with 4.1.1 works properly) / Python 3.6
Please include code that reproduces the issue and whenever possible, an image that demonstrates the issue. Please upload images to GitHub, not to third-party file hosting sites. If necessary, add the image to a zip or tar archive.
The best reproductions are self-contained scripts with minimal dependencies. If you are using a framework such as plone, Django, or buildout, try to replicate the issue just using Pillow.
im = Image.open(file_path) im = im.convert("RGBA") im.save(hidpi_path, file_type, quality=95)
JPEGs can't represent an alpha channel. It's been issuing a warning for a while, removed in this release.
@AymericHENRY Hi. While this is just reiterating what has already been said, you should have no problem saving an image in RGBA mode to PNG. To save an image in RGBA mode as JPEG means getting rid of the alpha channel, because JPEG doesn't transparency. So, if you have an image in RGBA mode, then converting it to RGB will let you save it as JPEG.
>>> from PIL import Image >>> im = Image.new("RGBA",(100,100)) >>> im.save("test.jpg") >>> Traceback (most recent call last): File "PIL/JpegImagePlugin.py", line 602, in _save KeyError: 'RGBA' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "<stdin>", line 1, in <module> File "PIL/Image.py", line 1893, in save File "PIL/JpegImagePlugin.py", line 604, in _save OSError: cannot write mode RGBA as JPEG >>> im = im.convert("RGB") >>> im.save("test.jpg") >>>
In most cases the discarding the alpha channel will give you undesirable result, because transparent pixels also have some unpredictable colors. It is much better to fill transparent pixels with certain color:
fill_color = '' # your background image = Image.open(file_path) if image.mode in ('RGBA', 'LA'): background = Image.new(image.mode[:-1], image.size, fill_color) background.paste(image, image.split()[-1]) image = background im.save(hidpi_path, file_type, quality=95)