2017-05-11 2 views
0

Ich versuche zu lernen (durch mich und Hilfe von stackoverflow), um Binärdaten zu lesen, wie sie gepackt und verteilt werden. Ich tue dies für Scheren Neugier, aber ich muss im Voraus sagen, dass ich keine richtige Ausbildung von diesem Bereich habe, alles, was ich weiß ist, was ich im Netz und Versuch/Fehler Art von Arbeit finde.Python BMP/DIB Byteslots, Kompressionsschlitz

Zur Vorbereitung auf diese Arbeit habe ich mehrere einfache 1 Pixel 32-Bit-Dateien in Photoshop mit verschiedenen Farben zu testen und zu vergleichen, und mir helfen, zwischen verschiedenen Bytes und Bits zu unterscheiden. Und begann über Wikipedia und MSDN Bitmap-Webseiten zu kämmen.

"Literatur", wenn jemand neugierig ist BMP/DIB header MSDN web page

Und ich traf die "Straßensperre" mit Kompression "slot" von 4 Bytes in DIB-Abschnitt von Header.

die provisorische Funktion i kehrt integer 6.

hier in Little-Endian-Wert gemacht ist Funktion:

def BMP_compresion(fileobj): # bitmap compresion ??? i have no idea what the hell is this 
    fileobj = manageFile(fileobj) 
    fileobj.seek(34) 
    comp = fileobj.read(4) 
    toStart(fileobj) # returns the file to position 0 or closes the file if file needs to be closed 
    return readNUMB(comp,False) # reads integer with struct.unpack 

Diese Funktion derzeit behelfsmäßig sind, wie gesagt, bevor ich noch Dinge herauszufinden bin.

Jetzt verstehe ich, dass Pixel konvertiert werden müssen (und vielleicht komprimiert) von Raw-Datei-Pixel-Definition, aber ich habe keine Ahnung, was 6 sollte darstellen?

Ich dachte sogar, dass dies möglicherweise falsch ist, dass "Komprimierung" per se ein Komprimierungsformat ist, das von einem anderen Bildtyp bei der Konvertierung in bmp übergeben wird (Beispiel: 1 - PNG, 2-JPEG etc).

Ich dachte sogar, dass ich es falsch röte, anstatt es ganzzahlig zu machen, sollte ich die rohe Binärdatei bekommen und das sollte mir etwas sagen.

In binär: \x06\x00\x00\x00
als Binär-String: ◦◦◦

Was hat mich noch mehr verwirrt.

in Wikipedia-Artikel heißt es:

indizierte Farbbilder mit 4-Bit oder 8-Bit-RLE oder Huffman 1D-Algorithmus komprimiert werden. OS/2 BITMAPCOREHEADER2 24bpp-Bilder können mit dem 24-Bit-RLE-Algorithmus komprimiert werden. Die Bilder 16bpp und 32bpp werden immer unkomprimiert gespeichert. Beachten Sie, dass Bilder in allen Farbtiefen ohne Kompression gespeichert werden, wenn so

gewünschten

in Msdn Webseite heißt es:

BMP BMP ist ein Standardformat von Windows verwendet, speichern geräteunabhängig und anwendungsunabhängige Bilder. Die Anzahl der Bits pro Pixel (1, 4, 8, 15, 24, 32 oder 64) für eine bestimmte BMP-Datei wird in einem Dateikopf angegeben. BMP-Dateien mit 24 Bit pro Pixel sind üblich. BMP-Dateien sind normalerweise nicht komprimiert und eignen sich daher nicht für die Übertragung über das Internet.

Also, es ist normalerweise nicht komprimiert ... also wofür steht 6?"Nichts passiert hier, weiter ..."?

Also meine Fragen sind:

Gibt es einige Arten von standardisierten Codes für die Bildkompression? Kann mir bei der Navigation durch diese Byte-Slots helfen? Ich kann es später genauer untersuchen. Hat jemand einen Link oder ein Buch, der mich bei dieser Suche weiterführen kann?

+0

Wenn Sie 'fileobj.seek (34)' schreiben, wie haben Sie sich entschieden, dass Sie 34 Bytes in die Datei suchen sollten, um zum DIB-Header zu gelangen? Laut https://en.wikipedia.org/wiki/BMP_file_format, ist es 14 Bytes, nicht 34. – Kevin

+0

Kompressions-Slot ist in DIB Header nicht BMP Teil gefunden, so ist es tatsächlich auf 34th. In Bild 'https://upload.wikimedia.org/wikipedia/commons/c/c4/BMPfileFormat.png' können Sie in DIB-Header suchen, das ist, was ich als Referenz verwende. Ich habe Byte-Offset am unteren Rand des Bildes verwendet, um zu navigieren. Bis ich herausfinde, wie ich eine Funktion dazu bringe, mein Leiden zu lindern, zähle ich jedes Byte. – Danilo

+0

Sollte es nicht 30 sein, dann? Der BMP-Header ist 14, dann DIB-Header-Größe, Bildbreite, Bildhöhe, Ebenen und Bits pro Pixel ist 16, für insgesamt 30. – Kevin

Antwort

0

Also zuerst musste ich Byte 30 nicht 34 suchen. Zweitens war Kevin zu freundlich, um mich auf den speziellen Abschnitt auf Wikipedia hinzuweisen, der das nächste sagt.

Das Kompressionsverfahren (30-Offset) können sein:

0 :> BI_RGB : the file has no compression 
1 :> BI_RLE8 : Run length encoding (1 byte per pixel) -> RLE 
2 :> BI_RLE4 : Run length encoding (nibble per pixel) -> RLE 
3 :> BI_BITFIELDS : Huffman 1D 
4 :> BI_JPEG : RLE-24 
5 :> BI_PNG : BITMAPV4INFOHEADER+: PNG image for printing 
6 :> BI_ALPHABITFIELDS : RGBA fields (byte per field, sooo 1 byte per color) 
7 :> BI_CMYK : cmyk 
11 :> BI_CMYKRLE8: RLE-8 
12 :> BI_CMYKRLE4 RLE-4 

So, da ich Wert 6 aus Kompressionsschlitz haben, ich weiß, dass ich brauche, ohne Kompression Pixelraster als RGBA lesen .