Speed up of about 33%, maybe? #210
Added a real fix for #209, seeing about a 22% speed up there.
This commit is contained in:
parent
8e6dc486da
commit
eb1df90fb9
1 changed files with 14 additions and 18 deletions
|
|
@ -1882,21 +1882,14 @@ class PaletteBox(Jp2kBox):
|
||||||
fptr.write(write_buffer)
|
fptr.write(write_buffer)
|
||||||
|
|
||||||
bps = self.bits_per_component
|
bps = self.bits_per_component
|
||||||
if any(b != bps[0] for b in bps):
|
if all(b == bps[0] for b in bps):
|
||||||
# All components are the same. Writing is straightforward.
|
# All components are the same. Writing is straightforward.
|
||||||
if self.bits_per_component[0] <= 8:
|
if self.bits_per_component[0] <= 8:
|
||||||
code = 'B'
|
write_buffer = np.getbuffer(self.palette.astype(np.uint8))
|
||||||
dtype = np.uint8
|
|
||||||
elif self.bits_per_component[0] <= 16:
|
elif self.bits_per_component[0] <= 16:
|
||||||
code = 'H'
|
write_buffer = np.getbuffer(self.palette.astype(np.uint16))
|
||||||
dtype = np.uint16
|
|
||||||
elif self.bits_per_component[0] <= 32:
|
elif self.bits_per_component[0] <= 32:
|
||||||
code = 'I'
|
write_buffer = np.getbuffer(self.palette.astype(np.uint32))
|
||||||
dtype = np.uint32
|
|
||||||
nelts = self.palette.shape[0] * self.palette.shape[1]
|
|
||||||
fmt = '>{0}{1}'.format(nelts, code)
|
|
||||||
write_buffer = struct.pack(fmt,
|
|
||||||
self.palette.astype(dtype).flatten())
|
|
||||||
fptr.write(write_buffer)
|
fptr.write(write_buffer)
|
||||||
else:
|
else:
|
||||||
# Not all the components are the same. More general, but much rarer
|
# Not all the components are the same. More general, but much rarer
|
||||||
|
|
@ -1937,19 +1930,22 @@ class PaletteBox(Jp2kBox):
|
||||||
bps = [((x & 0x7f) + 1) for x in bps_signed]
|
bps = [((x & 0x7f) + 1) for x in bps_signed]
|
||||||
signed = [((x & 0x80) > 1) for x in bps_signed]
|
signed = [((x & 0x80) > 1) for x in bps_signed]
|
||||||
|
|
||||||
if any(b != bps_signed[0] for b in bps_signed):
|
if all(b == bps_signed[0] for b in bps_signed):
|
||||||
# Ok the palette has the same datatype for all columns. We should
|
# Ok the palette has the same datatype for all columns. We should
|
||||||
# be able to efficiently read it.
|
# be able to efficiently read it.
|
||||||
if bps <= 8:
|
if bps[0] <= 8:
|
||||||
|
nbytes_per_row = num_columns
|
||||||
dtype = np.uint8
|
dtype = np.uint8
|
||||||
elif bps <= 16:
|
elif bps[0] <= 16:
|
||||||
|
nbytes_per_row = 2 * num_columns
|
||||||
dtype = np.uint16
|
dtype = np.uint16
|
||||||
elif bps <= 32:
|
elif bps[0] <= 32:
|
||||||
|
nbytes_per_row = 3 * num_columns
|
||||||
dtype = np.uint32
|
dtype = np.uint32
|
||||||
|
|
||||||
read_buffer = fptr.read(num_entries * np.sum(bps) / 8)
|
read_buffer = fptr.read(num_entries * nbytes_per_row)
|
||||||
palette = np.frombuffer(read_buffer, dtype)
|
palette = np.frombuffer(read_buffer, dtype=dtype)
|
||||||
palette.reshape((num_entries, num_columns))
|
palette = np.reshape(palette, (num_entries, num_columns))
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# General case where the columns may not be the same width.
|
# General case where the columns may not be the same width.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue