from PIL import Image

def negative(img):
    """Invert colors of image.
    :param img: image
    :return: PIL object"""
    data = list(img.getdata())
    data_m = list()
    for pixel in data:
        red = 255 - pixel[0]
        green = 255 - pixel[1]
        blue = 255 - pixel[2]
        data_m.append((red, green, blue))
    img_m = Image.new(img.mode, img.size)
    img_m.putdata(data_m)
    return img_m

def red(img):
    data = list(img.getdata())
    data_m = list()
    for pixel in data:
        data_m.append((pixel[0], 0, 0))
    img_m = Image.new(img.mode, img.size)
    img_m.putdata(data_m)
    return img_m

def green(img):
    data = list(img.getdata())
    data_m = list()
    for pixel in data:
        data_m.append((0, pixel[1], 0))
    img_m = Image.new(img.mode, img.size)
    img_m.putdata(data_m)
    return img_m

def blue(img):
    data = list(img.getdata())
    data_m = list()
    for pixel in data:
        data_m.append((0, 0, pixel[2]))
    img_m = Image.new(img.mode, img.size)
    img_m.putdata(data_m)
    return img_m

def grayscale(img):
    data = list(img.getdata())
    data_m = list()
    for pixel in data:
        gray = (pixel[0] + pixel[1] + pixel[2]) // 3
        data_m.append((gray, gray, gray))
    img_m = Image.new(img.mode, img.size)
    img_m.putdata(data_m)
    return img_m

def black_white(img, limit):
    data = list(img.getdata())
    data_m = list()
    for pixel in data:
        gray = (pixel[0] + pixel[1] + pixel[2]) // 3
        gray = 0 if gray < limit else 255
        data_m.append((gray, gray, gray))
    img_m = Image.new(img.mode, img.size)
    img_m.putdata(data_m)
    return img_m

def brightness(img, value):
    data = list(img.getdata())
    data_m = list()
    for pixel in data:
        data_m.append((pixel[0]+value, pixel[1]+value, pixel[2]+value))
    img_m = Image.new(img.mode, img.size)
    img_m.putdata(data_m)
    return img_m

def rotate(img, angle):
    return img.rotate(angle, expand=True)

def horizontal_mirror(img):
    return img.transpose(Image.FLIP_LEFT_RIGHT)

def vertical_mirror(img):
    return img.transpose(Image.FLIP_TOP_BOTTOM)