Seite 1 von 1

Performance LCD Display

Verfasst: Freitag 25. September 2009, 21:20
von py_lo
Hallo,

ich habe ein grafik Display(132x65) und muss RGB-Werte, die mir die
Funktion image.load als Tupel liefert in einen INT im ARGB Format umwandeln.

Folgendes funktioniert zwar ist aber sicherlich von der Geschwindigkeit
her nicht optimal.
Kann mir jemand einen Tip geben was ich besser/schneller machen kann?

Code: Alles auswählen

from __future__ import division
import ctypes , sys, time, re
from PIL import Image, ImageColor, ImageDraw


color_map = { '10':'A', '11':'B', '12':'C', '13':'D', '14':'E', '15':'F' }

def get_parts(number):
  parts = re.match("^([0-9]+)\.([0-9]+)", str(number))
  return (parts.group(1), parts.group(2))

def get_hex(rgb_tuple):
  hex_string = ''
  for color in rgb_tuple:
    quotient = str(color / 16)
    first_a, first_b = get_parts(quotient)
    second_a, second_b = get_parts(float("0." + first_b) * 16)
    if color_map.has_key(first_a):
      hex_string += color_map[first_a]
    else:
      hex_string += first_a
    if color_map.has_key(second_a):
      hex_string += color_map[second_a]
    else:
      hex_string += second_a
  return hex_string


def load_pic(filename,x,y):
  image = Image.open(filename)
  pix = image.load()
  for row in xrange(image.size[1]):
        for column in xrange(image.size[0]):
                pcol = int("FF" + get_hex(pix[column,row]),16)
                libc.serdisp_setcolour(dd,column+x,row+y,pcol)
  return 1

Verfasst: Freitag 25. September 2009, 21:41
von BlackJack
@py_lo: Bitte sag das dass ein Scherz ist. Selbst wenn jemand über eine Zeichekettendarstellung gehen möchte, ist das einfach zu irre was Du da machst. :shock:

Code: Alles auswählen

def load_pic(filename, x, y):
    image = Image.open(filename)
    pixels = image.load()
    for row in xrange(image.size[1]):
        for column in xrange(image.size[0]):
            red, green, blue = pixels[column, row]
            color = ((255 << 8 | red) << 8 | green) << 8 | blue
            libc.serdisp_setcolour(dd, column + x, row + y, color)
Wo kommt `dd` her? Und was sollte das ``return 1``?

Verfasst: Freitag 25. September 2009, 21:42
von EyDu
Wenn du anfängst zwischen Zahlen und Buchstaben hin und her zu konvertieren, dann machst du etwas falsch ;-)

Code: Alles auswählen

def tuple_to_argb((r, g, b)):
    return (255 << 24) + (r << 16) + (g << 8) + b


def load_pic(filename):
    image = Image.open(filename)
    pix = image.load()
    for row in xrange(image.size[1]):
        for column in xrange(image.size[0]):
            print tuple_to_argb(pix[column,row])

Verfasst: Freitag 25. September 2009, 21:43
von b.esser-wisser
Und du hast getestet, dass image.load(...).convert('RGBA') nicht funktioniert? :twisted: (Ich weiß, dass das Wort 'RGBA' anders aussieht als 'ARGB' ...)

Falls das tatsächlich nicht geht so einfach ist, den string kann man nach dem .convert() umsortieren ...

hth, Jörg

Verfasst: Freitag 25. September 2009, 22:00
von py_lo
@BlackJack:
Uhm, war kein scherz aber JA ICH WEISS umständlich. Aber ich dachte
lieber eine langsame Lösung zeigen als gar kein Code und nur fragen wie
es geht -schließlich muss ich es ja uch mal lernen.

Das return 1 hat immo gar nichts zu bedeuten und dd ist das Display Device
oder das Handle des Displays... hatte ja nicht alles gepostet.

Code: Alles auswählen

#...schnippp....
dd = libc.serdisp_init(sdcd, dispname, "POSTOFFMODE=1")
Danke auf jeden Fall, werd erstmal testen.

Verfasst: Freitag 25. September 2009, 22:10
von py_lo
Yo, dann sind wir schonmal ca. 5 x schneller. Dankeschöön. :D