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()

