لسلام عليكم
هذا class خفيف لتوليد صور الـbmp 24 بت بأقل من ثلاثين سطر باستخدام بايثون:
import struct
class Bmp(object):
def __init__(self, width, height, red=255, green=255, blue=255):
self._pixel = [[self._encode_rgb(red, green, blue)] * width for i in range(height)]
header_size = 54 + (width * 3 + (width & 3)) * height
self._header = 'BM' + struct.pack('<III', header_size, 0, 54)
self._info = struct.pack('<IIIHH', 40, width, height, 1, 24) + '\0\0\0\0' * 6
def _encode_rgb(self, red, green, blue):
return (red & 0xff) << 16 | (green & 0xff) << 8 | blue & 0xff
def _decode_rgb(self, color):
return (color & 0xff, (color >> 8) & 0xff, (color >> 16) & 0xff)
def set_pixel(self, x, y, red, green, blue):
self._pixel[y][x] = self._encode_rgb(red, green, blue)
def get_pixel(self, x, y):
return self._decode_rgb(self._pixel[y][x])
def write_file(self, filename):
with open(filename, 'wb') as bmp:
bmp.write(self._header)
bmp.write(self._info)
for row in self._pixel[::-1]:
bmp.write(''.join(struct.pack('3B', *self._decode_rgb(p)) for p in row))
bmp.write('\0' * (len(self._pixel[0]) & 3))طريقة الإستخدام بسيطة:
__init__(self, width, height, red=255, green=255, blue=255)
البناء، يستقبل 5 متغيرات:
width : عرض الصورة في البكسل.
height : ارتفاع الصورة في البكسل.
لون خلفية الصورة بنظام الـRGB، اللون الأحمر red (افتراضياً 255)، الأخضر green (افتراضياً 255)، الأزرق blue (افتراضياً 255).
get_pixel(self, x, y)
الحصول على لون بكسل معين:
x : الإحداثي السيني، يبدأ من صفر وينتهي بعرض الصورة - 1.
y : الإحداثي الصادي، يبدأ من صفر وينتهي بإرتفاع الصورة - 1.
set_pixel(self, x, y, red, green, blue)
تحديد لون بكسل معين:
x : الإحداثي السيني.
y : الإحداثي الصادي.
اللون، أحمر red أحضر green أزرق blue.
write_file(self, filename)
لكتابة الصورة لملف:
filename: اسم الملف.
أمثلة، إنشاء صورة فارغة أبعادها 100×100 وبلون أزرق غامق:
bmp = Bmp(100, 100, 36, 73, 126)bmp.write_file('out.bmp')النتيجة:
إنشاء صورة فارغة 100×100 بالخلفية الإفتراضية، أبيض وإعطاء لون عشوائي لكل بكسل:
from random import randrange
bmp = Bmp(100, 100)
for x in range(100):
for y in range(100):
bmp.set_pixel(x, y, randrange(256), randrange(256), randrange(256))
bmp.write_file('out.bmp')
رسم خط من النقطة (0،0) إلى (100،100):
bmp = Bmp(100, 100, 50, 50, 50)
x1, y1 = 0, 0
x2, y2 = 99, 99
deltax = x2 - x1
deltay = y2 - y1
p = 2 * deltay - deltax
for x in xrange(x1, x2):
if p >= 0:
y1 += 1
bmp.set_pixel(x, y1, 255, 255, 255)
p = p + 2 * deltay - 2 * deltax
else:
bmp.set_pixel(x, y1, 255, 255, 255)
p = p + 2 * deltay
bmp.write_file('out.bmp')بالتوفيق


