Ich bin relativ neu in Python.
Habe aber schon Erfahrungen in anderen Programmiersprachen gesammelt.
Für ein Projekt wollte ich eine einfache Klasse zum einlesen von Bitmaps schreiben.
Ich bin den Code jetzt schon oft durchgegangen und finde den Fehler nicht.
Ich schaffe es den Header korrekt einzulesen.
Bei den Pixel stimmt aber irgendetwas nicht. Sie sind nicht korrekt. Obwohl bei einer Farbtiefe von 24 Bit jedes Pixel ein Byte groß sein müsste, stimmt nur die erste Bildzeile, ab der 2. verschieben sich die Werte.
Hier ist der Auszug aus meinen Code:
Code: Alles auswählen
def load(self):
self.all_Pixel = [] # Liste um alle Pixel einzulesen
tmp_Pixel = []
self.oPic = open(self.stPath, 'r+b')
self.oPic.seek(10)
self.iOffBits = int.from_bytes(self.oPic.read(4), 'little')
self.iSizeHeader = int.from_bytes(self.oPic.read(4), 'little')
self.iWidth = int.from_bytes(self.oPic.read(4), 'little')
self.iHeight = int.from_bytes(self.oPic.read(4), 'little')
self.oPic.seek(28)
self.iBitCount = int.from_bytes(self.oPic.read(2), 'little')
self.iCompression = int.from_bytes(self.oPic.read(4), 'little')
self.iSizeImage = int.from_bytes(self.oPic.read(4), 'little')
self.oPic.seek(46)
self.iClrUsed = int.from_bytes(self.oPic.read(4), 'little')
self.iClrImportant = int.from_bytes(self.oPic.read(4), 'little')
##################################################################
print("Offset der Bilddaten in Byte vom Beginn der Datei:", self.iOffBits)
print("Größe der BITMAPINFOHEADER-Struktur in Byte:", self.iSizeHeader)
print("Breite der Bitmap in Pixel:", self.iWidth)
print("Höhe der Bitmap in Pixel:", self.iHeight)
print("Die Farbtiefe der Bitmap in bpp:", self.iBitCount)
print("Komprimierung", self.iCompression)
print("Größe der Bilddaten in Byte:", self.iSizeImage)
print("Anzahl der Einträge der Farbtabelle:", self.iClrUsed)
print("Die Anzahl sämtlicher im Bild verwendeten Farben:", self.iClrImportant)
##################################################################
self.oPic.seek(self.iOffBits)
if self.iCompression == 0:
# Alle Pixel durchgehen
for i in range(self.iWidth * abs(self.iHeight)):
if self.iBitCount == 1: # bpp 1
pass
elif self.iBitCount == 4: # bpp 4
pass
elif self.iBitCount == 8: # bpp 8
pass
elif self.iBitCount == 16: # bpp 16
pass
elif self.iBitCount == 24: # bpp 24
self.iPixelB = int.from_bytes(self.oPic.read(1), 'little') # Blau
self.iPixelG = int.from_bytes(self.oPic.read(1), 'little') # Grün
self.iPixelR = int.from_bytes(self.oPic.read(1), 'little') # Rot
tmp_Pixel.append([self.iPixelR, self.iPixelG, self.iPixelB])
elif self.iBitCount == 32: # bpp 32
pass
# Liste umkehren wenn Bildzeile unten beginnt
if self.iHeight > 0:
for pixel in tmp_Pixel[::-1]:
self.all_Pixel.append(pixel)
# sonst übernehmen
else:
self.all_Pixel = tmp_Pixel
Über Hilfe würde ich mich freuen,
LG
Blackshie