23 lines
622 B
Python
23 lines
622 B
Python
from __future__ import annotations
|
||
|
||
import io
|
||
|
||
import numpy as np
|
||
from PIL import Image
|
||
|
||
|
||
def depth_to_png16_bytes(depth: np.ndarray) -> bytes:
|
||
depth = np.asarray(depth, dtype=np.float32)
|
||
dmin = float(depth.min())
|
||
dmax = float(depth.max())
|
||
if dmax > dmin:
|
||
norm = (depth - dmin) / (dmax - dmin)
|
||
else:
|
||
norm = np.zeros_like(depth, dtype=np.float32)
|
||
# 前后端约定:最远=255,最近=0(8-bit)
|
||
u8 = ((1.0 - norm) * 255.0).clip(0, 255).astype(np.uint8)
|
||
img = Image.fromarray(u8, mode="L")
|
||
buf = io.BytesIO()
|
||
img.save(buf, format="PNG")
|
||
return buf.getvalue()
|