python圖片數(shù)據(jù)類型的區(qū)別 + 轉換

一、常用圖片庫:
opencv、PIL

二、圖片的數(shù)據(jù)類型
1.rgb或bgr byte array是一個可變的序列,每個元素的值的取值范圍是[0, 255]
<class 'numpy.ndarray'>
2.二進制流
<class 'bytes'>
3.BytesIO對象
<class '_io.BytesIO'>
6.pil image
<class 'PIL.JpegImagePlugin.JpegImageFile'>

三、之間的轉換關系

  1. BytesIO對象 <-> 二進制

    • 二進制 -> BytesIO對象
      BytesIO對象 = io.BytesIO(二進制)
    • BytesIO對象 -> 二進制
      二進制 = BytesIO對象.getvalue()
  2. BytesIO對象 <-> np序列

    • BytesIO對象 -> np序列
      np序列 = cv2.imdecode(np.frombuffer(BytesIO對象.getvalue(), np.uint8), 1)
    • np序列 -> BytesIO對象
      is_success, buffer = cv2.imencode(".jpg", np序列)
      BytesIO對象 = io.BytesIO(buffer)
  3. 二進制 <-> np序列

    • 二進制 -> np序列
      np序列 = cv2.imdecode(np.frombuffer(二進制, np.uint8), 1)
    • np序列 -> 二進制
      二進制 = np序列.tobytes()
  4. PIL <-> rgb序列

    • np序列->PIL
      PIL_image = Image.fromarray(np序列)
    • PIL -> np序列
      np序列 = numpy.array(PIL_image)
  5. PIL <-> BytesIO對象

    • BytesIO對象 -> PIL
      PIL_image = Image.open(BytesIO對象)
    • PIL -> BytesIO對象
      b = io.BytesIO()
      PIL_image.save(b, format='JPEG')
      b: BytesIO對象
  6. PIL <-> 二進制

    • PIL -> 二進制
      b = io.BytesIO()
      PIL_image.save(b, format='JPEG')
      b.getValue()

    • 二進制 -> PIL
      b = io.BytesIO(二進制)
      PIL = Image.open(b)

  7. bgr和rgb的array轉換
    RGB序列 = cv2.cvtColor(BGR序列,cv2.COLOR_BGR2RGB)

四、圖片可能出現(xiàn)的場景

with open(img_url, 'rb') as f:
  a = f.read()

a:二進制

b = io.BytesIO(a) 

b:BytesIO對象

import io
from PIL import Image
img = Image.open(a)
img.save("out.jpg")

a:BytesIO對象
img:PIL圖片對象

import cv2
img = cv2.imread("/Users/tezign/Downloads/cat.jpg", 1)
cv2.imwrite("out.jpg", img)

img:
<class 'numpy.ndarray'>

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容