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
import requests
import io
from PIL import Image, ImageFilter
from django.conf import settings
from gm_upload.utils.filenameutils import store_picture_and_get_key
from utils.rpc import logging_exception
class BlurVideoImage(object):
PIC_BASE_URL = '?vframe/jpg/offset/{0}/rotate/auto'
def __init__(self, handler, uploader):
self.handler = handler
self.uploader = uploader
def run(self, url, second=0, video_pic_url=settings.VIDEO_PIC_URL, video_host=settings.VIDEO_HOST, radius=50,
blurimg_size=(800, 450),
cropimg_size=(650, 450)):
if isinstance(url,bytes):
url = url.decode('utf-8')
video_pic_url = video_pic_url if not second else self.PIC_BASE_URL.format(second)
url = self.clean_video_url(url)
img = self.handler.handler(url, video_pic_url, video_host, radius, blurimg_size, cropimg_size)
return self.uploader(img)
def uploader(self, img):
return store_picture_and_get_key(img)
@staticmethod
def clean_video_url(video_url):
return video_url.replace(settings.VIDEO_HOST, '')
class EditImage(object):
@classmethod
def handler(cls, url, video_pic_url, video_host, radius, blurimg_size, cropimg_size):
image = cls.open_image(url, video_pic_url, video_host)
width, hight = image.size
if width < 1.7 * hight: # 针对竖版视频做处理
cropimg_size = cls.adaptsize(blurimg_size, cropimg_size)
_squre = min(image.size)
_padding = int((width - hight) / 2)
x, y = (_padding, 0) if _padding > 0 else (0, -_padding)
croped_im = image.crop((x, y, x + _squre, y + _squre)).resize(cropimg_size, Image.ANTIALIAS)
blur_image = image.filter(ImageFilter.GaussianBlur(radius=radius)).resize(blurimg_size, Image.ANTIALIAS)
x, y = int((blur_image.size[0] - croped_im.size[0]) / 2), int((blur_image.size[1] - croped_im.size[1]) / 2)
blur_image.paste(croped_im, (x, y))
else:
blur_image = image
# convert pillow.image.image to bytesio that can upload to qiniu
output = io.BytesIO()
blur_image.save(output, format='JPEG')
return output.getvalue()
@staticmethod
def open_image(url, video_pic_url, video_host):
url = video_host + url + video_pic_url
try:
response = requests.get(url, stream=True, timeout=5)
if response.status_code == 200:
response.raw.decode_content = True
return Image.open(response.raw)
except RuntimeError:
logging_exception()
raise
@classmethod
def adaptsize(cls, blurimg_size, cropimg_size):
if max(cropimg_size) > min(blurimg_size):
cropimg_size = (min(blurimg_size), min(blurimg_size))
else:
cropimg_size = (min(cropimg_size), min(cropimg_size))
return cropimg_size
UploadVideoPicture = BlurVideoImage(EditImage, store_picture_and_get_key).run