class ImageIO -- كائن ImageIO

تسجّل فئة ImageIO وتعيد تشغيل تدفقات من إطارات Image بصيغة OpenMV الأصلية على القرص. يمكن أن يحتوي التدفق الواحد على إطارات غير متجانسة (بصيغ بكسل / أحجام مختلفة) كما يسجّل الفاصل الزمني بين كل إطار وآخر بحيث تعيد عملية التشغيل إنشاء معدل الإطارات الأصلي.

يوجد نوعان من مخازن الدعم:

  • تدفق الملف -- تُقرأ الإطارات من ملف في نظام الملفات أو تُلحق به. يبدأ الملف بترويسة سحرية بطول 16 بايت OMV IMG STR Vx.y يليها أجزاء لكل إطار. يُصدر الكاتب الحالي V2.0؛ وما زالت الملفات الأقدم V1.0 و V1.1 قابلة للقراءة.

  • تدفق الذاكرة -- تُقرأ الإطارات من مخزن RAM ثابت الحجم مخصص وقت الإنشاء أو تُكتب إليه. مفيد لتمرير الإطارات ذهابًا وإيابًا عبر مرشحات تحتاج إلى تسجيل دون لمس نظام الملفات.

class image.ImageIO(path: str | Tuple[int, int, int], mode: str | int)

إنشاء تدفق ImageIO.

إذا كان path عبارة عن سلسلة نصية، فيُفتح تدفق ملف عند ذلك المسار. يجب أن يكون mode واحدًا من:

  • 'r' -- فتح ملف موجود للقراءة. يتم التحقق من الترويسة السحرية وتُسجَّل النسخة (V1.0 / V1.1 / V2.0) لاستخدامها بواسطة version().

  • 'w' -- اقتطاع / إنشاء الملف وكتابة ترويسة سحرية جديدة V2.0. تُلحق الإطارات عند كل عملية write().

إذا كان path عبارة عن صفّ ثلاثي (w, h, pixformat)، فيُخصص تدفق ذاكرة. عندئذ يكون mode هو عدد فتحات الإطارات الصحيح المراد تخصيصه مسبقًا. يُحدد حجم المخزن المؤقت لاستيعاب count من الإطارات بأبعاد (w, h, pixformat) ولا يُسمح له بالنمو بعد الإنشاء. pixformat هو واحد من image.BINARY أو image.GRAYSCALE أو image.RGB565 أو image.BAYER أو image.YUV422 أو image.JPEG أو image.PNG. بالنسبة للصيغ المضغوطة (image.JPEG و image.PNG) يُقدَّر حجم كل فتحة بـ 2 bpp؛ والإطارات الأكبر من التقدير ترفع ValueError وقت write().

الفحص

type() int

إعادة مخزن الدعم للتدفق: FILE_STREAM لتدفق الملف، و MEMORY_STREAM لتدفق الذاكرة.

is_closed() bool

إعادة True إذا تم استدعاء close() على هذا الكائن. بمجرد إغلاقه يرفع التدفق OSError("Stream closed") عند أي عملية قراءة/كتابة/سعي إضافية.

count() int

إعادة عدد الإطارات المخزنة حاليًا في التدفق. بالنسبة لتدفقات الملفات ينمو هذا العدد كلما ألحقت write() إطارات؛ أما بالنسبة لتدفقات الذاكرة فيكون ثابتًا منذ وقت الإنشاء.

offset() int

إعادة فهرس الإطار الحالي. يُزاد بواسطة read() و write()، ويُعاد ضبطه بواسطة seek().

version() int | None

إعادة نسخة صيغة التخزين على القرص لتدفقات الملفات (10 لـ V1.0 و 11 لـ V1.1 و 20 لـ V2.0). تعيد None لتدفقات الذاكرة.

buffer_size() int | None

إعادة حجم مخزن بكسلات كل فتحة بالبايت لتدفقات الذاكرة (حجم الفتحة مطروحًا منه ترويسة المسك الداخلية لـ Image). تعيد None لتدفقات الملفات. استخدم هذا مع count() للتحقق مما إذا كان حجم إطار معين سيُستوعب.

