mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-07-13 17:52:22 +03:00
Merge pull request #7597 from hugovk/comprehensions
Use list comprehensions to create transformed lists
This commit is contained in:
commit
0a66b98558
|
@ -356,9 +356,7 @@ def test_apng_save(tmp_path):
|
||||||
assert im.getpixel((64, 32)) == (0, 255, 0, 255)
|
assert im.getpixel((64, 32)) == (0, 255, 0, 255)
|
||||||
|
|
||||||
with Image.open("Tests/images/apng/single_frame_default.png") as im:
|
with Image.open("Tests/images/apng/single_frame_default.png") as im:
|
||||||
frames = []
|
frames = [frame_im.copy() for frame_im in ImageSequence.Iterator(im)]
|
||||||
for frame_im in ImageSequence.Iterator(im):
|
|
||||||
frames.append(frame_im.copy())
|
|
||||||
frames[0].save(
|
frames[0].save(
|
||||||
test_file, save_all=True, default_image=True, append_images=frames[1:]
|
test_file, save_all=True, default_image=True, append_images=frames[1:]
|
||||||
)
|
)
|
||||||
|
|
|
@ -97,16 +97,15 @@ class FpxImageFile(ImageFile.ImageFile):
|
||||||
|
|
||||||
s = prop[0x2000002 | id]
|
s = prop[0x2000002 | id]
|
||||||
|
|
||||||
colors = []
|
|
||||||
bands = i32(s, 4)
|
bands = i32(s, 4)
|
||||||
if bands > 4:
|
if bands > 4:
|
||||||
msg = "Invalid number of bands"
|
msg = "Invalid number of bands"
|
||||||
raise OSError(msg)
|
raise OSError(msg)
|
||||||
for i in range(bands):
|
|
||||||
# note: for now, we ignore the "uncalibrated" flag
|
|
||||||
colors.append(i32(s, 8 + i * 4) & 0x7FFFFFFF)
|
|
||||||
|
|
||||||
self._mode, self.rawmode = MODES[tuple(colors)]
|
# note: for now, we ignore the "uncalibrated" flag
|
||||||
|
colors = tuple(i32(s, 8 + i * 4) & 0x7FFFFFFF for i in range(bands))
|
||||||
|
|
||||||
|
self._mode, self.rawmode = MODES[colors]
|
||||||
|
|
||||||
# load JPEG tables, if any
|
# load JPEG tables, if any
|
||||||
self.jpeg = {}
|
self.jpeg = {}
|
||||||
|
|
|
@ -1288,9 +1288,9 @@ class Image:
|
||||||
if self.im.bands == 1 or multiband:
|
if self.im.bands == 1 or multiband:
|
||||||
return self._new(filter.filter(self.im))
|
return self._new(filter.filter(self.im))
|
||||||
|
|
||||||
ims = []
|
ims = [
|
||||||
for c in range(self.im.bands):
|
self._new(filter.filter(self.im.getband(c))) for c in range(self.im.bands)
|
||||||
ims.append(self._new(filter.filter(self.im.getband(c))))
|
]
|
||||||
return merge(self.mode, ims)
|
return merge(self.mode, ims)
|
||||||
|
|
||||||
def getbands(self):
|
def getbands(self):
|
||||||
|
@ -1339,10 +1339,7 @@ class Image:
|
||||||
self.load()
|
self.load()
|
||||||
if self.mode in ("1", "L", "P"):
|
if self.mode in ("1", "L", "P"):
|
||||||
h = self.im.histogram()
|
h = self.im.histogram()
|
||||||
out = []
|
out = [(h[i], i) for i in range(256) if h[i]]
|
||||||
for i in range(256):
|
|
||||||
if h[i]:
|
|
||||||
out.append((h[i], i))
|
|
||||||
if len(out) > maxcolors:
|
if len(out) > maxcolors:
|
||||||
return None
|
return None
|
||||||
return out
|
return out
|
||||||
|
@ -1383,10 +1380,7 @@ class Image:
|
||||||
|
|
||||||
self.load()
|
self.load()
|
||||||
if self.im.bands > 1:
|
if self.im.bands > 1:
|
||||||
extrema = []
|
return tuple(self.im.getband(i).getextrema() for i in range(self.im.bands))
|
||||||
for i in range(self.im.bands):
|
|
||||||
extrema.append(self.im.getband(i).getextrema())
|
|
||||||
return tuple(extrema)
|
|
||||||
return self.im.getextrema()
|
return self.im.getextrema()
|
||||||
|
|
||||||
def _getxmp(self, xmp_tags):
|
def _getxmp(self, xmp_tags):
|
||||||
|
|
|
@ -787,11 +787,8 @@ def getProfileInfo(profile):
|
||||||
# info was description \r\n\r\n copyright \r\n\r\n K007 tag \r\n\r\n whitepoint
|
# info was description \r\n\r\n copyright \r\n\r\n K007 tag \r\n\r\n whitepoint
|
||||||
description = profile.profile.profile_description
|
description = profile.profile.profile_description
|
||||||
cpright = profile.profile.copyright
|
cpright = profile.profile.copyright
|
||||||
arr = []
|
elements = [element for element in (description, cpright) if element]
|
||||||
for elt in (description, cpright):
|
return "\r\n\r\n".join(elements) + "\r\n\r\n"
|
||||||
if elt:
|
|
||||||
arr.append(elt)
|
|
||||||
return "\r\n\r\n".join(arr) + "\r\n\r\n"
|
|
||||||
|
|
||||||
except (AttributeError, OSError, TypeError, ValueError) as v:
|
except (AttributeError, OSError, TypeError, ValueError) as v:
|
||||||
raise PyCMSError(v) from v
|
raise PyCMSError(v) from v
|
||||||
|
|
|
@ -557,9 +557,7 @@ def invert(image):
|
||||||
:param image: The image to invert.
|
:param image: The image to invert.
|
||||||
:return: An image.
|
:return: An image.
|
||||||
"""
|
"""
|
||||||
lut = []
|
lut = list(range(255, -1, -1))
|
||||||
for i in range(256):
|
|
||||||
lut.append(255 - i)
|
|
||||||
return image.point(lut) if image.mode == "1" else _lut(image, lut)
|
return image.point(lut) if image.mode == "1" else _lut(image, lut)
|
||||||
|
|
||||||
|
|
||||||
|
@ -581,10 +579,8 @@ def posterize(image, bits):
|
||||||
:param bits: The number of bits to keep for each channel (1-8).
|
:param bits: The number of bits to keep for each channel (1-8).
|
||||||
:return: An image.
|
:return: An image.
|
||||||
"""
|
"""
|
||||||
lut = []
|
|
||||||
mask = ~(2 ** (8 - bits) - 1)
|
mask = ~(2 ** (8 - bits) - 1)
|
||||||
for i in range(256):
|
lut = [i & mask for i in range(256)]
|
||||||
lut.append(i & mask)
|
|
||||||
return _lut(image, lut)
|
return _lut(image, lut)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -200,21 +200,15 @@ def raw(rawmode, data):
|
||||||
|
|
||||||
|
|
||||||
def make_linear_lut(black, white):
|
def make_linear_lut(black, white):
|
||||||
lut = []
|
|
||||||
if black == 0:
|
if black == 0:
|
||||||
for i in range(256):
|
return [white * i // 255 for i in range(256)]
|
||||||
lut.append(white * i // 255)
|
|
||||||
else:
|
|
||||||
msg = "unavailable when black is non-zero"
|
msg = "unavailable when black is non-zero"
|
||||||
raise NotImplementedError(msg) # FIXME
|
raise NotImplementedError(msg) # FIXME
|
||||||
return lut
|
|
||||||
|
|
||||||
|
|
||||||
def make_gamma_lut(exp):
|
def make_gamma_lut(exp):
|
||||||
lut = []
|
return [int(((i / 255.0) ** exp) * 255.0 + 0.5) for i in range(256)]
|
||||||
for i in range(256):
|
|
||||||
lut.append(int(((i / 255.0) ** exp) * 255.0 + 0.5))
|
|
||||||
return lut
|
|
||||||
|
|
||||||
|
|
||||||
def negative(mode="RGB"):
|
def negative(mode="RGB"):
|
||||||
|
@ -226,9 +220,7 @@ def negative(mode="RGB"):
|
||||||
def random(mode="RGB"):
|
def random(mode="RGB"):
|
||||||
from random import randint
|
from random import randint
|
||||||
|
|
||||||
palette = []
|
palette = [randint(0, 255) for _ in range(256 * len(mode))]
|
||||||
for i in range(256 * len(mode)):
|
|
||||||
palette.append(randint(0, 255))
|
|
||||||
return ImagePalette(mode, palette)
|
return ImagePalette(mode, palette)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -103,12 +103,10 @@ def align8to32(bytes, width, mode):
|
||||||
if not extra_padding:
|
if not extra_padding:
|
||||||
return bytes
|
return bytes
|
||||||
|
|
||||||
new_data = []
|
new_data = [
|
||||||
for i in range(len(bytes) // bytes_per_line):
|
bytes[i * bytes_per_line : (i + 1) * bytes_per_line] + b"\x00" * extra_padding
|
||||||
new_data.append(
|
for i in range(len(bytes) // bytes_per_line)
|
||||||
bytes[i * bytes_per_line : (i + 1) * bytes_per_line]
|
]
|
||||||
+ b"\x00" * extra_padding
|
|
||||||
)
|
|
||||||
|
|
||||||
return b"".join(new_data)
|
return b"".join(new_data)
|
||||||
|
|
||||||
|
@ -131,15 +129,11 @@ def _toqclass_helper(im):
|
||||||
format = qt_format.Format_Mono
|
format = qt_format.Format_Mono
|
||||||
elif im.mode == "L":
|
elif im.mode == "L":
|
||||||
format = qt_format.Format_Indexed8
|
format = qt_format.Format_Indexed8
|
||||||
colortable = []
|
colortable = [rgb(i, i, i) for i in range(256)]
|
||||||
for i in range(256):
|
|
||||||
colortable.append(rgb(i, i, i))
|
|
||||||
elif im.mode == "P":
|
elif im.mode == "P":
|
||||||
format = qt_format.Format_Indexed8
|
format = qt_format.Format_Indexed8
|
||||||
colortable = []
|
|
||||||
palette = im.getpalette()
|
palette = im.getpalette()
|
||||||
for i in range(0, len(palette), 3):
|
colortable = [rgb(*palette[i : i + 3]) for i in range(0, len(palette), 3)]
|
||||||
colortable.append(rgb(*palette[i : i + 3]))
|
|
||||||
elif im.mode == "RGB":
|
elif im.mode == "RGB":
|
||||||
# Populate the 4th channel with 255
|
# Populate the 4th channel with 255
|
||||||
im = im.convert("RGBA")
|
im = im.convert("RGBA")
|
||||||
|
|
|
@ -59,14 +59,10 @@ class Stat:
|
||||||
x = max(x, i)
|
x = max(x, i)
|
||||||
return n, x # returns (255, 0) if there's no data in the histogram
|
return n, x # returns (255, 0) if there's no data in the histogram
|
||||||
|
|
||||||
v = []
|
return [minmax(self.h[i:]) for i in range(0, len(self.h), 256)]
|
||||||
for i in range(0, len(self.h), 256):
|
|
||||||
v.append(minmax(self.h[i:]))
|
|
||||||
return v
|
|
||||||
|
|
||||||
def _getcount(self):
|
def _getcount(self):
|
||||||
"""Get total number of pixels in each layer"""
|
"""Get total number of pixels in each layer"""
|
||||||
|
|
||||||
return [sum(self.h[i : i + 256]) for i in range(0, len(self.h), 256)]
|
return [sum(self.h[i : i + 256]) for i in range(0, len(self.h), 256)]
|
||||||
|
|
||||||
def _getsum(self):
|
def _getsum(self):
|
||||||
|
@ -93,11 +89,7 @@ class Stat:
|
||||||
|
|
||||||
def _getmean(self):
|
def _getmean(self):
|
||||||
"""Get average pixel level for each layer"""
|
"""Get average pixel level for each layer"""
|
||||||
|
return [self.sum[i] / self.count[i] for i in self.bands]
|
||||||
v = []
|
|
||||||
for i in self.bands:
|
|
||||||
v.append(self.sum[i] / self.count[i])
|
|
||||||
return v
|
|
||||||
|
|
||||||
def _getmedian(self):
|
def _getmedian(self):
|
||||||
"""Get median pixel level for each layer"""
|
"""Get median pixel level for each layer"""
|
||||||
|
@ -116,28 +108,18 @@ class Stat:
|
||||||
|
|
||||||
def _getrms(self):
|
def _getrms(self):
|
||||||
"""Get RMS for each layer"""
|
"""Get RMS for each layer"""
|
||||||
|
return [math.sqrt(self.sum2[i] / self.count[i]) for i in self.bands]
|
||||||
v = []
|
|
||||||
for i in self.bands:
|
|
||||||
v.append(math.sqrt(self.sum2[i] / self.count[i]))
|
|
||||||
return v
|
|
||||||
|
|
||||||
def _getvar(self):
|
def _getvar(self):
|
||||||
"""Get variance for each layer"""
|
"""Get variance for each layer"""
|
||||||
|
return [
|
||||||
v = []
|
(self.sum2[i] - (self.sum[i] ** 2.0) / self.count[i]) / self.count[i]
|
||||||
for i in self.bands:
|
for i in self.bands
|
||||||
n = self.count[i]
|
]
|
||||||
v.append((self.sum2[i] - (self.sum[i] ** 2.0) / n) / n)
|
|
||||||
return v
|
|
||||||
|
|
||||||
def _getstddev(self):
|
def _getstddev(self):
|
||||||
"""Get standard deviation for each layer"""
|
"""Get standard deviation for each layer"""
|
||||||
|
return [math.sqrt(self.var[i]) for i in self.bands]
|
||||||
v = []
|
|
||||||
for i in self.bands:
|
|
||||||
v.append(math.sqrt(self.var[i]))
|
|
||||||
return v
|
|
||||||
|
|
||||||
|
|
||||||
Global = Stat # compatibility
|
Global = Stat # compatibility
|
||||||
|
|
|
@ -233,9 +233,7 @@ def SOF(self, marker):
|
||||||
# fixup icc profile
|
# fixup icc profile
|
||||||
self.icclist.sort() # sort by sequence number
|
self.icclist.sort() # sort by sequence number
|
||||||
if self.icclist[0][13] == len(self.icclist):
|
if self.icclist[0][13] == len(self.icclist):
|
||||||
profile = []
|
profile = [p[14:] for p in self.icclist]
|
||||||
for p in self.icclist:
|
|
||||||
profile.append(p[14:])
|
|
||||||
icc_profile = b"".join(profile)
|
icc_profile = b"".join(profile)
|
||||||
else:
|
else:
|
||||||
icc_profile = None # wrong number of fragments
|
icc_profile = None # wrong number of fragments
|
||||||
|
|
|
@ -51,10 +51,11 @@ class MicImageFile(TiffImagePlugin.TiffImageFile):
|
||||||
# find ACI subfiles with Image members (maybe not the
|
# find ACI subfiles with Image members (maybe not the
|
||||||
# best way to identify MIC files, but what the... ;-)
|
# best way to identify MIC files, but what the... ;-)
|
||||||
|
|
||||||
self.images = []
|
self.images = [
|
||||||
for path in self.ole.listdir():
|
path
|
||||||
if path[1:] and path[0][-4:] == ".ACI" and path[1] == "Image":
|
for path in self.ole.listdir()
|
||||||
self.images.append(path)
|
if path[1:] and path[0][-4:] == ".ACI" and path[1] == "Image"
|
||||||
|
]
|
||||||
|
|
||||||
# if we didn't find any images, this is probably not
|
# if we didn't find any images, this is probably not
|
||||||
# an MIC file.
|
# an MIC file.
|
||||||
|
|
|
@ -129,9 +129,8 @@ class PcfFontFile(FontFile.FontFile):
|
||||||
nprops = i32(fp.read(4))
|
nprops = i32(fp.read(4))
|
||||||
|
|
||||||
# read property description
|
# read property description
|
||||||
p = []
|
p = [(i32(fp.read(4)), i8(fp.read(1)), i32(fp.read(4))) for _ in range(nprops)]
|
||||||
for i in range(nprops):
|
|
||||||
p.append((i32(fp.read(4)), i8(fp.read(1)), i32(fp.read(4))))
|
|
||||||
if nprops & 3:
|
if nprops & 3:
|
||||||
fp.seek(4 - (nprops & 3), io.SEEK_CUR) # pad
|
fp.seek(4 - (nprops & 3), io.SEEK_CUR) # pad
|
||||||
|
|
||||||
|
@ -186,8 +185,6 @@ class PcfFontFile(FontFile.FontFile):
|
||||||
#
|
#
|
||||||
# bitmap data
|
# bitmap data
|
||||||
|
|
||||||
bitmaps = []
|
|
||||||
|
|
||||||
fp, format, i16, i32 = self._getformat(PCF_BITMAPS)
|
fp, format, i16, i32 = self._getformat(PCF_BITMAPS)
|
||||||
|
|
||||||
nbitmaps = i32(fp.read(4))
|
nbitmaps = i32(fp.read(4))
|
||||||
|
@ -196,13 +193,9 @@ class PcfFontFile(FontFile.FontFile):
|
||||||
msg = "Wrong number of bitmaps"
|
msg = "Wrong number of bitmaps"
|
||||||
raise OSError(msg)
|
raise OSError(msg)
|
||||||
|
|
||||||
offsets = []
|
offsets = [i32(fp.read(4)) for _ in range(nbitmaps)]
|
||||||
for i in range(nbitmaps):
|
|
||||||
offsets.append(i32(fp.read(4)))
|
|
||||||
|
|
||||||
bitmap_sizes = []
|
bitmap_sizes = [i32(fp.read(4)) for _ in range(4)]
|
||||||
for i in range(4):
|
|
||||||
bitmap_sizes.append(i32(fp.read(4)))
|
|
||||||
|
|
||||||
# byteorder = format & 4 # non-zero => MSB
|
# byteorder = format & 4 # non-zero => MSB
|
||||||
bitorder = format & 8 # non-zero => MSB
|
bitorder = format & 8 # non-zero => MSB
|
||||||
|
@ -218,6 +211,7 @@ class PcfFontFile(FontFile.FontFile):
|
||||||
if bitorder:
|
if bitorder:
|
||||||
mode = "1"
|
mode = "1"
|
||||||
|
|
||||||
|
bitmaps = []
|
||||||
for i in range(nbitmaps):
|
for i in range(nbitmaps):
|
||||||
xsize, ysize = metrics[i][:2]
|
xsize, ysize = metrics[i][:2]
|
||||||
b, e = offsets[i : i + 2]
|
b, e = offsets[i : i + 2]
|
||||||
|
|
|
@ -238,9 +238,7 @@ def makeSpiderHeader(im):
|
||||||
if nvalues < 23:
|
if nvalues < 23:
|
||||||
return []
|
return []
|
||||||
|
|
||||||
hdr = []
|
hdr = [0.0] * nvalues
|
||||||
for i in range(nvalues):
|
|
||||||
hdr.append(0.0)
|
|
||||||
|
|
||||||
# NB these are Fortran indices
|
# NB these are Fortran indices
|
||||||
hdr[1] = 1.0 # nslice (=1 for an image)
|
hdr[1] = 1.0 # nslice (=1 for an image)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user