10.2. Vraćanje snimke

Krajnja točka za status je u redu, ali razlog zbog kojeg kamera postoji jest objektiv. Dodajte krajnju točku koja vraća JPEG onoga što senzor upravo gleda.

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'},
    )

Otvorite http://<cam-ip>/snapshot.jpg iz preglednika i JPEG trenutnog pogleda ispunit će karticu. Osvježite i dobit ćete nov.

10.2.1. Objekt Response

Rukovatelj koji vraća rječnik prepušta sve ostalo microdotu. JPEG bajtovi trebaju dulji oblik: microdot.Response konstruiran eksplicitno. Argument body prima bilo koju vrijednost nalik bajtovima – međuspremnik image.Image kamere izložen je putem bytearray(), pa isti međuspremnik u koji je senzor upisao ide ravno u utičnicu.

Content-Type: image/jpeg govori pregledniku da tijelo prikaže kao sliku. Bez toga bi preglednik pokušao prikazati JPEG bajtove kao tekst i vidjeli biste pun zaslon smeća.

image.Image.compress() izvodi JPEG kodiranje na postojećem međuspremniku slike na mjestu i vraća istu sliku (sada u JPEG formatu) tako da se njezini bajtovi mogu poslati takvi kakvi jesu. quality=85 uobičajena je zadana vrijednost – dovoljno visoka da je slika oštra, dovoljno niska da datoteka prođe kroz sporu vezu.

10.2.2. Snimanje blokira petlju

csi.CSI.snapshot() čeka da senzor završi ekspoziciju i DMA prijenos sličice prije nego što se vrati. Unutar asinkronog rukovatelja to znači da se petlja događaja zaustavlja za vrijeme trajanja ekspozicije – deset, dvadeset, pedeset milisekundi ovisno o osvjetljenju. Kada jedan klijent traži jednu rutu odjednom, to je nevidljivo; s više klijenata ili korutinom za snimanje koja se izvodi usporedno, blokiralo bi sve ostalo.

Postoji neblokirajuća varijanta metode snapshot() za slučaj s više korutina (blocking=False vraća sljedeću spremnu sličicu ili None). Za jednu snimku po zahtjevu, zadani blokirajući poziv je u redu.

Vlasnik sada može otvoriti URL i dobiti svježu sličicu.