forked from humberry/scene-tutorial
-
Notifications
You must be signed in to change notification settings - Fork 0
/
camera_roll_resize.py
117 lines (106 loc) · 4.14 KB
/
camera_roll_resize.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
113
114
115
116
117
import clipboard
import Image
import photos
pic_para_menu_fmt = """
0 = no change ({})
1 = black/white
2 = grey
3 = RGB no transparency
4 = RGB with transparency
5 = CMYK
6 = YCbCr
7 = 32bit Pixel"""
pic_info_menu_fmt = """Picture-Information: resolution = {width} x {height} ({megapixels} MP), mode = {image_mode}
!!! Changing the resolution is time-consuming !!! Resolution higher 6000 x 4000 (24MP) can cause an abend!
0 = Auto processing (Resolution = {width} x {height}), quality = 95%, mode = {image_mode}
1 = Same resolution ({width} x {height})
2 = Define resolution
3 = 3MP (2048 x 1536)
5 = 5MP (2592 x 1936)"""
def pic_save(image, image_mode, width, height, quality, resize):
print('\nPicture save is in process ...')
if resize:
image = image.resize((width, height), Image.ANTIALIAS)
background = Image.new(image_mode, (width,height), 'white')
background.paste(image, (0, 0))
clipboard.set_image((background), format='jpeg', jpeg_quality=quality)
photos.save_image(clipboard.get_image())
fmt = 'Completed!\nResolution = {} x {}, quality = {:.0f}%, mode = {}'
print(fmt.format(width, height, quality * 100, image_mode))
def pic_para(image_mode):
quality = int(raw_input('\nQuality (0 - 100): ')) / 100.0
if quality < 0.0:
quality = 0.0
elif quality > 1.0:
quality = 1.0
print(pic_para_menu_fmt.format(image_mode))
image_mode_old = image_mode
image_mode = int(raw_input('Mode: '))
menu_options = { 1 : '1',
2 : 'L',
3 : 'RGB',
4 : 'RGBA',
5 : 'CMYK',
6 : 'YCbCr',
7 : 'I' }
return menu_options.get(image_mode, image_mode_old), quality
def main():
if not photos.get_count():
print('Sorry no access or no pictures.')
return
image2 = photos.pick_image()
image = image2.convert('RGBA') #fix for current scene.load_pil_image()
if not image:
print('No image selected. Good bye!')
return
resize = False
quality = 95
width, height = image.size
megapixels = round(width * height / 1000000.0, 1)
image_mode = image.mode
print(pic_info_menu_fmt.format(**{ 'width' : width,
'height' : height,
'megapixels' : megapixels,
'image_mode' : image_mode }))
option = int(raw_input('Resolution: '))
if option not in (0, 1, 2, 3, 5):
print('Cancel: {} is not valid input.'.format(option))
return
if option == 0:
quality /= 100.0
elif option == 1:
image_mode, quality = pic_para(image_mode)
elif option == 2:
print('\nChanging the ratio causes picture deformation!')
width2 = int(raw_input('Width: '))
ratio = width / (height * 1.0)
suggestion = width2 / ratio
height2 = int(raw_input('Height [Enter = {:.0f}]:'.format(suggestion)) or suggestion)
if (width2 == width and height2 == height):
resize = False
else:
resize = True
width = width2
height = height2
image_mode, quality = pic_para(image_mode)
elif option == 3:
resolution3megapixel = (2048, 1536)
resize = not (width in resolution3megapixel and height in resolution3megapixel)
if resize:
if width >= height: # Landscape or Square
width, height = resolution3megapixel # Landscape
else:
height, width = resolution3megapixel # Portrait
image_mode, quality = pic_para(image_mode)
elif option == 5:
resolution5megapixel = (2592, 1936)
resize = not (width in resolution5megapixel and height in resolution5megapixel)
if resize:
if width >= height: # Landscape or Square
width, height = resolution5megapixel # Landscape
else:
height, width = resolution5megapixel # Portrait
image_mode, quality = pic_para(image_mode)
pic_save(image, image_mode, width, height, quality, resize)
if __name__ == '__main__':
main()