-
Notifications
You must be signed in to change notification settings - Fork 0
/
finalproject.py
112 lines (98 loc) · 4.27 KB
/
finalproject.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# CST 205
# Project name is Image Manipulator, filename is finalproject.py
# This Code takes an image and creates a new image with the user selected filter applied
# Done by Julian Diaz
# 12/14/2020
# Julian worked on each function and class in this file,finalproject.py.
from flask import Flask, render_template, url_for, flash, redirect
from flask_bootstrap import Bootstrap
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
from PIL import Image
import os
app = Flask(__name__)
app.config['SECRET_KEY'] = 'csumb-otter'
bootstrap = Bootstrap(app)
cwd = os.getcwd()
img_choice = ["Meme", "Flaming Heart", "Apex"]
filter_choice= ['Sepia', 'Negative', 'Grayscale', 'Thumbnail', 'None']
# this is the class that asks what image and filter the user wants to use
class manipulation(FlaskForm):
user_selection_img = StringField("Choose a image: ", validators=[DataRequired()])
user_selection = StringField('Choose a filter: ', validators=[DataRequired()])
#This is the where the image manipulation happens
def filter_selection(filter_choice, img_choice):
global image
img_choice = img_choice.lower()
if img_choice == "meme":
image = "new_choice1"
img = Image.open(f'static/images/choice1.jpg')
elif img_choice == "flaming heart":
image = "new_choice2"
img = Image.open(f'static/images/choice2.jpg')
elif img_choice == "apex":
image = "new_choice4"
img = Image.open(f'static/images/choice3.jpg')
# img = Image.open(f'static/images/warframe.jpg') #this is a placeholder
filter_choice = filter_choice.lower()
if filter_choice == 'sepia':
#this function runs if the user's choice was sepia
def sepia(pixel):
if pixel[0] < 63:
r,g,b = int(pixel[0]*1.1), pixel[1], int(pixel[2]*.9)
elif pixel[0]>62 and pixel[0]<192:
r,g,b = int(pixel[0]*1.15), pixel[1], int(pixel[2]*.85)
else:
r = int(pixel[0]*1.08)
if r>255: r=255
g,b = pixel[1], pixel[2]//2
return r,g,b
sepia_list = map(sepia, img.getdata())
img.putdata(list(sepia_list))
#runs if user's choice was negative
elif filter_choice == 'negative':
negative_list = [(255-p[0], 255-p[1], 255-p[2])
for p in img.getdata()]
img.putdata(negative_list)
#runs if user's choice was grayscale
elif filter_choice == 'grayscale':
new_list = [ ( (a[0]+a[1]+a[2])//3, ) * 3
for a in img.getdata() ]
img.putdata(new_list)
#runs if user choice was thumbnail
elif filter_choice == 'thumbnail':
source = img
w,h = source.width, source.height
target = Image.new('RGB', (w, h), 'rosybrown')
target_x = 0
for source_x in range(0, source.width, 2):
target_y = 0
for source_y in range(0, source.height, 2):
pixel = source.getpixel((source_x, source_y))
target.putpixel((target_x, target_y), pixel)
target_y += 1
target_x += 1
img = target
#this saves the filtered photo as new_photo.jpg to the user's computer
# img = img.save('static/images/new_warframe.jpg')
if img_choice == "meme":
img = img.save('static/images/new_choice1.jpg')
elif img_choice == "flaming heart":
img = img.save('static/images/new_choice2.jpg')
elif img_choice == "apex":
img = img.save('static/images/new_choice4.jpg')
#this takes you to the results page that should display the filtered image
return img
#this is the first page or the main page and links to the html
@app.route('/', methods=('GET','POST'))
def main_page():
form = manipulation()
if form.validate_on_submit():
filter_selection(form.user_selection.data, form.user_selection_img.data)
return redirect('/results')
return render_template('imageupload.html', form = form)
# this is the reults page and links to the html for that
@app.route('/results', methods=('GET', 'POST'))
def results():
return render_template('imagedisplay.html', id = image)