10.2. Pillanatkép visszaadása¶
Egy állapot-végpont rendben van, de a kamera létezésének oka a lencse. Adj hozzá egy végpontot, amely visszaadja annak a JPEG-jét, amit az érzékelő éppen most néz.
import csi
from microdot import Response
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)
@app.get('/snapshot.jpg')
async def snapshot(request):
img = csi0.snapshot().compress(quality=85)
return Response(
body=img.bytearray(),
headers={'Content-Type': 'image/jpeg'},
)
Nyisd meg a http://<cam-ip>/snapshot.jpg címet egy böngészőből, és az aktuális nézet egy JPEG-je tölti ki a fület. Frissíts, és kapsz egy frisset.
10.2.1. A Response objektum¶
Egy dict-et visszaadó kezelő esetében a microdot elvégzi a többit. A JPEG-bájtoknak a hosszabb formára van szükségük: egy explicit módon létrehozott microdot.Response objektumra. A body argumentum bármilyen bájt-szerű értéket elfogad – a kamera image.Image puffere a bytearray() metóduson keresztül van kitéve, így ugyanaz a puffer, amelybe az érzékelő írt, közvetlenül a socketbe kerül.
A Content-Type: image/jpeg az, ami megmondja a böngészőnek, hogy a törzset képként jelenítse meg. Nélküle a böngésző megpróbálná a JPEG-bájtokat szövegként megjeleníteni, és egy képernyőnyi szemetet látnál.
image.Image.compress() helyben futtatja a JPEG-kódolást a meglévő képpufferen, és ugyanazt a képet adja vissza (immár JPEG-formátumban), így a bájtjai változatlanul elküldhetők. A quality=85 a szokásos alapérték – elég magas ahhoz, hogy a kép éles legyen, és elég alacsony ahhoz, hogy a fájl elférjen egy lassú kapcsolaton.
10.2.2. A rögzítés blokkolja a ciklust¶
csi.CSI.snapshot() megvárja, amíg az érzékelő befejezi egy képkocka exponálását és DMA-zását, mielőtt visszatérne. Egy async kezelőn belül ez azt jelenti, hogy az eseményhurok az expozíció idejére megakad – tíz, húsz, ötven ezredmásodpercre a megvilágítástól függően. Ha egyetlen kliens egyszerre egy útvonalat kér, ez láthatatlan; több kliens esetén, vagy egy mellette futó rögzítő korutin esetén minden mást blokkolna.
snapshot() egy nem blokkoló változata is létezik a több korutinos esetre (a blocking=False a következő kész képkockát vagy a None értéket adja vissza). Kérésenként egy pillanatkép esetén az alapértelmezett blokkoló hívás megfelelő.
A tulajdonos most már megbökhet egy URL-t, és kaphat egy friss képkockát.