Addded README
Code cleanup
This commit is contained in:
109
lib/rfb_bitmap.py
Normal file
109
lib/rfb_bitmap.py
Normal file
@@ -0,0 +1,109 @@
|
||||
import numpy as np
|
||||
from PIL import Image, ImageChops, ImageDraw, ImagePalette
|
||||
from lib import bgr233_palette
|
||||
|
||||
__all__ = ['RfbBitmap']
|
||||
|
||||
class RfbBitmap():
|
||||
|
||||
def __init__(self):
|
||||
self.bpp = None
|
||||
self.depth = None
|
||||
self.truecolor = None
|
||||
self.primaryOrder = 'rgb'
|
||||
self.dither = False
|
||||
self.red_shift = None
|
||||
self.green_shift = None
|
||||
self.blue_shift = None
|
||||
|
||||
def __quantizetopalette(self, silf, palette, dither=False):
|
||||
"""Converts an RGB or L mode image to use a given P image's palette."""
|
||||
silf.load()
|
||||
|
||||
# use palette from reference image
|
||||
palette.load()
|
||||
if palette.mode != "P":
|
||||
raise ValueError("bad mode for palette image")
|
||||
if silf.mode != "RGB" and silf.mode != "L":
|
||||
raise ValueError(
|
||||
"only RGB or L mode images can be quantized to a palette"
|
||||
)
|
||||
im = silf.im.convert("P", 1 if dither else 0, palette.im)
|
||||
# the 0 above means turn OFF dithering
|
||||
|
||||
# Later versions of Pillow (4.x) rename _makeself to _new
|
||||
try:
|
||||
return silf._new(im)
|
||||
except AttributeError:
|
||||
return silf._makeself(im)
|
||||
|
||||
|
||||
def get_bitmap(self, rectangle):
|
||||
if self.bpp == 32:
|
||||
redBits = 8
|
||||
greenBits = 8
|
||||
blueBits = 8
|
||||
|
||||
# image array
|
||||
a = np.asarray(rectangle).copy()
|
||||
|
||||
redMask = ((1 << redBits) - 1) << self.red_shift
|
||||
greenMask = ((1 << greenBits) - 1) << self.green_shift
|
||||
blueMask = ((1 << blueBits) - 1) << self.blue_shift
|
||||
a[..., 0] = ( a[..., 0] ) & redMask >> self.red_shift
|
||||
a[..., 1] = ( a[..., 1] ) & greenMask >> self.green_shift
|
||||
a[..., 2] = ( a[..., 2] ) & blueMask >> self.blue_shift
|
||||
|
||||
image = Image.fromarray(a)
|
||||
if self.primaryOrder == "rgb":
|
||||
(b, g, r) = image.split()
|
||||
image = Image.merge("RGB", (r, g, b))
|
||||
del b,g,r
|
||||
image = image.convert("RGBX")
|
||||
return image
|
||||
|
||||
elif self.bpp == 16: #BGR565
|
||||
greenBits = 5
|
||||
blueBits = 6
|
||||
redBits = 5
|
||||
image = rectangle
|
||||
|
||||
if self.primaryOrder == "bgr": # FIXME: does not work
|
||||
(b, g, r) = image.split()
|
||||
image = Image.merge("RGB", (r, g, b))
|
||||
|
||||
if self.depth == 16:
|
||||
image = image.convert('BGR;16')
|
||||
if self.depth == 15:
|
||||
image = image.convert('BGR;15')
|
||||
|
||||
return image
|
||||
|
||||
elif self.bpp == 8: #bgr233
|
||||
redBits = 3
|
||||
greenBits = 3
|
||||
blueBits = 2
|
||||
image = rectangle
|
||||
|
||||
palette = bgr233_palette.palette
|
||||
if self.primaryOrder == "rgb":
|
||||
#(b, g, r) = image.split()
|
||||
#image = Image.merge("RGB", (r, g, b))
|
||||
|
||||
palette = np.reshape(palette, (-3,3))
|
||||
palette[:,[0, 2]] = palette[:,[2, 0]]
|
||||
palette = palette.flatten()
|
||||
palette = list(palette)
|
||||
|
||||
p = Image.new('P',(16,16))
|
||||
p.putpalette(palette)
|
||||
|
||||
image = self.__quantizetopalette(image, p, dither=self.dither)
|
||||
|
||||
#image = image.convert('RGB', colors=4).quantize(palette=p)
|
||||
#log.debug(image)
|
||||
return image
|
||||
|
||||
else:
|
||||
# unsupported BPP
|
||||
return None
|
||||
Reference in New Issue
Block a user