Performance LCD Display

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
py_lo
User
Beiträge: 60
Registriert: Freitag 20. März 2009, 09:12

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
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``?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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])
Das Leben ist wie ein Tennisball.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

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
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
py_lo
User
Beiträge: 60
Registriert: Freitag 20. März 2009, 09:12

@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.
py_lo
User
Beiträge: 60
Registriert: Freitag 20. März 2009, 09:12

Yo, dann sind wir schonmal ca. 5 x schneller. Dankeschöön. :D
Antworten