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" )
0 commit comments