Merge pull request #7597 from hugovk/comprehensions

Use list comprehensions to create transformed lists
This commit is contained in:
Andrew Murray 2023-12-05 18:56:49 +11:00 committed by GitHub
commit 0a66b98558
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 46 additions and 103 deletions

View File

@ -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:]
) )

View File

@ -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 = {}

View File

@ -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):

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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")

View File

@ -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

View File

@ -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

View File

@ -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.

View 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]

View File

@ -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)