I tried png-parser with pal2/pal4/rgb48 images:
... and they all fail. There are mainly 3 problems.
For all images, scanline_width is incorrect, so each scanline read is either too short or too long.
|
# line_width = pixel_count_in_line * bytes_count_by_pixel + the_filter_byte |
|
line_width = self.header.width * self.header.pixel_len |
|
logging.debug('%d bytes per scanline', line_width) |
Guess it should be like:
# line_width_bit = pixel_count_per_line * components_per_pixel * bit_per_component
line_width_bit = self.header.width * self.header.pixel_len * self.header.bit_depth
# line_width = round_up(line_width_bit / 8) + the_filter_byte
line_width = (line_width_bit + 7) // 8 + 1
i.e. include bit_per_component(actually self.header.bit_depth) in calculation.
(I suggest renaming pixel_len to component_count, but it's also a little weird: paletted images can have more than 1 component, so maybe a better name?)
For pal2/pal4 images, it failed to convert index to pixel.
|
if self.palette: |
|
pixels = [self.palette[i] for i in row] |
The correct way is:
if self.palette:
bit_depth = self.header.bit_depth # bit count per sample
pixels = [self.palette[i] for i in BitArray(row, bit_depth)]
For rgb48 images, it failed to scale pixel value to 0~255 range when displaying.
|
for val in BitArray(row, bit_depth): |
|
if bit_depth != 8: |
|
# shrink value between 0 and 255 |
|
val = val * (2**bit_depth - 1) |
|
px.append(val) |
With rgb48, bit_depth is 16, i.e. val in range(0, 65536).
So val should be divided by 256, or be shifted 8 bits to the right:
if bit_depth > 8:
# shrink value between 0 and 255
val = val >> (bit_depth - 8)
I can craft a PR for these issues, but I'm not sure about the wording problem. Anyone has an idea?
I tried
png-parserwithpal2/pal4/rgb48images:... and they all fail. There are mainly 3 problems.
For all images,
scanline_widthis incorrect, so each scanline read is either too short or too long.png-parser/pngparser/imagedata.py
Lines 232 to 234 in 4d75f17
Guess it should be like:
i.e. include
bit_per_component(actuallyself.header.bit_depth) in calculation.(I suggest renaming
pixel_lentocomponent_count, but it's also a little weird: paletted images can have more than 1 component, so maybe a better name?)For
pal2/pal4images, it failed to convert index to pixel.png-parser/pngparser/imagedata.py
Lines 332 to 333 in 4d75f17
The correct way is:
For
rgb48images, it failed to scale pixel value to 0~255 range when displaying.png-parser/pngparser/imagedata.py
Lines 337 to 341 in 4d75f17
With
rgb48,bit_depthis 16, i.e.val in range(0, 65536).So
valshould be divided by 256, or be shifted 8 bits to the right:I can craft a PR for these issues, but I'm not sure about the wording problem. Anyone has an idea?