You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.4 KiB
56 lines
1.4 KiB
#!/usr/bin/env python |
|
# $URL: http://pypng.googlecode.com/svn/trunk/code/pipcolours $ |
|
# $Rev: 96 $ |
|
|
|
# pipcolours - extract all colours present in source image. |
|
|
|
def colours(out, inp): |
|
import itertools |
|
import png |
|
|
|
r = png.Reader(file=inp) |
|
_,_,pixels,info = r.asDirect() |
|
planes = info['planes'] |
|
col = set() |
|
for row in pixels: |
|
# Ewgh, side effects on col |
|
map(col.add, png.group(row, planes)) |
|
col,planes = channel_reduce(col, planes) |
|
col = list(col) |
|
col.sort() |
|
col = list(itertools.chain(*col)) |
|
width = len(col)//planes |
|
greyscale = planes in (1,2) |
|
alpha = planes in (2,4) |
|
bitdepth = info['bitdepth'] |
|
w = png.Writer(width, 1, |
|
bitdepth=bitdepth, greyscale=greyscale, alpha=alpha) |
|
w.write(out, [col]) |
|
|
|
def channel_reduce(col, planes): |
|
"""Attempt to reduce the number of channels in the set of |
|
colours.""" |
|
if planes >= 3: |
|
def isgrey(c): |
|
return c[0] == c[1] == c[2] |
|
if min(map(isgrey, col)) == True: |
|
# Every colour is grey. |
|
col = set(map(lambda x: x[0::3], col)) |
|
planes -= 2 |
|
return col,planes |
|
|
|
def main(argv=None): |
|
import sys |
|
|
|
if argv is None: |
|
argv = sys.argv |
|
|
|
argv = argv[1:] |
|
if len(argv) > 0: |
|
f = open(argv[0], 'rb') |
|
else: |
|
f = sys.stdin |
|
return colours(sys.stdout, f) |
|
|
|
if __name__ == '__main__': |
|
main()
|
|
|