Merge pull request #2010 from uploadcare/jpeg-raise-on-alpha

Show warning when trying to save RGBA image as JPEG
This commit is contained in:
wiredfool 2016-08-25 11:41:49 +01:00 committed by GitHub
commit e980ca7896
3 changed files with 29 additions and 2 deletions

View File

@ -583,6 +583,14 @@ def _save(im, fp, filename):
except KeyError:
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
dpi = info.get("dpi", (0, 0))

View File

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

View File

@ -450,6 +450,25 @@ class TestFileJpeg(PillowTestCase):
# Assert
self.assertEqual(im.format, "JPEG")
def test_save_correct_modes(self):
out = BytesIO()
for mode in ['1', 'L', 'RGB', 'RGBX', 'CMYK', 'YCbCr']:
img = Image.new(mode, (20, 20))
img.save(out, "JPEG")
def test_save_wrong_modes(self):
out = BytesIO()
for mode in ['LA', 'La', 'RGBa', 'P']:
img = Image.new(mode, (20, 20))
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__':
unittest.main()