Nadesłany przez Marek Madejski, 22 maja 2015 16:16
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
cmy_rgb.py:
# -*- coding: UTF-8 -*- # Transformacja pomiedzy modelami CMY i RGB # www.algorytm.org import random import math def getRange(x, y, z): ''' Zakladamy, ze podanie liczby typu int oznacza zakres 0-255, a typu float - 0.0-1.0 ''' if isinstance(x, int) and isinstance(y, int) and isinstance(z, int): assert 0<=x<=255 and 0<=y<=255 and 0<=z<=255, "Wartosci poza zakresem 0-255." return 255 elif isinstance(x, float) and isinstance(y, float) and isinstance(z, float): assert 0<=x<=1 and 0<=y<=1 and 0<=z<=1, "Wartosci poza zakresem 0.0-1.0." return 1.0 else: raise ValueError("Zakresy dla komponentow nie sa spojne.") def rgbToHex(r, g, b): if isinstance(r, float) and isinstance(g, float) and isinstance(b, float): r = int(r * 255) g = int(g * 255) b = int(b * 255) return "#{0:02x}{1:02x}{2:02x}".format(r, g, b) def cmyToRgb(c, m, y): range_ = getRange(c, m, y) r = range_ - c g = range_ - m b = range_ - y return r, g, b def rgbToCmy(r, g, b): range_ = getRange(r, g, b) c = range_ - r; m = range_ - g; y = range_ - b; return c, m, y def demo(mode): x, y, z = list(mode) xyzStr = input("Podaj kolor {} w formacie '{} {} {}'\nWpisz albo wartosci z zakresu 0-255 w formacie calkowitym\n albo wartosci z zakresu 0.0-1.0 w formacie dziesietnym\n".format(mode, x, y, z)) xyzList = [float(i) for i in xyzStr.split() if list(xyzStr).count('.') == 3] if len(xyzList) == 0: xyzList = [int(i) for i in xyzStr.split() if '.' not in xyzStr] if len(xyzList) != 3: raise ValueError('Bledny format danych wejsciowych.') return xyzList def main(): c, m, y = demo('CMY') r, g, b = rgbToCmy(c, m, y) print("wartosc RGB: {} {} {} ({})".format(r, g, b, rgbToHex(r, g ,b))) print('\n') r, g, b = demo('RGB') c, m, y = rgbToCmy(r, g, b) print("wartosc CMY: {} {} {}".format(c, m, y)) if __name__ == "__main__": main()