return implicit RGBA to JPEG save, raise warning

This commit is contained in:
homm 2016-08-09 03:11:35 +03:00
parent c1da18e0ad
commit 193c756139
3 changed files with 19 additions and 4 deletions

View File

@ -534,6 +534,7 @@ RAWMODE = {
"1": "L", "1": "L",
"L": "L", "L": "L",
"RGB": "RGB", "RGB": "RGB",
"RGBA": "RGB",
"RGBX": "RGB", "RGBX": "RGB",
"CMYK": "CMYK;I", # assume adobe conventions "CMYK": "CMYK;I", # assume adobe conventions
"YCbCr": "YCbCr", "YCbCr": "YCbCr",
@ -582,6 +583,14 @@ def _save(im, fp, filename):
except KeyError: except KeyError:
raise IOError("cannot write mode %s as JPEG" % im.mode) raise IOError("cannot write mode %s as JPEG" % im.mode)
if im.mode == 'RGBA':
warnings.warn(
'You are saving RGBA image as JPEG. The alpha channel will be '
'discarded. This conversion is deprecated and will be disabled '
'in Pillow 3.7. Please, convert the image to RGB explicitly.',
DeprecationWarning
)
info = im.encoderinfo info = im.encoderinfo
dpi = info.get("dpi", (0, 0)) dpi = info.get("dpi", (0, 0))

View File

@ -99,7 +99,7 @@ class PillowTestCase(unittest.TestCase):
" average pixel value difference %.4f > epsilon %.4f" % ( " average pixel value difference %.4f > epsilon %.4f" % (
ave_diff, epsilon)) ave_diff, epsilon))
def assert_warning(self, warn_class, func): def assert_warning(self, warn_class, func, *args, **kwargs):
import warnings import warnings
result = None result = None
@ -108,7 +108,7 @@ class PillowTestCase(unittest.TestCase):
warnings.simplefilter("always") warnings.simplefilter("always")
# Hopefully trigger a warning. # Hopefully trigger a warning.
result = func() result = func(*args, **kwargs)
# Verify some things. # Verify some things.
self.assertGreaterEqual(len(w), 1) self.assertGreaterEqual(len(w), 1)

View File

@ -457,12 +457,18 @@ class TestFileJpeg(PillowTestCase):
img.save(out, "JPEG") img.save(out, "JPEG")
def test_save_wrong_modes(self): def test_save_wrong_modes(self):
# ref https://github.com/python-pillow/Pillow/issues/2005
out = BytesIO() out = BytesIO()
for mode in ['LA', 'La', 'RGBA', 'RGBa', 'P']: for mode in ['LA', 'La', 'RGBa', 'P']:
img = Image.new(mode, (20, 20)) img = Image.new(mode, (20, 20))
self.assertRaises(IOError, img.save, out, "JPEG") self.assertRaises(IOError, img.save, out, "JPEG")
def test_save_modes_with_warnings(self):
# ref https://github.com/python-pillow/Pillow/issues/2005
out = BytesIO()
for mode in ['RGBA']:
img = Image.new(mode, (20, 20))
self.assert_warning(DeprecationWarning, img.save, out, "JPEG")
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()