首页 > 编程语言 >python 实现图片压缩

python 实现图片压缩

时间:2023-08-29 14:23:46浏览次数:34  
标签:None python 压缩 jpeg streaming address frame 图片

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

相关文章

  • 【Python-每日技巧】格式化输出的区别
    在Python中,字符串可以使用单引号(')或双引号(")括起来。如果字符串本身包含引号字符,你可以在字符串中使用反斜杠(\)进行转义。对于字符串中的美元符号($),它是一个普通的字符,不需要进行特殊处理。你可以直接在字符串中使用美元符号,如下所示:my_string="Thisisastringwitha$symbol."......
  • 坐标文本转图片
    坐标文本格式类似101112341155#脚本文件importmatplotlib.pyplotaspltimportnumpyasnpx=[]y=[]withopen('message.txt','r')asf:datas=f.readlines()fordataindatas:arr=data.split('')x.app......
  • python加载so库
    fromctypesimportCDLL,RTLD_GLOBALfrom..ankeimportcurrentOSclassLoadSo:def__init__(self,soPath,args):ifcurrentOS!='darwin':forarginargs:"""1、麒麟、UOS环境循环......
  • Python+协同过滤算法实现一个简单的图书推荐系统
    背景介绍当我们做一些推荐系统网站时,通常需要合适的推荐算法,下面给大家介绍推荐系统中经典的推荐算法——协同过滤算法。在本文中通过Python语言,以一个图书推荐系统为案例,最终实现一个基于用户对图书的评分而对指定的用户个性化推荐的网站系统。(ps:本文中介绍的是算法的简单示例,......
  • Web编辑器 从word中复制内容带多张图片
    ​如何做到ueditor批量上传word图片?1、前端引用代码<!DOCTYPE html PUBLIC "-//W3C//DTDXHTML1.0Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head>......
  • 《最新出炉》系列初窥篇-Python+Playwright自动化测试-14-playwright操作iframe-番外
    1.简介通过前边三篇的学习,想必大家已经对iframe有了一定的认识和了解,今天这一篇主要是对iframe的一些特殊情况的介绍和讲解,主要从iframe的定位、监听事件和执行js脚本三个方面进行展开介绍。2.iframe定位2.1动态id属性如何定位有时候,我们可能看到的iframe的id不是固定的,是动......
  • 【Element】el-dialog 内使用 el-image 并添加 preview-src-list 预览,拖拽导致图片预
    现象el-dialog内使用el-image并添加preview-src-list预览,拖拽导致图片预览不完整<el-dialogwidth="500"v-model="visible":title="activeProp?.name"@close="handleClose":draggable="true"//可拖拽......
  • Python连接Neo4j工具比较 Neo4j Driver、py2neo
    Python有许多可以连接Neo4j的库和工具,以下是一些常用的:Neo4jDriverforPython这是官方提供的Python驱动程序,它使用Cypher查询语言与Neo4j数据库进行交互。您可以使用此驱动程序与Neo4j数据库建立连接,执行查询和管理事务。优点:官方提供的驱动程序,支持最新的Neo4j版本,提供完整......
  • Python学习 -- 枚举类
    当谈到在Python中管理一组常量或者枚举类型的时候,Enum(枚举)类是一个非常有用的工具。Python的Enum类允许你创建具有有意义的、可读性高的常量集合,而不必使用硬编码的数字或字符串。在本篇博客中,我们将深入探讨Python中的Enum类,包括如何定义、使用和高级技巧,同时提供详细的代码案例。......
  • 安装python3.5并在QT中配置使用
    一、安装32位的python3.5及各种库链接:https://pan.baidu.com/s/1q94_Vo3XDhfZ_hmssPjz6w提取码:zotf先在dos环境下输入python,如果显示版本则表示python安装成功,安装库文件的时候,在dos环境下进入whl文件所在的目录,然后使用pipinstall***-whl。如果提示pip版本过低,则按照提示更新pip......