mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-02-04 13:40:54 +03:00
commit
0378fede70
|
@ -25,9 +25,8 @@ class TestImagingLeaks(PillowTestCase):
|
||||||
if i < min_iterations:
|
if i < min_iterations:
|
||||||
mem_limit = mem + 1
|
mem_limit = mem + 1
|
||||||
continue
|
continue
|
||||||
self.assertLessEqual(mem, mem_limit,
|
msg = 'memory usage limit exceeded after %d iterations' % (i + 1)
|
||||||
msg='memory usage limit exceeded after %d iterations'
|
self.assertLessEqual(mem, mem_limit, msg)
|
||||||
% (i + 1))
|
|
||||||
|
|
||||||
def test_leak_putdata(self):
|
def test_leak_putdata(self):
|
||||||
im = Image.new('RGB', (25, 25))
|
im = Image.new('RGB', (25, 25))
|
||||||
|
|
|
@ -272,8 +272,8 @@ class PillowLeakTestCase(PillowTestCase):
|
||||||
for cycle in range(self.iterations):
|
for cycle in range(self.iterations):
|
||||||
core()
|
core()
|
||||||
mem = (self._get_mem_usage() - start_mem)
|
mem = (self._get_mem_usage() - start_mem)
|
||||||
self.assertLess(mem, self.mem_limit,
|
msg = 'memory usage limit exceeded in iteration %d' % cycle
|
||||||
msg='memory usage limit exceeded in iteration %d' % cycle)
|
self.assertLess(mem, self.mem_limit, msg)
|
||||||
|
|
||||||
|
|
||||||
# helpers
|
# helpers
|
||||||
|
|
|
@ -42,7 +42,8 @@ class TestBmpReference(PillowTestCase):
|
||||||
im = Image.open(f)
|
im = Image.open(f)
|
||||||
im.load()
|
im.load()
|
||||||
if os.path.basename(f) not in supported:
|
if os.path.basename(f) not in supported:
|
||||||
print("Please add %s to the partially supported bmp specs." % f)
|
print("Please add %s to the partially supported"
|
||||||
|
" bmp specs." % f)
|
||||||
except Exception: # as msg:
|
except Exception: # as msg:
|
||||||
if os.path.basename(f) in supported:
|
if os.path.basename(f) in supported:
|
||||||
raise
|
raise
|
||||||
|
|
|
@ -2,8 +2,6 @@ from helper import unittest, PillowTestCase
|
||||||
|
|
||||||
from PIL import GdImageFile
|
from PIL import GdImageFile
|
||||||
|
|
||||||
import io
|
|
||||||
|
|
||||||
TEST_GD_FILE = "Tests/images/hopper.gd"
|
TEST_GD_FILE = "Tests/images/hopper.gd"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import logging
|
import logging
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
import struct
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from helper import unittest, PillowTestCase, hopper
|
from helper import unittest, PillowTestCase, hopper
|
||||||
|
@ -59,7 +58,8 @@ class TestFileTiff(PillowTestCase):
|
||||||
|
|
||||||
self.assertEqual(im.mode, "RGBA")
|
self.assertEqual(im.mode, "RGBA")
|
||||||
self.assertEqual(im.size, (52, 53))
|
self.assertEqual(im.size, (52, 53))
|
||||||
self.assertEqual(im.tile, [('raw', (0, 0, 52, 53), 160, ('RGBA', 0, 1))])
|
self.assertEqual(im.tile,
|
||||||
|
[('raw', (0, 0, 52, 53), 160, ('RGBA', 0, 1))])
|
||||||
im.load()
|
im.load()
|
||||||
|
|
||||||
def test_set_legacy_api(self):
|
def test_set_legacy_api(self):
|
||||||
|
|
|
@ -56,7 +56,8 @@ class TestFileTiffMetadata(PillowTestCase):
|
||||||
loaded = Image.open(f)
|
loaded = Image.open(f)
|
||||||
|
|
||||||
self.assertEqual(loaded.tag[ImageJMetaDataByteCounts], (len(bindata),))
|
self.assertEqual(loaded.tag[ImageJMetaDataByteCounts], (len(bindata),))
|
||||||
self.assertEqual(loaded.tag_v2[ImageJMetaDataByteCounts], (len(bindata),))
|
self.assertEqual(loaded.tag_v2[ImageJMetaDataByteCounts],
|
||||||
|
(len(bindata),))
|
||||||
|
|
||||||
self.assertEqual(loaded.tag[ImageJMetaData], bindata)
|
self.assertEqual(loaded.tag[ImageJMetaData], bindata)
|
||||||
self.assertEqual(loaded.tag_v2[ImageJMetaData], bindata)
|
self.assertEqual(loaded.tag_v2[ImageJMetaData], bindata)
|
||||||
|
@ -75,8 +76,10 @@ class TestFileTiffMetadata(PillowTestCase):
|
||||||
img.save(f, tiffinfo=info)
|
img.save(f, tiffinfo=info)
|
||||||
loaded = Image.open(f)
|
loaded = Image.open(f)
|
||||||
|
|
||||||
self.assertEqual(loaded.tag[ImageJMetaDataByteCounts], (8, len(bindata) - 8))
|
self.assertEqual(loaded.tag[ImageJMetaDataByteCounts],
|
||||||
self.assertEqual(loaded.tag_v2[ImageJMetaDataByteCounts], (8, len(bindata) - 8))
|
(8, len(bindata) - 8))
|
||||||
|
self.assertEqual(loaded.tag_v2[ImageJMetaDataByteCounts],
|
||||||
|
(8, len(bindata) - 8))
|
||||||
|
|
||||||
def test_read_metadata(self):
|
def test_read_metadata(self):
|
||||||
img = Image.open('Tests/images/hopper_g4.tif')
|
img = Image.open('Tests/images/hopper_g4.tif')
|
||||||
|
@ -133,8 +136,8 @@ class TestFileTiffMetadata(PillowTestCase):
|
||||||
if isinstance(v, IFDRational):
|
if isinstance(v, IFDRational):
|
||||||
original[k] = IFDRational(*_limit_rational(v, 2**31))
|
original[k] = IFDRational(*_limit_rational(v, 2**31))
|
||||||
if isinstance(v, tuple) and isinstance(v[0], IFDRational):
|
if isinstance(v, tuple) and isinstance(v[0], IFDRational):
|
||||||
original[k] = tuple([IFDRational(
|
original[k] = tuple([IFDRational(*_limit_rational(elt, 2**31))
|
||||||
*_limit_rational(elt, 2**31)) for elt in v])
|
for elt in v])
|
||||||
|
|
||||||
ignored = ['StripByteCounts', 'RowsPerStrip',
|
ignored = ['StripByteCounts', 'RowsPerStrip',
|
||||||
'PageNumber', 'StripOffsets']
|
'PageNumber', 'StripOffsets']
|
||||||
|
@ -184,7 +187,8 @@ class TestFileTiffMetadata(PillowTestCase):
|
||||||
|
|
||||||
def test_iccprofile_binary(self):
|
def test_iccprofile_binary(self):
|
||||||
# https://github.com/python-pillow/Pillow/issues/1526
|
# https://github.com/python-pillow/Pillow/issues/1526
|
||||||
# We should be able to load this, but probably won't be able to save it.
|
# We should be able to load this,
|
||||||
|
# but probably won't be able to save it.
|
||||||
|
|
||||||
im = Image.open('Tests/images/hopper.iccprofile_binary.tif')
|
im = Image.open('Tests/images/hopper.iccprofile_binary.tif')
|
||||||
self.assertEqual(im.tag_v2.tagtype[34675], 1)
|
self.assertEqual(im.tag_v2.tagtype[34675], 1)
|
||||||
|
|
|
@ -38,7 +38,8 @@ class TestFileWebp(PillowTestCase):
|
||||||
|
|
||||||
# generated with:
|
# generated with:
|
||||||
# dwebp -ppm ../../Tests/images/hopper.webp -o hopper_webp_bits.ppm
|
# dwebp -ppm ../../Tests/images/hopper.webp -o hopper_webp_bits.ppm
|
||||||
self.assert_image_similar_tofile(image, 'Tests/images/hopper_webp_bits.ppm', 1.0)
|
self.assert_image_similar_tofile(
|
||||||
|
image, 'Tests/images/hopper_webp_bits.ppm', 1.0)
|
||||||
|
|
||||||
def test_write_rgb(self):
|
def test_write_rgb(self):
|
||||||
"""
|
"""
|
||||||
|
@ -58,7 +59,8 @@ class TestFileWebp(PillowTestCase):
|
||||||
image.getdata()
|
image.getdata()
|
||||||
|
|
||||||
# generated with: dwebp -ppm temp.webp -o hopper_webp_write.ppm
|
# generated with: dwebp -ppm temp.webp -o hopper_webp_write.ppm
|
||||||
self.assert_image_similar_tofile(image, 'Tests/images/hopper_webp_write.ppm', 12.0)
|
self.assert_image_similar_tofile(
|
||||||
|
image, 'Tests/images/hopper_webp_write.ppm', 12.0)
|
||||||
|
|
||||||
# This test asserts that the images are similar. If the average pixel
|
# This test asserts that the images are similar. If the average pixel
|
||||||
# difference between the two images is less than the epsilon value,
|
# difference between the two images is less than the epsilon value,
|
||||||
|
|
|
@ -204,7 +204,8 @@ class TestImageConvert(PillowTestCase):
|
||||||
target = Image.open('Tests/images/hopper-XYZ.png')
|
target = Image.open('Tests/images/hopper-XYZ.png')
|
||||||
if converted_im.mode == 'RGB':
|
if converted_im.mode == 'RGB':
|
||||||
self.assert_image_similar(converted_im, target, 3)
|
self.assert_image_similar(converted_im, target, 3)
|
||||||
self.assertEqual(converted_im.info['transparency'], (105, 54, 4))
|
self.assertEqual(converted_im.info['transparency'],
|
||||||
|
(105, 54, 4))
|
||||||
else:
|
else:
|
||||||
self.assert_image_similar(converted_im,
|
self.assert_image_similar(converted_im,
|
||||||
target.getchannel(0), 1)
|
target.getchannel(0), 1)
|
||||||
|
|
|
@ -124,5 +124,6 @@ class TestImageRotate(PillowTestCase):
|
||||||
corner = im.getpixel((0, 0))
|
corner = im.getpixel((0, 0))
|
||||||
self.assertEqual(corner, (255, 0, 0, 255))
|
self.assertEqual(corner, (255, 0, 0, 255))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
|
@ -446,20 +446,20 @@ class TestImageCms(PillowTestCase):
|
||||||
self.assert_image_equal(source_image_aux, result_image_aux)
|
self.assert_image_equal(source_image_aux, result_image_aux)
|
||||||
|
|
||||||
def test_preserve_auxiliary_channels_rgba(self):
|
def test_preserve_auxiliary_channels_rgba(self):
|
||||||
self.assert_aux_channel_preserved(mode='RGBA',
|
self.assert_aux_channel_preserved(
|
||||||
transform_in_place=False, preserved_channel='A')
|
mode='RGBA', transform_in_place=False, preserved_channel='A')
|
||||||
|
|
||||||
def test_preserve_auxiliary_channels_rgba_in_place(self):
|
def test_preserve_auxiliary_channels_rgba_in_place(self):
|
||||||
self.assert_aux_channel_preserved(mode='RGBA',
|
self.assert_aux_channel_preserved(
|
||||||
transform_in_place=True, preserved_channel='A')
|
mode='RGBA', transform_in_place=True, preserved_channel='A')
|
||||||
|
|
||||||
def test_preserve_auxiliary_channels_rgbx(self):
|
def test_preserve_auxiliary_channels_rgbx(self):
|
||||||
self.assert_aux_channel_preserved(mode='RGBX',
|
self.assert_aux_channel_preserved(
|
||||||
transform_in_place=False, preserved_channel='X')
|
mode='RGBX', transform_in_place=False, preserved_channel='X')
|
||||||
|
|
||||||
def test_preserve_auxiliary_channels_rgbx_in_place(self):
|
def test_preserve_auxiliary_channels_rgbx_in_place(self):
|
||||||
self.assert_aux_channel_preserved(mode='RGBX',
|
self.assert_aux_channel_preserved(
|
||||||
transform_in_place=True, preserved_channel='X')
|
mode='RGBX', transform_in_place=True, preserved_channel='X')
|
||||||
|
|
||||||
def test_auxiliary_channels_isolated(self):
|
def test_auxiliary_channels_isolated(self):
|
||||||
# test data in aux channels does not affect non-aux channels
|
# test data in aux channels does not affect non-aux channels
|
||||||
|
|
|
@ -93,7 +93,6 @@ class TestImageOps(PillowTestCase):
|
||||||
"Tests/images/imageops_pad_"+label+"_"+str(i)+".jpg")
|
"Tests/images/imageops_pad_"+label+"_"+str(i)+".jpg")
|
||||||
self.assert_image_similar(new_im, target, 6)
|
self.assert_image_similar(new_im, target, 6)
|
||||||
|
|
||||||
|
|
||||||
def test_pil163(self):
|
def test_pil163(self):
|
||||||
# Division by zero in equalize if < 255 pixels in image (@PIL163)
|
# Division by zero in equalize if < 255 pixels in image (@PIL163)
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ class TestImageTk(PillowTestCase):
|
||||||
self.skipTest("Tk not installed")
|
self.skipTest("Tk not installed")
|
||||||
try:
|
try:
|
||||||
# setup tk
|
# setup tk
|
||||||
app = tk.Frame()
|
tk.Frame()
|
||||||
# root = tk.Tk()
|
# root = tk.Tk()
|
||||||
except (tk.TclError) as v:
|
except (tk.TclError) as v:
|
||||||
self.skipTest("TCL Error: %s" % v)
|
self.skipTest("TCL Error: %s" % v)
|
||||||
|
|
|
@ -221,7 +221,8 @@ class TestLibUnpack(PillowTestCase):
|
||||||
data_len = data * len(pixels)
|
data_len = data * len(pixels)
|
||||||
data = bytes(bytearray(range(1, data_len + 1)))
|
data = bytes(bytearray(range(1, data_len + 1)))
|
||||||
|
|
||||||
im = Image.frombytes(mode, (len(pixels), 1), data, "raw", rawmode, 0, 1)
|
im = Image.frombytes(mode, (len(pixels), 1), data,
|
||||||
|
"raw", rawmode, 0, 1)
|
||||||
|
|
||||||
for x, pixel in enumerate(pixels):
|
for x, pixel in enumerate(pixels):
|
||||||
self.assertEqual(pixel, im.getpixel((x, 0)))
|
self.assertEqual(pixel, im.getpixel((x, 0)))
|
||||||
|
@ -265,9 +266,11 @@ class TestLibUnpack(PillowTestCase):
|
||||||
def test_P(self):
|
def test_P(self):
|
||||||
self.assert_unpack("P", "P;1", b'\xe4', 1, 1, 1, 0, 0, 1, 0, 0)
|
self.assert_unpack("P", "P;1", b'\xe4', 1, 1, 1, 0, 0, 1, 0, 0)
|
||||||
self.assert_unpack("P", "P;2", b'\xe4', 3, 2, 1, 0)
|
self.assert_unpack("P", "P;2", b'\xe4', 3, 2, 1, 0)
|
||||||
# self.assert_unpack("P", "P;2L", b'\xe4', 1, 1, 1, 0) # erroneous?
|
# erroneous?
|
||||||
|
# self.assert_unpack("P", "P;2L", b'\xe4', 1, 1, 1, 0)
|
||||||
self.assert_unpack("P", "P;4", b'\x02\xef', 0, 2, 14, 15)
|
self.assert_unpack("P", "P;4", b'\x02\xef', 0, 2, 14, 15)
|
||||||
# self.assert_unpack("P", "P;4L", b'\x02\xef', 2, 10, 10, 0) # erroneous?
|
# erroneous?
|
||||||
|
# self.assert_unpack("P", "P;4L", b'\x02\xef', 2, 10, 10, 0)
|
||||||
self.assert_unpack("P", "P", 1, 1, 2, 3, 4)
|
self.assert_unpack("P", "P", 1, 1, 2, 3, 4)
|
||||||
self.assert_unpack("P", "P;R", 1, 128, 64, 192, 32)
|
self.assert_unpack("P", "P;R", 1, 128, 64, 192, 32)
|
||||||
|
|
||||||
|
@ -373,7 +376,8 @@ class TestLibUnpack(PillowTestCase):
|
||||||
self.assert_unpack(
|
self.assert_unpack(
|
||||||
"RGBA", "YCCA;P",
|
"RGBA", "YCCA;P",
|
||||||
b']bE\x04\xdd\xbej\xed57T\xce\xac\xce:\x11', # random data
|
b']bE\x04\xdd\xbej\xed57T\xce\xac\xce:\x11', # random data
|
||||||
(0, 161, 0, 4), (255, 255, 255, 237), (27, 158, 0, 206), (0, 118, 0, 17))
|
(0, 161, 0, 4), (255, 255, 255, 237),
|
||||||
|
(27, 158, 0, 206), (0, 118, 0, 17))
|
||||||
self.assert_unpack(
|
self.assert_unpack(
|
||||||
"RGBA", "R", 1, (1, 0, 0, 0), (2, 0, 0, 0), (3, 0, 0, 0))
|
"RGBA", "R", 1, (1, 0, 0, 0), (2, 0, 0, 0), (3, 0, 0, 0))
|
||||||
self.assert_unpack(
|
self.assert_unpack(
|
||||||
|
@ -425,7 +429,8 @@ class TestLibUnpack(PillowTestCase):
|
||||||
self.assert_unpack(
|
self.assert_unpack(
|
||||||
"RGBX", "YCC;P",
|
"RGBX", "YCC;P",
|
||||||
b'D]\x9c\x82\x1a\x91\xfaOC\xe7J\x12', # random data
|
b'D]\x9c\x82\x1a\x91\xfaOC\xe7J\x12', # random data
|
||||||
(127, 102, 0, X), (192, 227, 0, X), (213, 255, 170, X), (98, 255, 133, X))
|
(127, 102, 0, X), (192, 227, 0, X),
|
||||||
|
(213, 255, 170, X), (98, 255, 133, X))
|
||||||
self.assert_unpack("RGBX", "R", 1,
|
self.assert_unpack("RGBX", "R", 1,
|
||||||
(1, 0, 0, 0), (2, 0, 0, 0), (3, 0, 0, 0))
|
(1, 0, 0, 0), (2, 0, 0, 0), (3, 0, 0, 0))
|
||||||
self.assert_unpack("RGBX", "G", 1,
|
self.assert_unpack("RGBX", "G", 1,
|
||||||
|
|
|
@ -26,7 +26,9 @@ class TestPdfParser(PillowTestCase):
|
||||||
def test_parsing(self):
|
def test_parsing(self):
|
||||||
self.assertEqual(PdfParser.interpret_name(b"Name#23Hash"),
|
self.assertEqual(PdfParser.interpret_name(b"Name#23Hash"),
|
||||||
b"Name#Hash")
|
b"Name#Hash")
|
||||||
self.assertEqual(PdfParser.interpret_name(b"Name#23Hash", as_text=True), "Name#Hash")
|
self.assertEqual(PdfParser.interpret_name(
|
||||||
|
b"Name#23Hash", as_text=True
|
||||||
|
), "Name#Hash")
|
||||||
self.assertEqual(PdfParser.get_value(b"1 2 R ", 0),
|
self.assertEqual(PdfParser.get_value(b"1 2 R ", 0),
|
||||||
(IndirectReference(1, 2), 5))
|
(IndirectReference(1, 2), 5))
|
||||||
self.assertEqual(PdfParser.get_value(b"true[", 0), (True, 4))
|
self.assertEqual(PdfParser.get_value(b"true[", 0), (True, 4))
|
||||||
|
@ -72,7 +74,9 @@ class TestPdfParser(PillowTestCase):
|
||||||
self.assertIsInstance(a, list)
|
self.assertIsInstance(a, list)
|
||||||
self.assertEqual(len(a), 4)
|
self.assertEqual(len(a), 4)
|
||||||
self.assertEqual(a[0], PdfName("Name"))
|
self.assertEqual(a[0], PdfName("Name"))
|
||||||
s = PdfParser.get_value(b"<</Name (value) /Length 5>>\nstream\nabcde\nendstream<<...", 0)[0]
|
s = PdfParser.get_value(
|
||||||
|
b"<</Name (value) /Length 5>>\nstream\nabcde\nendstream<<...", 0
|
||||||
|
)[0]
|
||||||
self.assertIsInstance(s, PdfStream)
|
self.assertIsInstance(s, PdfStream)
|
||||||
self.assertEqual(s.dictionary.Name, "value")
|
self.assertEqual(s.dictionary.Name, "value")
|
||||||
self.assertEqual(s.decode(), b"abcde")
|
self.assertEqual(s.decode(), b"abcde")
|
||||||
|
|
|
@ -61,7 +61,8 @@ class GdImageFile(ImageFile.ImageFile):
|
||||||
|
|
||||||
self.palette = ImagePalette.raw("XBGR", s[7+trueColorOffset+4:7+trueColorOffset+4+256*4])
|
self.palette = ImagePalette.raw("XBGR", s[7+trueColorOffset+4:7+trueColorOffset+4+256*4])
|
||||||
|
|
||||||
self.tile = [("raw", (0, 0)+self.size, 7+trueColorOffset+4+256*4, ("L", 0, 1))]
|
self.tile = [("raw", (0, 0)+self.size, 7+trueColorOffset+4+256*4,
|
||||||
|
("L", 0, 1))]
|
||||||
|
|
||||||
|
|
||||||
def open(fp, mode="r"):
|
def open(fp, mode="r"):
|
||||||
|
|
|
@ -30,7 +30,6 @@
|
||||||
from . import Image
|
from . import Image
|
||||||
from ._util import isPath
|
from ._util import isPath
|
||||||
import io
|
import io
|
||||||
import os
|
|
||||||
import sys
|
import sys
|
||||||
import struct
|
import struct
|
||||||
|
|
||||||
|
|
|
@ -162,7 +162,8 @@ class FreeTypeFont(object):
|
||||||
size, offset = self.font.getsize(text, direction, features)
|
size, offset = self.font.getsize(text, direction, features)
|
||||||
return (size[0] + offset[0], size[1] + offset[1])
|
return (size[0] + offset[0], size[1] + offset[1])
|
||||||
|
|
||||||
def getsize_multiline(self, text, direction=None, spacing=4, features=None):
|
def getsize_multiline(self, text, direction=None,
|
||||||
|
spacing=4, features=None):
|
||||||
max_width = 0
|
max_width = 0
|
||||||
lines = self._multiline_split(text)
|
lines = self._multiline_split(text)
|
||||||
line_spacing = self.getsize('A')[1] + spacing
|
line_spacing = self.getsize('A')[1] + spacing
|
||||||
|
|
|
@ -28,7 +28,8 @@ qt_versions = [
|
||||||
['side', 'PySide']
|
['side', 'PySide']
|
||||||
]
|
]
|
||||||
# If a version has already been imported, attempt it first
|
# If a version has already been imported, attempt it first
|
||||||
qt_versions.sort(key=lambda qt_version: qt_version[1] in sys.modules, reverse=True)
|
qt_versions.sort(key=lambda qt_version: qt_version[1] in sys.modules,
|
||||||
|
reverse=True)
|
||||||
for qt_version, qt_module in qt_versions:
|
for qt_version, qt_module in qt_versions:
|
||||||
try:
|
try:
|
||||||
if qt_module == 'PyQt5':
|
if qt_module == 'PyQt5':
|
||||||
|
|
Loading…
Reference in New Issue
Block a user