10.2. Mengembalikan snapshot

Endpoint status sudah baik, tetapi alasan kamera ada adalah lensanya. Tambahkan endpoint yang mengembalikan JPEG dari apa pun yang sedang dilihat sensor saat ini.

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

Buka http://<cam-ip>/snapshot.jpg dari browser dan JPEG dari tampilan saat ini akan mengisi tab. Refresh dan Anda mendapat snapshot baru.

10.2.1. Objek Response

Handler yang mengembalikan dict membiarkan microdot melakukan sisanya. Byte JPEG memerlukan bentuk panjang: microdot.Response yang dibuat secara eksplisit. Argumen body menerima nilai apa pun yang menyerupai bytes -- buffer image.Image kamera diekspos melalui bytearray(), sehingga buffer yang sama yang ditulis sensor langsung dikirim ke soket.

Content-Type: image/jpeg adalah yang memberi tahu browser untuk me-render body sebagai citra. Tanpanya browser akan mencoba menampilkan byte JPEG sebagai teks dan Anda akan melihat layar penuh karakter acak.

image.Image.compress() menjalankan enkoding JPEG pada buffer citra yang ada di tempat dan mengembalikan citra yang sama (sekarang berformat JPEG) sehingga byte-nya dapat dikirim apa adanya. quality=85 adalah default yang umum -- cukup tinggi agar gambar tajam, cukup rendah agar file muat melalui koneksi yang lambat.

10.2.2. Capture memblokir loop

csi.CSI.snapshot() menunggu sensor selesai melakukan eksposur dan DMA satu bingkai sebelum mengembalikan hasil. Di dalam async handler, ini berarti event loop berhenti selama durasi eksposur -- sepuluh, dua puluh, lima puluh milidetik tergantung pencahayaan. Dengan satu klien meminta satu rute sekaligus ini tidak terlihat; dengan beberapa klien, atau coroutine capture yang berjalan berdampingan, ini akan memblokir semua hal lainnya.

Varian non-blocking dari snapshot() tersedia untuk kasus multi-coroutine (blocking=False mengembalikan bingkai siap berikutnya atau None). Untuk satu snapshot per permintaan, panggilan blocking default sudah cukup.

Pemilik sekarang dapat membuka URL dan mendapatkan bingkai segar.