framebuf --- التعامل مع مخزن الإطارات¶
توفر الوحدة framebuf مخزن بكسلات صغيراً وخالياً من التخصيص مع عمليات رسم بدائية. وهي مخصصة لتشغيل الشاشات الخارجية (شاشات OLED و LCD والورق الإلكتروني، إلخ).
ملاحظة
للعمل على معالجة الصور على الإطارات الملتقطة، استخدم بدلاً من ذلك الفئة image.Image الأكثر ثراءً في OpenMV -- فهي تقدّم بدائيات رسم وتحويلات ألوان وميزات تحليل أكثر بكثير من framebuf.
class FrameBuffer¶
A FrameBuffer wraps a user-supplied buffer-protocol object
(typically a bytearray) and exposes methods to draw pixels,
lines, rectangles, ellipses, polygons, text and other FrameBuffers into it.
مثال:
import framebuf
# FrameBuffer needs 2 bytes for every RGB565 pixel.
fbuf = framebuf.FrameBuffer(bytearray(100 * 10 * 2), 100, 10, framebuf.RGB565)
fbuf.fill(0)
fbuf.text("MicroPython!", 0, 0, 0xffff)
fbuf.hline(0, 9, 96, 0xffff)
المُنشئات¶
- class framebuf.FrameBuffer(buffer: Any, width: int, height: int, format: int, stride: int | None = None, /)¶
إنشاء كائن
FrameBuffer.buffer-- أي كائن يدعم بروتوكول المخزن المؤقت؛ يجب أن يكون كبيراً بما يكفي لاستيعابstride * heightبكسلاً بالتنسيقformatالمختار.width-- عرض مخزن الإطارات بالبكسل.height-- ارتفاع مخزن الإطارات بالبكسل.format-- تنسيق البكسل؛ أحد الثوابت المدرجة تحت الثوابت أدناه. يحدد التنسيق كلاً من حجم كل بكسل فيbufferوكيفية تفسير عدد صحيح للونcيُمرّر إلى أي طريقة رسم.stride-- عدد البكسلات لكل صف أفقي، بما في ذلك أي حشو. الافتراضي هوwidth. اضبط هذا لاستخدام منطقة فرعية من مخزن مؤقت أكبر.
تمرير
bufferصغير جداً، أو أبعاد غير صالحة، سينتج عنه نتائج غير محددة -- لا يتحقق المُنشئ من كل تركيبة.
طرق الرسم¶
- FrameBuffer.fill_rect(x: int, y: int, w: int, h: int, c: int) None¶
ملء مستطيل
wxhعند(x, y)باللونc. مكافئ لـrect()معf=True.
- FrameBuffer.pixel(x: int, y: int, c: int | None = None) int | None¶
بدون وسيطة
c، تُرجع قيمة لون البكسل عند(x, y). مع إعطاءc، تضبط ذلك البكسل على اللونc.
- FrameBuffer.hline(x: int, y: int, w: int, c: int) None¶
- FrameBuffer.vline(x: int, y: int, h: int, c: int) None¶
- FrameBuffer.line(x1: int, y1: int, x2: int, y2: int, c: int) None¶
رسم خط بسمك بكسل واحد باللون
c. ترسمhline()وvline()خطاً أفقياً/عمودياً بالطول المعطى؛ وترسمline()خطاً بين نقطتين اعتباطيتين.
- FrameBuffer.rect(x: int, y: int, w: int, h: int, c: int, f: bool = False) None¶
رسم مستطيل عند
(x, y)بحجمwxhباللونc. إذا كانتfتساويTrueيُملأ المستطيل؛ وإلا يُرسم مخطط خارجي بسمك بكسل واحد فقط.
- FrameBuffer.ellipse(x: int, y: int, xr: int, yr: int, c: int, f: bool = False, m: int = 0) None¶
رسم شكل بيضاوي مركّز على
(x, y)بنصف قطر أفقيxrونصف قطر عموديyrباللونc. نصفا القطر المتساويان ينتجان دائرة.f=Trueتملأ الشكل بدلاً من رسم مخططه فقط.
mهو قناع بتات يقيّد الرسم على أرباع محددة (مرقّمة عكس اتجاه عقارب الساعة بدءاً من أعلى اليمين):البت
الربع
المنطقة
البت 0
Q1
أعلى اليمين
البت 1
Q2
أعلى اليسار
البت 2
Q3
أسفل اليسار
البت 3
Q4
أسفل اليمين
القيمة الافتراضية
m=0ترسم جميع الأرباع الأربعة.
- FrameBuffer.poly(x: int, y: int, coords: Any, c: int, f: bool = False) None¶
رسم مضلع مغلق اعتباطي (محدّب أو مقعّر) عند الإزاحة
(x, y)باللونc. يجب أن تكونcoordsعبارة عنarrayمن الأعداد الصحيحة الموقّعة ذات 16 بت موزّعة كـarray('h', [x0, y0, x1, y1, ..., xn, yn]).f=Trueتملأ المضلع بدلاً من رسم مخططه فقط.
- FrameBuffer.text(s: str, x: int, y: int, c: int = 1) None¶
رسم السلسلة النصية
sبحيث تكون زاويتها العلوية اليسرى عند(x, y)باللونc. الخط المدمج ثابت عند 8x8 بكسل ولا يمكن تغييره. القيمة الافتراضية لـcهي1.
- FrameBuffer.scroll(xstep: int, ystep: int) None¶
إزاحة محتويات المخزن المؤقت بمقدار
(xstep, ystep). البكسلات المُزاحة من خارج المخزن المؤقت لا تُمسح، لذا قد يبقى "طيف" من المحتويات السابقة عند الحافة الخلفية.
- FrameBuffer.blit(fbuf: FrameBuffer | Tuple, x: int, y: int, key: int = -1, palette: FrameBuffer | None = None) None¶
رسم مخزن إطارات آخر
fbufفوق هذا المخزن بحيث تكون زاويته العلوية اليسرى عند(x, y).إذا أُعطيت
key، يُعامل أي بكسل مصدر يطابق قيمة ذلك اللون على أنه شفاف ولا يُرسم. عندما يُوفّرpalette، تُجرى المقارنة مقابل خرج اللوحة، وليس قيمةfbufالأولية.يمكن أن تكون
fbufنسخةFrameBufferأو صفاً/قائمة تطابق توقيع المُنشئ:(buffer, width, height, format) (buffer, width, height, format, stride)
عندما يكون المصدر صفاً/قائمة، قد يكون
bufferللقراءة فقط.تتيح
paletteالنقل البتّي (blitting) بين مخازن مؤقتة بتنسيقات مختلفة -- على سبيل المثال، عرض حرف أحادي اللون في مخزن مؤقت بتنسيق RGB565. وهي عبارة عنFrameBufferيطابق تنسيقها الوجهة، بارتفاع 1 وعرض يساوي عدد ألوان المصدر (2**Nلمصدر بـ N بت لكل بكسل). تُستبدل قيمة بكسل المصدرiباللون عندpalette[i, 0]قبل الرسم.
الثوابت¶
قيم format التالية مقبولة من قبل المُنشئ. عمود "البايتات لكل بكسل" هو المضاعف اللازم عند تحديد حجم المخزن المؤقت الداعم.
الثابت |
بايت/بكسل |
تخطيط البكسل |
|---|---|---|
|
0.125 |
أحادي اللون (1 بت). يحمل كل بايت 8 بكسلات مكدّسة عمودياً مع البت 0 الأقرب إلى الأعلى. تتقدم صفوف الـ 8 بكسلات من اليسار إلى اليمين عبر المخزن المؤقت، ثم تلتف إلى صف الـ 8 بكسلات التالي. |
|
0.125 |
أحادي اللون (1 بت). يحمل كل بايت 8 بكسلات أفقية مع البت 7 في أقصى اليسار. تتقدم الصفوف بكسلاً واحداً في كل مرة عمودياً. |
|
0.125 |
أحادي اللون (1 بت). مثل |
|
0.25 |
تدرج رمادي بـ 2 بت (4 مستويات)، مُحزّم أفقياً بالبت الأكثر أهمية أولاً. |
|
0.5 |
تدرج رمادي بـ 4 بت (16 مستوى)، مُحزّم أفقياً بالنبلة الأكثر أهمية أولاً. |
|
1 |
تدرج رمادي بـ 8 بت (256 مستوى). |
|
2 |
RGB بـ 16 بت مع 5 بتات حمراء و 6 خضراء و 5 زرقاء. |
framebuf.MVLSB هو اسم مستعار مهجور لـ framebuf.MONO_VLSB؛ يُفضّل الأخير في الكود الجديد.
المُنشئ القديم¶
- framebuf.FrameBuffer1(buffer: Any, width: int, height: int, stride: int | None = None, /) FrameBuffer¶
اختصار مهجور لـ
FrameBuffer(buffer, width, height, framebuf.MONO_VLSB, stride). مُحتفظ به للتوافق مع الإصدارات السابقة؛ استخدم المُنشئ الكاملFrameBufferبدلاً من ذلك.