Python的許多圖像庫里面有個函數(shù)叫imread - Ref:Python的各種imread函數(shù)在實現(xiàn)方式和讀取速度上有何區(qū)別?,這個函數(shù)傳入的參數(shù)是fname,也就是文件名或URL路徑。可以說,算是相當友好了。
但是,我今天碰到的問題是這樣的,Client發(fā)送一張圖片到Server上進行處理,圖片的內(nèi)容已經(jīng)在消息包里面了,格式是Bytes,這種時候,如果調(diào)用imread,就需要先把消息流存為本地文件,然后根據(jù)文件名調(diào)用imread函數(shù),有種脫褲子放屁的感覺,而且性能肯定受影響。
研究了好久,包括PIL.Image.frombytes函數(shù)等,最后找到個比較好的解決方法。
使用StringIO/BytesIO。
介紹一下,Python在內(nèi)存中讀寫數(shù)據(jù),用到的模塊是StringIO和BytesIO。StringIO操作的是string,BytesIO操作的二進制數(shù)據(jù)。 如果你需要對獲取到的數(shù)據(jù)進行操作,但是你并不想把數(shù)據(jù)寫到本地硬盤上,這時候你就可以用stringIO。
from PIL import Image
from io import BytesIO
image_path="E:/Python/a.png"
def read_file( path ):
with open( path, "rb+" ) as f:
stream = f.read()
return stream
stream = read_file( image_path )
image=Image.open(BytesIO(stream))
print( image )