Merge pull request #18 from bkosciow/image

Image
This commit is contained in:
Bartosz 2018-02-25 15:31:06 +01:00 committed by GitHub
commit 2e2b625655
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 57 additions and 37 deletions

View File

@ -1,3 +1,7 @@
0.8.3
- draw_image with filename or PIL object
0.8.2
- fix background colour in Page drawing
0.8.1 0.8.1
- clean up - clean up
0.8.0 0.8.0

View File

@ -41,9 +41,12 @@ class Chip(metaclass=abc.ABCMeta):
@color.setter @color.setter
def color(self, rgb): def color(self, rgb):
"""set (R, G, B) colour """ """set (R, G, B) colour """
self.options['color'] = { if isinstance(rgb, int):
'R': rgb[0], 'G': rgb[1], 'B': rgb[2] self.options['color'] = rgb
} else:
self.options['color'] = {
'R': rgb[0], 'G': rgb[1], 'B': rgb[2]
}
@property @property
def background_color(self): def background_color(self):
@ -53,9 +56,12 @@ class Chip(metaclass=abc.ABCMeta):
@background_color.setter @background_color.setter
def background_color(self, rgb): def background_color(self, rgb):
"""set (R, G, B) background colour """ """set (R, G, B) background colour """
self.options['background_color'] = { if isinstance(rgb, int):
'R': rgb[0], 'G': rgb[1], 'B': rgb[2] self.options['background_color'] = rgb
} else:
self.options['background_color'] = {
'R': rgb[0], 'G': rgb[1], 'B': rgb[2]
}
@property @property
def auto_flush(self): def auto_flush(self):

View File

@ -14,9 +14,10 @@ lcd_tft = ILI9325(240, 320, drv)
lcd_tft.init() lcd_tft.init()
image_file = Image.open("assets/japan_temple_240x320.jpg") # image_file = Image.open("assets/japan_temple_240x320.jpg")
lcd_tft.draw_image(0, 0, image_file) # lcd_tft.draw_image(0, 0, image_file)
numbers_image = Image.open("assets/dsp2017_101_64.png") # numbers_image = Image.open("assets/dsp2017_101_64.png")
lcd_tft.transparency_color = (0, 0, 0) lcd_tft.transparency_color = (0, 0, 0)
lcd_tft.draw_image(10, 10, numbers_image) # lcd_tft.draw_image(10, 10, numbers_image)
lcd_tft.draw_image(10, 10, "assets/dsp2017_101_64.png")

View File

@ -16,7 +16,8 @@ def test1():
print(drv.width, drv.height) print(drv.width, drv.height)
lcd = CharLCD(drv.width, drv.height, drv, 0, 0) lcd = CharLCD(drv.width, drv.height, drv, 0, 0)
lcd.init() lcd.init()
lcd.write('First') lcd.write('First Line')
lcd.write(' it is not', 0, 0)
lcd.write('HD44780', 6, 3) lcd.write('HD44780', 6, 3)
lcd.flush() lcd.flush()

View File

