Python 对图像进行base64编码及解码读取为numpy、opencv、matplot需要的格式,以及压缩

Python 对图像进行base64编码及解码读取为numpy、opencv、matplot需要的格式,以及无损压缩

这篇博客将介绍Python如何对图像进行base64编解码及读取为numpy、opencv、matplot需要的格式。

1. 效果图

原始图如下:

base64转换为numpy数组效果图如下(一维):
在这里插入图片描述

base64转换为opencv BGR VS 灰度效果图如下:

在这里插入图片描述
base64转换为 matplot RGB VS 灰度效果图如下:

在这里插入图片描述

2. 源码

  • base64编码图片为string
  • base64解码string为图片
  • base64解码string为numpy、opencv、matplot图片
# 对图片进行base64编码,解码,解码为numpy,opencv,matplot照片
# USAGE
# python base64_2_jpg.py

import base64

import cv2
import imutils
import numpy as np
from matplotlib import pyplot as plt


# 将字符串写入文字
#  name 图片名
#  base64_data 图片二进制编码后string流
def write2txt(name, base64_data):
    # 写入_base64.txt
    print(name)
    print(name,len(base64_data))
    basef = open(name + '_base64.txt', 'w')
    data = 'data:image/jpg;base64,%s' % base64_data
    # print(data)
    basef.write(base64_data)
    basef.close()


# 编码图像为base64字符串
def encode_base64(file):
    with open(file, 'rb') as f:
        img_data = f.read()
        base64_data = base64.b64encode(img_data)
        print(type(base64_data))
        # print(base64_data)
        # 如果想要在浏览器上访问base64格式图片,需要在前面加上:data:image/jpeg;base64,
        base64_str = str(base64_data, 'utf-8')
        # print(base64_str)
        print(len(base64_data))
        write2txt(file.replace(".jpg", ""), base64_str)
        return base64_data


# 解码base64字符串为图像,并保存
def decode_base64(base64_data):
    with open('./images/base64.jpg', 'wb') as file:
        img = base64.b64decode(base64_data)
        file.write(img)


# 解码base64字符串为numpy图像、opencv、matplot图像

# 解码base64字符串为numpy图像
def decode_base64_np_img(base64_data):
    img = base64.b64decode(base64_data)
    img_array = np.fromstring(img, np.uint8)  # 转换np序列
    print('numpy: ', img_array.shape)
    cv2.imshow("img", img_array)
    cv2.waitKey(0)


# 解码base64字符串为opencv图像
def decode_base64_cv_img(base64_data):
    img = base64.b64decode(base64_data)
    img_array = np.fromstring(img, np.uint8)  # 转换np序列
    img_raw = cv2.imdecode(img_array, cv2.IMREAD_COLOR)  # 转换Opencv格式BGR
    img_gray = cv2.imdecode(img_array, cv2.IMREAD_GRAYSCALE)  # 转换灰度图

    print('opencv bgr: ', img_raw.shape)
    print('opencv gray: ', img_gray.shape)

    cv2.imshow("img bgr", img_raw)
    cv2.imshow("img gray", img_gray)
    cv2.waitKey(0)


# 解码base64字符串为matplot图像
def decode_base64_matplot_img(base64_data):
    img = base64.b64decode(base64_data)
    img_array = np.fromstring(img, np.uint8)  # 转换np序列
    img_raw = cv2.imdecode(img_array, cv2.IMREAD_COLOR)  # 转换Opencv格式BGR
    img_matplot = cv2.cvtColor(img_raw, cv2.COLOR_BGR2RGB)  # BGR转RGB

    img_gray = cv2.imdecode(img_array, cv2.IMREAD_GRAYSCALE)  # 转换灰度图
    imggray_matplot = cv2.cvtColor(img_gray, cv2.COLOR_GRAY2RGB)  # 灰度图转RGB
    plt.figure()
    plt.title("Matplot RGB Origin Image")
    plt.axis("off")
    plt.imshow(img_matplot)

    plt.figure()
    plt.title("Matplot Gray Origin Image")
    plt.axis("off")
    plt.imshow(imggray_matplot)
    plt.show()

def pic_compress(base64_data, out_path, target_size=199, quality=90, step=5, pic_type='.jpg'):
    pic_byte = base64.b64decode(base64_data)
    img_np = np.fromstring(pic_byte, np.uint8)  # 转换np序列
    img_cv = cv2.imdecode(img_np, cv2.IMREAD_ANYCOLOR)
    print(img_cv.shape)
    if (img_cv.shape[1] > 1000):
        img_cv = imutils.resize(img_cv, width=1000)
    print(img_cv.shape)

    current_size = len(pic_byte) / 1024
    print("图片压缩前的大小为(KB):", current_size)
    while current_size > target_size:
        retval, pic_byte = cv2.imencode(pic_type, img_cv, [int(cv2.IMWRITE_JPEG_QUALITY), quality])
        # retval, buffer = cv2.imencode('.jpg', pic_img)
        pic_str = base64.b64encode(pic_byte)
        pic_str = pic_str.decode()
        if quality - step < 0:
            break
        quality -= step
        current_size = len(pic_byte) / 1024

    # 保存图片
    # with open(out_path, 'wb') as f:
    #     f.write(BytesIO(pic_byte).getvalue())

    print(len(pic_byte) / 1024)
    # print(pic_str)
    # return pic_byte
    return (len(pic_byte) / 1024, pic_str)

if __name__ == '__main__':
    img_path = './images/1622175322109_0.025711.jpg'
    base64_data = encode_base64(img_path)
    decode_base64(base64_data)

    decode_base64_np_img(base64_data)
    decode_base64_cv_img(base64_data)
    decode_base64_matplot_img(base64_data)

    (pic_size, pic) = pic_compress(base64_data, 'new_test.jpg', target_size=100)
    print("图片压缩后的大小为(KB):", pic_size)
    print(pic)

参考

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序媛一枚~

您的鼓励是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值