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.