Image图像数据的常用格式转化操作实现记录【Image、Array、Bytes相互转化】
程序员文章站
2024-03-05 18:02:37
...
最近的工作中用到的图像数据处理比较多一点,很多地方都需要对Array、Image以及二进制字节流数据Bytes进行相互之间的转化,总计记录了整个过程中自己的实现方法,放在这里备忘,需要的可以拿去使用,所有实现的方法均已经过测试可以直接使用。下面是具体的代码实现:
#!usr/bin/env python
# encoding:utf-8
from __future__ import division
'''
__Author__:沂水寒城
功能:Image 图像数据的常用格式转化操作实现记录
'''
import io
import sys
import requests
import numpy as np
from PIL import Image
if sys.version_info==2:
reload(sys)
sys.setdefaultencoding('utf-8')
def img2Array(pic='a.png'):
'''
Image 转化为 array 格式
'''
img=Image.open(pic)
arr=np.asarray(img)
print('arr_shape: ', arr.shape)
print('arr_value: ', arr)
return arr
def array2Img(arr):
'''
array 转化为 Image 格式
'''
image=Image.fromarray(arr.astype('uint8')).convert('RGB')
image.show()
def byte2Img():
'''
二进制字节流数据转化为Image格式
'''
url="http://seopic.699pic.com/photo/50014/4148.jpg_wh1200.jpg"
content = requests.get(url, stream=True).content
byteStream = io.BytesIO(content)
image = Image.open(byteStream)
image.show()
def img2Byte(pic='a.png'):
'''
Image 转化为二进制字节流格式
'''
img=Image.open(pic)
imgByte=io.BytesIO()
img.save(imgByte,format='JPEG')
byte_res=imgByte.getvalue()
print('byte_res: ', byte_res)
def byte2Array():
'''
二进制字节流数据转化为 Array 格式
'''
url="http://seopic.699pic.com/photo/50014/4148.jpg_wh1200.jpg"
content = requests.get(url, stream=True).content
byteStream = io.BytesIO(content)
image = Image.open(byteStream)
arr=np.asarray(image)
print('arr_shape: ', arr.shape)
print('arr_value: ', arr)
return arr
def array2Byte(arr):
'''
Array 格式转化为二进制字节流格式
'''
img=Image.fromarray(arr.astype('uint8')).convert('RGB')
imgByte=io.BytesIO()
img.save(imgByte,format='JPEG')
byte_res=imgByte.getvalue()
print('byte_res: ', byte_res)
if __name__ == '__main__':
#Image 转化为 array 格式
arr=img2Array(pic='a.png')
#array 转化为 Image 格式
array2Img(arr)
#二进制字节流数据转化为Image格式
byte2Img()
#Image 转化为二进制字节流格式
img2Byte(pic='a.png')
#二进制字节流数据转化为 Array 格式
byte2Array()
#Array 格式转化为二进制字节流格式
array2Byte(arr)
运行结果如下所示:
('arr_shape: ', (331L, 500L, 3L))
('arr_value: ', array([[[100, 64, 66],
[108, 72, 74],
[109, 73, 75],
...,
[ 83, 68, 65],
[ 83, 68, 65],
[131, 116, 113]],
[[ 99, 63, 65],
[104, 68, 70],
[105, 69, 71],
...,
[ 84, 69, 66],
[ 83, 68, 65],
[130, 115, 112]],
[[103, 67, 69],
[106, 70, 72],
[106, 70, 72],
...,
[ 81, 66, 61],
[ 81, 66, 63],
[129, 114, 111]],
...,
[[131, 85, 51],
[136, 90, 56],
[141, 95, 59],
...,
[ 92, 61, 40],
[ 94, 66, 45],
[140, 113, 94]],
[[133, 87, 53],
[139, 93, 59],
[144, 98, 62],
...,
[ 97, 66, 45],
[ 92, 64, 43],
[136, 109, 88]],
[[138, 89, 56],
[145, 96, 63],
[151, 103, 67],
...,
[108, 78, 54],
[ 96, 68, 46],
[138, 111, 90]]], dtype=uint8))
[Finished in 0.4s]
('byte_res: ', '\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xdb\x00C\x00\x08\x06\x06\x07\x06\x05\x08\x07\x07\x07\t\t\x08\n\x0c\x14\r\x0c\x0b\x0b\x0c\x19\x12\x13\x0f\x14\x1d\x1a\x1f\x1e\x1d\x1a\x1c\x1c $.\')
('arr_shape: ', (685L, 1200L, 3L))
('arr_value: ', array([[[ 1, 124, 218],
[ 0, 125, 218],
[ 0, 125, 218],
...,
[ 0, 48, 114],
[ 0, 48, 114],
[ 0, 48, 114]],
[[ 0, 125, 218],
[ 0, 125, 218],
[ 0, 125, 218],
...,
[ 0, 49, 115],
[ 0, 49, 115],
[ 0, 49, 115]],
[[ 1, 126, 219],
[ 1, 126, 219],
[ 1, 126, 219],
...,
[ 1, 50, 116],
[ 1, 50, 116],
[ 1, 50, 116]],
...,
[[159, 214, 244],
[162, 217, 247],
[163, 218, 248],
...,
[128, 193, 225],
[127, 192, 224],
[127, 190, 221]],
[[158, 213, 243],
[161, 216, 246],
[161, 218, 247],
...,
[118, 183, 215],
[118, 181, 212],
[117, 180, 211]],
[[158, 215, 244],
[160, 217, 246],
[159, 216, 245],
...,
[125, 190, 220],
[124, 187, 218],
[123, 186, 217]]], dtype=uint8))
[Finished in 1.1s]
('arr_shape: ', (331L, 500L, 3L))
('arr_value: ', array([[[100, 64, 66],
[108, 72, 74],
[109, 73, 75],
...,
[ 83, 68, 65],
[ 83, 68, 65],
[131, 116, 113]],
[[ 99, 63, 65],
[104, 68, 70],
[105, 69, 71],
...,
[ 84, 69, 66],
[ 83, 68, 65],
[130, 115, 112]],
[[103, 67, 69],
[106, 70, 72],
[106, 70, 72],
...,
[ 81, 66, 61],
[ 81, 66, 63],
[129, 114, 111]],
...,
[[131, 85, 51],
[136, 90, 56],
[141, 95, 59],
...,
[ 92, 61, 40],
[ 94, 66, 45],
[140, 113, 94]],
[[133, 87, 53],
[139, 93, 59],
[144, 98, 62],
...,
[ 97, 66, 45],
[ 92, 64, 43],
[136, 109, 88]],
[[138, 89, 56],
[145, 96, 63],
[151, 103, 67],
...,
[108, 78, 54],
[ 96, 68, 46],
[138, 111, 90]]], dtype=uint8))
('byte_res: ', '\xff\xd8\xff\xe0\x00\x10JFIF')
这里需要说明的是,byte_res 结果内容是非常大的,我贴上原始结果数据的时候提示【内容过长无法发布】,所以上面的byte_res我都是只截取了前面一小部分的数据贴出来的,仅作为示意。
上一篇: 浅谈java String.split丢失结尾空字符串的问题
下一篇: jQuery发布微博案例