Skip to content

Commit 44facc3

Browse files
author
Matt Land
committed
Merge branch 'Riddlerat/pgm-work' into feature-tests
2 parents 58fd496 + 8cb69c4 commit 44facc3

7 files changed

Lines changed: 158 additions & 4 deletions

File tree

.vscode/settings.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"python.pythonPath": "/Users/Lyra/Documents/GitHub/Adafruit_CircuitPython_ImageLoad/venv/bin/python3.7"
3+
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
# The MIT License (MIT)
2+
#
3+
# Copyright (c) 2018 Scott Shawcroft for Adafruit Industries LLC
4+
#
5+
# Permission is hereby granted, free of charge, to any person obtaining a copy
6+
# of this software and associated documentation files (the "Software"), to deal
7+
# in the Software without restriction, including without limitation the rights
8+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
# copies of the Software, and to permit persons to whom the Software is
10+
# furnished to do so, subject to the following conditions:
11+
#
12+
# The above copyright notice and this permission notice shall be included in
13+
# all copies or substantial portions of the Software.
14+
#
15+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21+
# THE SOFTWARE.
22+
"""
23+
`adafruit_imageload.pnm`
24+
====================================================
25+
26+
Load pixel values (indices or colors) into a bitmap and colors into a palette.
27+
28+
* Author(s): Matt Land, Brooke Storm, Sam McGahan
29+
30+
"""
31+
#import logging
32+
33+
def load(file, magic_number, header, *, bitmap=None, palette=None):
34+
# TODO: remove unused variables later
35+
width = header[0]
36+
height = header[1]
37+
max_colors = header[2]
38+
bitmap = bitmap(width, height, max_colors)
39+
colors = set()
40+
pixel = bytearray()
41+
42+
43+
if max_colors > 256:
44+
# raise exception
45+
raise NotImplementedError("16 bit grayscale not supported")
46+
47+
if magic_number == b'P2': # To handle ascii PGM files.
48+
# Handle ascii
49+
for y in range(height):
50+
for x in range(width):
51+
# Takes int and converts to an 8 bit
52+
while True:
53+
byte = file.read(1) # type: byte
54+
if not byte.isdigit():
55+
break
56+
pixel += byte
57+
58+
int_pixel = int("".join(["%c" % char for char in pixel]))
59+
bitmap[x, y] = int_pixel
60+
colors.add(int_pixel)
61+
# logging.info(f'{x}, {y}, {byte}, {int_pixel}')
62+
if palette:
63+
palette = palette(len(colors))
64+
for counter, color in enumerate(colors):
65+
color_bytearray = bytearray()
66+
for i in range(3):
67+
color_bytearray += bytes([color])
68+
palette[counter] = color_bytearray
69+
return bitmap, palette
70+
71+
72+
if magic_number == b'P5': # To handle binary PGM files.
73+
for y in range(height):
74+
for x in range(width):
75+
byte = file.read(1)
76+
if byte == b"":
77+
raise ValueError("ran out of file unexpectedly")
78+
int_pixel = int.from_bytes(byte, "little")
79+
bitmap[x, y] = int_pixel
80+
colors.add(int_pixel)
81+
82+
83+
if palette:
84+
palette = palette(len(colors))
85+
for counter, color in enumerate(colors):
86+
color_bytearray = bytearray()
87+
for i in range(3):
88+
color_bytearray += bytes([color])
89+
palette[counter] = color_bytearray
90+
91+
return bitmap, palette
92+
93+
raise NotImplementedError("Was not able to send image")

adafruit_imageload/tests/test_pnm_load.py

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,19 @@ def __str__(self):
5757
for y in range(self.height):
5858
for x in range(self.width):
5959
data = self[x, y]
60-
out += f"{data}"
60+
out += f"{data} "
6161
out += "\n"
6262
return out
6363

6464

65+
class Palette_C_Interface(object):
66+
def __init__(self, num_colors):
67+
self.num_colors = num_colors
68+
self.colors = {}
69+
70+
def __setitem__(self, key, value):
71+
self.colors[key] = value
72+
6573
logging.getLogger().setLevel(logging.INFO)
6674

6775

@@ -137,6 +145,46 @@ def test_decode(self):
137145
self.assertEqual((3, 3), b._decode(encoded))
138146

139147

148+
class TestPgmLoad(TestCase):
149+
def test_load_works_p2_ascii(self):
150+
test_file = os.path.join(
151+
os.path.dirname(__file__),
152+
"..",
153+
"..",
154+
"examples",
155+
"images",
156+
"netpbm_p2_ascii.pgm",
157+
)
158+
with open(test_file, "rb") as f:
159+
bitmap, palette = pnm.load(f, b"P2", bitmap=Bitmap_C_Interface, palette=Palette_C_Interface)
160+
self.assertTrue(isinstance(bitmap, Bitmap_C_Interface), bitmap)
161+
self.assertEqual(255, bitmap.colors)
162+
self.assertEqual(8, bitmap.width)
163+
self.assertEqual(8, bitmap.height)
164+
bitmap.validate()
165+
self.assertEqual(6, palette.num_colors)
166+
167+
def test_load_works_p5_binary(self):
168+
test_file = os.path.join(
169+
os.path.dirname(__file__),
170+
"..",
171+
"..",
172+
"examples",
173+
"images",
174+
"netpbm_p5_binary.pgm",
175+
)
176+
with open(test_file, "rb") as f:
177+
bitmap, palette = pnm.load(f, b"P5", bitmap=Bitmap_C_Interface, palette=Palette_C_Interface)
178+
self.assertTrue(isinstance(bitmap, Bitmap_C_Interface), bitmap)
179+
self.assertEqual(255, bitmap.colors)
180+
self.assertEqual(8, bitmap.width)
181+
self.assertEqual(8, bitmap.height)
182+
bitmap.validate()
183+
self.assertEqual(8, palette.num_colors)
184+
185+
186+
187+
140188
class TestPnmLoad(TestCase):
141189
def test_load_fails_with_no_header_data(self):
142190
f = BytesIO(b"some initial binary data: \x00\x01")
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
P2
2+
8 8 255
3+
0 255 0 203 128 0 128 0
4+
128 0 84 0 0 84 0 255
5+
0 84 0 255 62 0 84 0
6+
128 0 62 0 0 255 0 203
7+
203 0 255 0 0 62 0 128
8+
0 84 0 62 255 0 84 0
9+
255 0 84 0 0 84 0 128
10+
0 128 0 128 203 0 255 0

testImages-Temp/Hiascii.pgm

Lines changed: 3 additions & 0 deletions
Large diffs are not rendered by default.

testImages-Temp/pgmTestascii.pgm

Lines changed: 0 additions & 3 deletions
This file was deleted.

0 commit comments

Comments
 (0)