ByteArray to IntegerList

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.
Pf@nne
User
Beiträge: 43
Registriert: Donnerstag 18. April 2013, 16:50

Hi,

das Ausgeben des image_files klappt prima.....
nur habe ich gerade erst festgestellt, dass die Pixel in einem BMP Zeilenweise von Ende nach Anfang abgelegt sind.

Gibt es eine "einfache" Möglichkeit die Daten zeilenweise rückwärts aus dem File zu lesen
und dabei noch "leere" Füllbytes auszufiltern?

So ganz nebenbei müssen dann auch noch die Farbtiefe reduziert werden (24bpp --> 16bpp).

Ich würde es hinbekommen alles Byteweise "zusammenzufriemeln", so wie ich euch und Python aber einschätze gibt es da aber bestimmt wieder einen Dreizeiler...... 8)

Danke für eure Mühe....
Pf@nne
BlackJack

@Pf@nne: Ich würde schauen ob eine Bibliothek helfen könnte beim einlesen und konvertieren. Pygame oder PIL zum Lesen. Pygame müsste man auch zum Konvertieren verwenden können. Wenn man es tatsächlich beides selber schreiben will, dann mindestens `numpy` zum Konvertieren, denn das wirklich in reinem Python-Code zu machen, könnte sich mit dem Ziel es schnell zu machen nicht so gut vertragen.

Vollkommen ungetestet:

Code: Alles auswählen

#!/usr/bin/env python
import pygame


def load_image_data(filename):
    return pygame.image.load(filename).convert(16).get_buffer().raw


def main():
    pygame.init()
    try:
        image_data = load_image_data('test.bmp')
        block_length = 0xfff
        blocks = (
            image_data[i:i + block_length]
            for i in xrange(0, len(image_data), block_length)
        )
        for block in blocks:
            print map(ord, block)
    finally:
        pygame.quit()
Pf@nne
User
Beiträge: 43
Registriert: Donnerstag 18. April 2013, 16:50

Wahnsinn.......

eine Variable direkt mit einer Schleife füllen.......
Wie verträgt sich das mit klassischen Programiersprachen, ich komme eher aus der Pascal-Ecke.....
ich hab da mal mit Turbo Pascal angefangen......
Solche kunstrukte sind schon klasse.....

Woher weiß man, dass block ein Element von blocks ist?

Läuft soweit auch ganz prima, nur sind die beiden FarbBytes im File andersherum abgelegt,
daher müsten immer zwei Bytes beim Einlesen vertauscht werden......

Ich wage garnicht zu fragen, aber hast du da auch einen "vierzeiler" parat.....
Wie gesagt, ich hab es prinzipiell am Laufen, jedoch bearbeite ich jedes Byte einzeln in Schleifen.....
Ist nicht besonders effektiv.....

http://youtu.be/2buraOvTse0

Gruß
Pf@nne
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Wahnsinn.......
eine Variable direkt mit einer Schleife füllen.......
Wenn dich das interessiert schau hier : https://docs.python.org/2/tutorial/data ... rehensions
Ich hab mich so sehr an an List Comprehension gewohnt, ich würde nicht mehr zu einer Sprache wechseln die sie nicht beherscht( oder zumindest map,filter...).
Woher weiß man, dass block ein Element von blocks ist?
Das definiert man ja so. block definiert man als die Variable die nacheinander die Elemente von blocks annimmt.
Pf@nne
User
Beiträge: 43
Registriert: Donnerstag 18. April 2013, 16:50

Das definiert man ja so. block definiert man als die Variable die nacheinander die Elemente von blocks annimmt.
Ja, jetzt sehe ich es auch......
Einfach Sachen benutzen ohne vorher bescheid zu sagen, was man nicht alles machen kann......
BlackJack

Und nochmal völlig ungetestet:

Code: Alles auswählen

from array import array

# ...

def load_image_data(filename):
    result = array('h')
    result.fromstring(pygame.image.load(filename).convert(16).get_buffer().raw)
    result.byteswap()
    return result.tostring()
Pf@nne
User
Beiträge: 43
Registriert: Donnerstag 18. April 2013, 16:50

Und nochmal.....Wahnsinn....

vielen Dank........

http://youtu.be/Tt7ayONIW18

Bist du zufällig auch am Raspberry Pi aktiv...??
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

fail hat geschrieben:Wenn dich das interessiert schau hier : https://docs.python.org/2/tutorial/data ... rehensions
Ich hab mich so sehr an an List Comprehension gewohnt, ich würde nicht mehr zu einer Sprache wechseln die sie nicht beherscht( oder zumindest map,filter...).
In diesem Fall ist es ein Generator-Ausdruck. Ein kleiner aber manchmal wichtiger Unterschied.
Das Leben ist wie ein Tennisball.
BlackJack

