Added experimental image renderer
This commit is contained in:
parent
60454e7e94
commit
13269052b3
83
modules/inkycal_image.py
Normal file
83
modules/inkycal_image.py
Normal file
@ -0,0 +1,83 @@
|
||||
#!/usr/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Experimental image module for Inky-Calendar software
|
||||
Displays an image on the E-Paper. Currently only supports black and white
|
||||
Copyright by aceisace
|
||||
"""
|
||||
from __future__ import print_function
|
||||
from PIL import Image
|
||||
from configuration import *
|
||||
import os
|
||||
|
||||
import inkycal_drivers as drivers
|
||||
|
||||
display = drivers.EPD()
|
||||
|
||||
# Where is the image?
|
||||
path = '/home/pi//Desktop/test.JPG'
|
||||
|
||||
class inkycal_image:
|
||||
|
||||
def __init__(self, path):
|
||||
self.image = Image.open(path)
|
||||
self.im_width = self.image.width
|
||||
self.im_height = self.image.height
|
||||
|
||||
def check_mode(self):
|
||||
if self.image.mode != 'RGB' or 'L' or '1':
|
||||
print('Image mode not supported, converting')
|
||||
self.image = self.image.convert('RGB')
|
||||
|
||||
def preview(self):
|
||||
self.image.save(path+'temp.png')
|
||||
os.system("gpicview "+path+'temp.png')
|
||||
os.system('rm '+path+'temp.png')
|
||||
|
||||
|
||||
def check_size(self, alignment = 'middle', padding_colour='white'):
|
||||
if display_height < self.im_height or display_width < self.im_width:
|
||||
print('Image too large for the display, cropping image')
|
||||
if alignment == 'middle' or None:
|
||||
x1 = int((self.im_width - display_width) / 2)
|
||||
y1 = int((self.im_height - display_height) / 2)
|
||||
x2,y2 = x1+display_width, y1+display_height
|
||||
self.image = self.image.crop((x1,y1,x2,y2))
|
||||
|
||||
if alignment != 'middle' or None:
|
||||
print('Sorry, this feature has not been implemented yet')
|
||||
raise NotImplementedError
|
||||
|
||||
elif display_height > self.im_height and display_width > self.im_width:
|
||||
print('Image smaller than display, shifting image to center')
|
||||
x = int( (display_width - self.im_width) /2)
|
||||
y = int( (display_height - self.im_height) /2)
|
||||
canvas = Image.new('RGB', (display_width, display_height), color=padding_colour)
|
||||
canvas.paste(self.image, (x,y))
|
||||
self.image = canvas
|
||||
|
||||
else:
|
||||
print('Image file exact. no further action required')
|
||||
|
||||
def auto_flip(self):
|
||||
if self.im_height < self.im_width:
|
||||
print('rotating image')
|
||||
self.image = self.image.rotate(270, expand=True)
|
||||
self.im_width = self.image.width
|
||||
self.im_height = self.image.height
|
||||
|
||||
|
||||
def to_mono(self):
|
||||
self.image = self.image.convert('1', dither=True)
|
||||
|
||||
def prepare_image(self, alignment='middle'):
|
||||
self.check_mode()
|
||||
self.auto_flip()
|
||||
self.check_size(alignment = alignment)
|
||||
self.to_mono()
|
||||
|
||||
return self.image
|
||||
|
||||
#single line command:
|
||||
display.show_image(inkycal_image(path).prepare_image(), reduce_colours=False)
|
||||
|
Loading…
Reference in New Issue
Block a user