size() int

إعادة إجمالي البايتات التي يستهلكها التدفق -- وهو حجم الملف على القرص لتدفقات الملفات، أو حجم مخزن RAM الكامل (count * per_slot_size بما في ذلك ترويسة كل فتحة) لتدفقات الذاكرة.

الإدخال/الإخراج

write(img: Image) ImageIO

إلحاق (تدفق الملف) أو التخزين عند الإزاحة (تدفق الذاكرة) لـ img وتقديم offset() بمقدار واحد.

بالنسبة لتدفقات الملفات ينمو الملف كلما أُلحقت الإطارات. والكتابة عند إزاحة غير نهائية تقتطع بقية الملف بحيث يمكن أن يتقلص العدد.

بالنسبة لتدفقات الذاكرة يُكتب الإطار في الفتحة الحالية؛ والكتابة بعد الفتحة الأخيرة ترفع EOFError("End of stream") وكتابة إطار أكبر من buffer_size() ترفع ValueError("Invalid frame size").

تعيد self بحيث يمكن تسلسل الاستدعاءات.

read(copy_to_fb: bool = True, *, loop: bool = True, pause: bool = True) Image | None

قراءة الإطار عند offset() الحالية، وتقديم الإزاحة، وإعادة Image الجديدة. يعكس النصف الخاص بإعادة التشغيل من write().

copy_to_fb -- عندما يكون True (افتراضي) يُوضع الإطار المفكوك في مخزن إطارات الكاميرا (في نفس المكان الذي تستقر فيه csi.CSI.snapshot())، بحيث تكون Image المعادة قابلة للرسم عبر معاينة IDE. وعندما يكون False يُخصص الإطار على كومة MicroPython بدلًا من ذلك.

loop (تدفقات الملفات فقط) -- عندما يكون True (افتراضي) فإن القراءة بعد الإطار الأخير تسعى رجوعًا إلى الإطار الأول وتستمر. وعندما يكون False يعيد الاستدعاء None بمجرد الوصول إلى نهاية الملف.

pause -- عندما يكون True (افتراضي) يحجب الاستدعاء حتى ينقضي الفاصل الزمني بين الإطارات المسجّل أصلًا، بحيث تجري إعادة التشغيل بمعدل الإطارات الأصلي للتسجيل. اضبطه على False لإعادة التشغيل بأسرع ما يمكن.

seek(offset: int) ImageIO

تحريك offset() إلى الإطار offset. يجب أن يكون offset غير سالب؛ وإزاحات تدفق الذاكرة يجب أيضًا أن تكون أقل من count().

تسير عمليات السعي في تدفقات الملفات عبر الملف إطارًا بإطار من البداية لأن أجزاء الإطارات متغيرة الحجم -- توقّع زمن O(offset) للقفزات الكبيرة.

تعيد self بحيث يمكن تسلسل الاستدعاءات.

sync() ImageIO

تفريغ عمليات الكتابة المعلّقة إلى القرص لتدفقات الملفات (يستدعي sync لنظام الملفات الأساسي). لا يفعل شيئًا لتدفقات الذاكرة.

تعيد self بحيث يمكن تسلسل الاستدعاءات.

close() None

إغلاق التدفق. يحرر المخزن المؤقت للذاكرة (تدفقات الذاكرة) أو يغلق الملف (تدفقات الملفات). بعد close() لا يمكن إعادة استخدام كائن ImageIO؛ وترفع العمليات اللاحقة OSError("Stream closed"). واستدعاء close() مرتين لا يفعل شيئًا.

يُغلق كائن ImageIO أيضًا تلقائيًا عند جمعه كنفايات (فهو يسجّل دالة إنهاء عند الإنشاء).

الثوابت

FILE_STREAM: int

القيمة المعادة بواسطة type() للتدفقات المدعومة بملف.

MEMORY_STREAM: int

القيمة المعادة بواسطة type() للتدفقات في الذاكرة.