BadColor: new exception class

rrggbb_to_triplet(): New utility function
This commit is contained in:
Barry Warsaw 1998-01-31 23:38:48 +00:00
parent bfbe67f47f
commit 9f4d73a9cf
1 changed files with 43 additions and 3 deletions

View File

@ -16,6 +16,9 @@ Supporte file types are:
import sys import sys
import re import re
class BadColor(Exception):
pass
# generic class # generic class
class ColorDB: class ColorDB:
@ -66,11 +69,16 @@ class ColorDB:
def find(self, red, green, blue): def find(self, red, green, blue):
rrggbb = (red << 16) + (blue << 8) + green rrggbb = (red << 16) + (blue << 8) + green
return self.__byrrggbb.get(rrggbb, (None, [])) try:
return self.__byrrggbb[rrggbb]
except KeyError:
raise BadColor(red, green, blue)
def find_byname(self, name): def find_byname(self, name):
# TBD: is the unfound value right? try:
return self.__byname.get(name, (0, 0, 0, 0)) return self.__byname[name]
except KeyError:
raise BadColor(name)
def nearest(self, red, green, blue): def nearest(self, red, green, blue):
# TBD: use Voronoi diagrams, Delaunay triangulation, or octree for # TBD: use Voronoi diagrams, Delaunay triangulation, or octree for
@ -126,6 +134,37 @@ def get_colordb(file, filetype=X_RGB_TXT):
fp.close() fp.close()
return colordb return colordb
def rrggbb_to_triplet(color):
"""Converts a #rrggbb color to the tuple (red, green, blue)."""
if color[0] <> '#':
raise BadColor(color)
zero = ord('0')
a = ord('a')
A = ord('A')
def _hexchar(c, zero=zero, a=a, A=A):
v = ord(c)
if v >= zero and v <= zero+9:
return v - zero
elif v >= a and v <= a+26:
return v - a + 10
elif v >= A and v <= A+26:
return v - A + 10
else:
raise BadColor
try:
digits = map(_hexchar, color[1:])
except BadColor:
raise BadColor(color)
red = digits[0] * 16 + digits[1]
green = digits[2] * 16 + digits[3]
blue = digits[4] * 16 + digits[5]
return (red, green, blue)
if __name__ == '__main__': if __name__ == '__main__':
import string import string
@ -150,3 +189,4 @@ if __name__ == '__main__':
nearest = apply(colordb.nearest, target) nearest = apply(colordb.nearest, target)
t1 = time.time() t1 = time.time()
print 'found nearest color', nearest, 'in', t1-t0, 'seconds' print 'found nearest color', nearest, 'in', t1-t0, 'seconds'