@Pf@nne: Kommt auf die Definition von aktiv an. Ich habe einen mit XBMC als „Fernseher” und kleinen Server laufen, und einen als Internetradiowecker und zum spielen/basteln. Wobei ich letzteres nun schon eine Weile nicht mehr gemacht habe.
Pf@nne
User
Beiträge: 43
Registriert: Donnerstag 18. April 2013, 16:50

Moin BlackJack,

ich treibe den ganzen Displayaufwand um es letztendlich als Anzeigegerät für den Raspberry zu nutzen.
Viele TFT-Controller werden von der fbtft-Library schon unterstützt, der RA8875 den ich nutze leider noch nicht.

Den RA8875 habe ich ganz gut unter Kontrolle, jetzt geht es darum den Framebuffer des Raspberry an Python zu übergeben und zur Anzeige zu bringen.......
Hast du Lust hier "ein wenig" anzuschieben......

Gruß
Pf@nne
BlackJack

@Pf@nne: Wäre es da nicht sinnvoller die fbtft-Bibliothek zu erweitern als etwas in Python zu schreiben?
Pf@nne
User
Beiträge: 43
Registriert: Donnerstag 18. April 2013, 16:50

Wäre es da nicht sinnvoller die fbtft-Bibliothek zu erweitern als etwas in Python zu schreiben?
Auf jeden Fall, die steht komplett zur Verfügung.
Ich hatte jetzt ertmal Python genutzt um die Grundfunktionen des RA8875 zu erkunden.....

Ich hatte in die fbtft schon mal reingeschaut, leider hat sich mir das ganze nicht erschlossen.
Kennst du die fbtft?

https://github.com/notro/fbtft/wiki

Gruß
Pf@nne
Pf@nne
User
Beiträge: 43
Registriert: Donnerstag 18. April 2013, 16:50

Hi,
ich hab beim Testen mit fbtft "am System gefummelt" nun geht der schöne Code nicht mehr:

Code: Alles auswählen

import spidev
import time
import random
import struct
import os
from functools import partial
import pygame
from array import array
from PIL import Image

...
...

def load_image_data(filename):
	result = array('h')
	result.fromstring(pygame.image.load(filename).convert(16).get_buffer().raw)
	result.byteswap()
	return result.tostring()	

def Show_Pic(x1,y1,FileName):

	Pic = Image.open(FileName)
	biWidth, biHeight = Pic.size
	BufferSize = biWidth*biHeight*2
	
	x2 = x1 + biWidth -1
	y2 = y1 + biHeight
	ActiveWindow(x1,y1,x2,y2)
	Set_MemoryWrite_Cursor(x1,y1)

	pygame.init()
	try:
		image_data = load_image_data(FileName)
		block_length = 0xfff
		blocks = (
			image_data[i:i + block_length]
			for i in xrange(0, len(image_data), block_length)
		)

		WriteCMD(0x02)
		GPIO.output(8, False)
		spi.writebytes([0x00]) #WriteData Byte
		for block in blocks:
			spi.writebytes(map(ord, block))
		GPIO.output(8, True)
	finally:
		pygame.quit()

Als Fehlermeldung erhalte ich:

Code: Alles auswählen

Traceback (most recent call last):
  File "RA8875.py", line 308, in <module>
    Show_Pic(0,0,"hintern_24.bmp")
  File "RA8875.py", line 270, in Show_Pic
    image_data = load_image_data(FileName)
  File "RA8875.py", line 253, in load_image_data
    result.fromstring(pygame.image.load(filename).convert(16).get_buffer().raw)
pygame.error: cannot convert without pygame.display initialized
Hat jemand eine Idee was ich da vergessen habe....??

Gruß
pf@nne
BlackJack

@Pf@nne: `pygame.init()` muss ausgeführt werden bevor man etwas anderes von Pygame benutzt.
Pf@nne
User
Beiträge: 43
Registriert: Donnerstag 18. April 2013, 16:50

Aber wo wird denn Pygame vorher genutzt?
Das fängt doch erst nach dem try: an.....?

Gruß
Pf@nne
BlackJack

@Pf@nne: Dann hat das `init()` aus irgendwelchen Gründen nicht funktioniert. Lass Dir mal den Rückgabewert davon ausgeben.
Pf@nne
User
Beiträge: 43
Registriert: Donnerstag 18. April 2013, 16:50

Code: Alles auswählen

	Set_MemoryWrite_Cursor(x1,y1)

	print "pygame.init() =", pygame.init()
	try:
pygame.init() = (5, 1)
BlackJack

@Pf@nne: Dann scheint 1 von 6 Subsystemen nicht initialisiert werden zu können. Kann es sein, dass kein X-Server läuft und der bei vorherigen Tests lief?
Pf@nne
User
Beiträge: 43
Registriert: Donnerstag 18. April 2013, 16:50

Für meine fbtft-tests musste ich das fbtft-image verwenden,
startx meldet

server error
no screens found
Antworten