-->

python 实现图片压缩

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库的使用方法。

posted @ 2023-08-29 14:06  ꧁ʚ星月天空ɞ꧂  阅读(291)  评论(0)    收藏  举报