@ -1,6 +1,7 @@
"""Area drawing algorithm""" """Area drawing algorithm"""
import itertools import itertools
from gfxlcd.drawing.pixel import Pixel from gfxlcd.drawing.pixel import Pixel
from PIL import Image
class Area(Pixel): class Area(Pixel):
@ -103,6 +104,8 @@ class Area(Pixel):
def draw_image(self, pos_x, pos_y, image): def draw_image(self, pos_x, pos_y, image):
"""draw a PIL image""" """draw a PIL image"""
if isinstance(image, str):
image = Image.open(image)
image_file = image.convert('RGB') image_file = image.convert('RGB')
width, height = image_file.size width, height = image_file.size
self._set_area( self._set_area(

View File

@ -1,6 +1,7 @@
"""Page drawing algorithm""" """Page drawing algorithm"""
import abc import abc
from gfxlcd.drawing.pixel import Pixel from gfxlcd.drawing.pixel import Pixel
from PIL import Image
class Page(Pixel, metaclass=abc.ABCMeta): class Page(Pixel, metaclass=abc.ABCMeta):
@ -9,6 +10,8 @@ class Page(Pixel, metaclass=abc.ABCMeta):
self.driver = driver self.driver = driver
Pixel.__init__(self, driver) Pixel.__init__(self, driver)
self.buffer = [] self.buffer = []
self.options['color'] = 1
self.options['background_color'] = 0
def init(self): def init(self):
"""init page""" """init page"""
@ -17,11 +20,21 @@ class Page(Pixel, metaclass=abc.ABCMeta):
else: else:
self.buffer = [[0] * (self.width // 8) for x in range(self.height)] self.buffer = [[0] * (self.width // 8) for x in range(self.height)]
def _convert_color(self, color):
"""convert color to available one"""
if color == 0:
return 0
return 1
def draw_pixel(self, pos_x, pos_y, color=None): def draw_pixel(self, pos_x, pos_y, color=None):
"""draw a pixel at x,y""" """draw a pixel at x,y"""
if color is None: if color is None:
color = self.options['color'] color = self.options['color']
self.buffer[pos_x][pos_y//8] |= self._convert_color(color) << (pos_y % 8) if self._convert_color(color) == 1:
self.buffer[pos_x][pos_y//8] |= 1 << (pos_y % 8)
else:
self.buffer[pos_x][pos_y//8] &= ~(1 << (pos_y % 8))
self.flush() self.flush()
def draw_line(self, pos_x1, pos_y1, pos_x2, pos_y2): def draw_line(self, pos_x1, pos_y1, pos_x2, pos_y2):
@ -114,6 +127,8 @@ class Page(Pixel, metaclass=abc.ABCMeta):
def draw_image(self, pos_x, pos_y, image): def draw_image(self, pos_x, pos_y, image):
"""draw a PIL image""" """draw a PIL image"""
if isinstance(image, str):
image = Image.open(image)
image_file = image.convert('L') image_file = image.convert('L')
width, height = image_file.size width, height = image_file.size
offset_x = 0 offset_x = 0

View File

@ -35,13 +35,6 @@ class NJU6450(Page, Chip):
self.driver.cmd(0xB8 | pos_y, 1) self.driver.cmd(0xB8 | pos_y, 1)
self.driver.cmd(0x00 | (pos_x - width//2), 1) self.driver.cmd(0x00 | (pos_x - width//2), 1)
def _convert_color(self, color):
"""convert color to avaiable one"""
if color['R'] == 0 and color['G'] == 0 and color['B'] == 0:
return 0
return 1
def flush(self, force=None): def flush(self, force=None):
"""flush buffer to device """flush buffer to device
:force - boolean|None""" :force - boolean|None"""

View File

@ -22,13 +22,6 @@ class NullPage(Page, Chip):
Page.init(self) Page.init(self)
Chip.init(self) Chip.init(self)
def _convert_color(self, color):
"""convert color to avaiable one"""
if color['R'] == 0 and color['G'] == 0 and color['B'] == 0:
return 0
return 1
def flush(self, force=None): def flush(self, force=None):
"""flush buffer to device """flush buffer to device
:force - boolean|None""" :force - boolean|None"""

View File

@ -76,13 +76,6 @@ class SSD1306(Page, Chip):
self.driver.cmd(0x14) # enable charge pump self.driver.cmd(0x14) # enable charge pump
self.driver.cmd(0xaf) # turn on panel self.driver.cmd(0xaf) # turn on panel
def _convert_color(self, color):
"""convert color to avaiable one"""
if color['R'] == 0 and color['G'] == 0 and color['B'] == 0:
return 0
return 1
def flush(self, force=None): def flush(self, force=None):
"""flush buffer to device """flush buffer to device
:force - boolean|None""" :force - boolean|None"""

View File

@ -216,6 +216,17 @@ class TestPageDrawing(object):
buffer[5][1] = 8 buffer[5][1] = 8
assert_equal(self.lcd.buffer, buffer) assert_equal(self.lcd.buffer, buffer)
def test_draw_pixels_clear_then(self):
self.lcd.draw_pixel(1, 1)
self.lcd.draw_pixel(2, 1)
self.lcd.draw_pixel(2, 2)
buffer = self.get_buffer()
buffer[2][0] = 4
self.lcd.draw_pixel(1, 1, self.lcd.background_color)
self.lcd.draw_pixel(2, 1, self.lcd.background_color)
self.draw_buffer(self.lcd.buffer)
assert_equal(self.lcd.buffer, buffer)
def draw_buffer(self, buffer): def draw_buffer(self, buffer):
for page in range(2): for page in range(2):
print(page) print(page)

View File

@ -1,4 +1,4 @@
[bdist_wheel] [bdist_wheel]
universal = 1 universal = 0
[metadata] [metadata]
description-file = readme.md description-file = readme.md

View File

@ -13,7 +13,7 @@ def read(*paths):
setup( setup(
name='gfxlcd', name='gfxlcd',
version='0.8.1', version='0.8.3',
description='gfxlcd is a handler for graphical lcds: ILI9328, SSD1306, NJU6450, touch panel: AD7843 @ Raspberry Pi.', description='gfxlcd is a handler for graphical lcds: ILI9328, SSD1306, NJU6450, touch panel: AD7843 @ Raspberry Pi.',
keywords=[ keywords=[
'gfxlcd', 'raspberry pi' ,'ili9328' ,'ssd1306', 'nju6450', 'lcd', 'graphical lcd', 'touch panel', 'ad7843', 'gfxlcd', 'raspberry pi' ,'ili9328' ,'ssd1306', 'nju6450', 'lcd', 'graphical lcd', 'touch panel', 'ad7843',

2
tests3
View File

@ -1,2 +1,2 @@
chmod 644 gfxlcd/tests/*.py chmod 644 gfxlcd/tests/*.py
python3 -m nose --with-specplugin python3 -m nose --with-specplugin $1