静态图片文件转base64
import base64
with open('1.png', 'rb') as f:
source = f.read()
base64_img = base64.b64encode(source)
base64转静态图片文件
imgdata = base64.b64decode(base64_img)
# 将图片保存为文件
with open("new.png", 'wb') as f:
f.write(imgdata)
PS:这里有一点需要注意的是,有的图片的base64,它是有一个编码的头部的,类是data:image/png;base64,******
,如果是这样的base64要转为静态图片需要将data:image/png;base64,
去掉,否则base64.b64decode会报错,如果你是用上面的方式将图片转为base64的话,是没有上面的编码头的
pillow转base64
import base64
from io import BytesIO
from PIL import Image
image = Image.open('new.png')
byte_data = BytesIO() # 创建一个字节流管道
image.save(byte_data, format="PNG") # 将图片数据存入字节流管道
byte_data = byte_data.getvalue() # 从字节流管道中获取二进制
base64_img = base64.b64encode(byte_data)
base64转pillow
import base64
from io import BytesIO
from PIL import Image
byte_data = base64.b64decode(base64_img) # base64解码并转bytes
image = Image.open(BytesIO(byte_data)) # 将bytes转为PIL格式图片
image.show()
opencv转base64
import cv2
import base64
# 读取图像
image = cv2.imread('new.png')
# 将图像转换为字节流
buffer = cv2.imencode('.png', image)[1]
img_bytes = buffer.tobytes()
# 将字节流转换为 base64
base64_img = base64.b64encode(img_bytes)
base64转opencv
import cv2
import base64
import numpy as np
# 将 Base64 字符串解码为字节流
buffer = base64.b64decode(base64_img)
# 将字节流转换为 NumPy 数组
image_array = np.frombuffer(buffer, dtype=np.uint8)
# 从 NumPy 数组中读取图像
image = cv2.imdecode(image_array, cv2.IMREAD_COLOR)
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
pillow转opencv
转化的核心是将pillow的图片转化为numpy.ndarray,opencv的图片格式就是numpy的数组,正因如此,也有图像即数组的说法,图像可以看作是由像素值构成的数组,处理图像实质上就是对这些数组进行操作,通过对数组的操作来实现对图像的处理和分析
PIL.PngImagePlugin.PngImageFile—>numpy.ndarray
import cv2
import numpy as np
from PIL import Image
# 打开 Pillow 图像
pillow_img = Image.open('new.png')
# 将 Pillow 图像转换为 NumPy 数组(numpy.ndarray)
image_np = np.array(pillow_img)
# 将 RGB 格式转换为 BGR 格式
opencv_img = cv2.cvtColor(image_np, cv2.COLOR_RGB2BGR)
cv2.imshow('image', opencv_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
PS:因为pillow与opencv默认读取的图片通道顺序不一样,所以在转换前需要先做RGB->BGR的通道格式转换,反之亦然,所以这里即使不做通道格式转换,也是可以展示的,但显示会偏蓝色
opencv转pillow
numpy.ndarray—>PIL.PngImagePlugin.PngImageFile
import cv2
from PIL import Image
# 读取 OpenCV 图像
opencv_img = cv2.imread('new.png')
# 将 OpenCV 图像从 BGR 格式转换为 RGB 格式
image_rgb = cv2.cvtColor(opencv_img, cv2.COLOR_BGR2RGB)
# 从numpy.ndarray读取图片
pillow_img = Image.fromarray(image_rgb)
pillow_img.show()
图片指定位置叠加
有的时候会需要将两张图片叠加,即将一张图片叠加到另一张图片的指定位置,但经常图片的通道格式会不同,即有的图片有alpha通道,有的没有,还有就是图片叠加位置设置不当,导致前景图像的边界超过背景图像,而程序报错,下面代码可有效解决该问题
import numpy as np
import cv2
def add_alpha_channel(img):
""" 为jpg图像添加alpha通道 """
b_channel, g_channel, r_channel = cv2.split(img) # 剥离jpg图像通道
alpha_channel = np.ones(b_channel.shape, dtype=b_channel.dtype) * 255 # 创建Alpha通道
img_new = cv2.merge((b_channel, g_channel, r_channel, alpha_channel)) # 融合通道
return img_new
def merge_img(background_img, foreground_img, x1, y1):
""" 将background_img图像与foreground_img图像叠加
x1,y1分别为图片叠加起始坐标值
"""
x2 = x1 + foreground_img.shape[1]
y2 = y1 + foreground_img.shape[0]
# 判断图像是否已经为4通道
if background_img.shape[2] == 3:
background_img = add_alpha_channel(background_img)
if foreground_img.shape[2] == 3:
foreground_img = add_alpha_channel(foreground_img)
'''
当叠加图像时,可能因为叠加位置设置不当,导致前景图像的边界超过背景图像,而程序报错
这里设定一系列叠加位置的限制,可以满足前景图像超出背景图像范围时,依然可以正常叠加
'''
yy1 = 0
yy2 = foreground_img.shape[0]
xx1 = 0
xx2 = foreground_img.shape[1]
if x1 < 0:
xx1 = -x1
x1 = 0
if y1 < 0:
yy1 = - y1
y1 = 0
if x2 > background_img.shape[1]:
xx2 = foreground_img.shape[1] - (x2 - background_img.shape[1])
x2 = background_img.shape[1]
if y2 > background_img.shape[0]:
yy2 = foreground_img.shape[0] - (y2 - background_img.shape[0])
y2 = background_img.shape[0]
# 获取要覆盖图像的alpha值,将像素值除以255,使值保持在0-1之间
alpha_png = foreground_img[yy1:yy2, xx1:xx2, 3] / 255.0
alpha_jpg = 1 - alpha_png
# 开始叠加
for c in range(0, 3):
background_img[y1:y2, x1:x2, c] = ((alpha_jpg * background_img[y1:y2, x1:x2, c]) + (alpha_png * foreground_img[yy1:yy2, xx1:xx2, c]))
return background_img
background_img = cv2.imread('background_img.jpg', cv2.IMREAD_UNCHANGED)
foreground_img = cv2.imread('foreground_img.png', cv2.IMREAD_UNCHANGED)
ret_img = merge_img(background_img=background_img, foreground_img=foreground_img, x1=0, y1=0)
cv2.imshow('new_img', ret_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
上面opencv读取图片cv2.IMREAD_UNCHANGED的参数是加载图像包括它的alpha通道