1、 背景
由于前面推流通过代代版本更新,目前停留在图片每一帧根据键的不同存进django框架自带的内存空间中,但是因为存在同时观看27个,甚至更多的情况,所以降低性能就显得尤为重要,虽然现在前端观看9个仅用20%CPU性能,后端也不高,但是也是要降
2、 python压缩图片的选择
一、Pillow库
Python中有一个Pillow库,它是Python Imaging Library(PIL)的一个分支,是一个功能强大的图像处理库。使用Pillow库可以对图片进行大小调整、旋转、剪切、增强、滤波、格式转换等多种操作,其中就包括图片压缩。
resize(size, resample=None, box=None, reducing_gap=None)
size参数是新图片的大小,可以是一个元组(width, height),也可以是一个整数,表示新图片的宽和高相等。resample参数表示重采样方法,如果为None,则使用默认的重采样方法。box参数表示裁剪的区域。reducing_gap参数表示缩小图片时的最小间隔。
二、PIL库
Python中还有一个PIL库,它是Python Image Library的缩写,是一个支持多种图像文件格式的Python图像处理库。PIL库中也提供了resize()方法,可以进行图片的大小调整,从而实现图片压缩的效果。
resize(size, resample=None, box=None)
size参数表示新图片的大小,可以是一个元组(width, height),也可以是一个整数,表示新图片的宽和高相等。resample参数表示重采样方法,如果为None,则使用默认的重采样方法。box参数表示裁剪的区域。
from PIL import Image
def tosmall(request):
streaming_from_address=request.GET.get("streaming_from_address")
streaming_to_address=request.GET.get("streaming_to_address")
cap = cv2.VideoCapture(streaming_from_address)
while cap.isOpened():
try:
ret, frame = cap.read()
im = Image.fromarray(frame) #数组转为图片
print(im.size)
width, height = im.size
w=165
h = int(height * w / width)
image = im.resize((int(w), int(h)), Image.ANTIALIAS) #缩小图片
print(image.size)
im_array = np.array(image) #图片转数组
ret, jpeg = cv2.imencode('.jpg', im_array) #数组转图像编码
# jpeg = cv2.resize(jpeg,(width,),interpolation=cv2.INTER_CUBIC)
print(jpeg)
cache.set(streaming_to_address, jpeg.tobytes())
except Exception as e:
pass
im.resize((int(w), int(h)), Image.ANTIALIAS)中Image.ANTIALIAS为保持图像画质
cache.set(streaming_to_address, jpeg.tobytes())中cache为setting中导入的django自带内存
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': '127.0.0.1:11211',
}
}
获取图像方法:
def get1(request):
streaming_to_address = request.GET.get("streaming_to_address")
print(streaming_to_address)
return StreamingHttpResponse(gen(streaming_to_address),
content_type='multipart/x-mixed-replace; boundary=frame')
def gen(streaming_to_address):
"""
生产最新一帧图像
:return:
"""
span = 1 / 25
i = 0
count = 0
while True:
i += 1
# print(i)
time.sleep(span)
frame = cache.get(streaming_to_address)
print(frame)
if frame:
count = 0
# yield (b'frame' + frame)
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')
else:
count += 1
if count > 100:
break
三、OpenCV库
Python中还有一个OpenCV库,它是一个开源的计算机视觉库,可以用于处理图像和视频。OpenCV库可以用来实现图片压缩的效果。
resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) -> dst
src参数表示源图片,dsize参数表示新图片的大小,可以是一个元组(width, height),也可以是一个整数,表示新图片的宽和高相等。fx、fy参数表示在x轴和y轴上的缩放比例。interpolation参数表示插值方法。
OpenCV库可以用来实现图片压缩的效果,不过需要安装OpenCV库,并且学习OpenCV库的使用方法。
标签:None,python,压缩,jpeg,streaming,address,frame,图片 From: https://www.cnblogs.com/beijie/p/17663058.html