2017-05-07 5 views
0

Also entwickle ich eine Art von Tamagotchi (virtuelle Haustier) für meine Mikroprozessoren endgültig. Ich habe meine eigenen Bilder 128x64 Pixel lang gemacht, da ich ein Display mit dieser Auflösung verwende, so dass jedes Bild 1Kbytes wiegt. Ich benutze einen at89s52 (8052) Mikrocontroller und es hat nicht genug Speicher, um alle gewünschten Animationen zu speichern. Mein Plan (und ich möchte es so behalten) besteht darin, ein EPROM zu verwenden, um alle meine Bilder mit dem Intel Hex-Format zu speichern (der Programmierer, den ich benutze, ist SUPERPRO und importiert diesen Dateityp). Natürlich wird der Assembler-Code für mich nach dem Punkt, an dem ich die Daten im ROM habe, einfach sein. Ich bin nicht so gut von einem Programmierer, um einen Code zu entwickeln, der genau das tut, was ich will (konvertiere Bilder in Intel Hex), und die ganze Software, die ich ausprobiert habe, erzeugt sie nicht korrekt (fügt Hexadezimalwerte ein, die nicht sein sollen) dort, zum Beispiel: in einem leeren Raum soll es nur Nullen geben, und es gibt einen anderen Wert). Ich habe mit png mit transparentem Hintergrund, mit weißem Hintergrund und jpg versucht. Die Bilder ich habe, sind so:Konvertieren von einfachen Bild zu Intel Hex

http://imgur.com/a/yiCOb (es scheint, ich bin nicht erlaubt Bilder hier posten)

ich viel Hilfe in anderen Orten des Internets nicht siehst, so dass die Antwort auf diese Frage wäre eine große Hilfe für zukünftige MCU-basierte Programmierer sein. Vielen Dank.

+0

Sind das ausschließlich Schwarz-Weiß-Bilder? Dies sollte eine triviale Umwandlung sein - setze die schwarzen Bits auf 1 und die weißen Bits auf 0. Ich bin mir nicht sicher, was mit der gefundenen Software nicht stimmt. (Ich bin mir auch nicht sicher, was in der Welt "Intel Hex" ist. Wie unterscheidet sich das hexadezimale Format von Intel von allen anderen? So weit ich weiß, ist es nicht.) –

+0

@CodyGray Es ist ein [schlecht benanntes Format] (https://en.wikipedia.org/wiki/Intel_HEX) von denen ich bis jetzt noch nie gehört habe :) Zum OP: Was genau fragst du? Für ein Werkzeug zum Konvertieren von Bildern in Intel HEX? Ich fürchte, das ist nicht Thema. Hast du über Sprites nachgedacht? Oder einfach eine rohe Binärdatei brennen? –

+0

nicht schlecht benannt es gibt intel hex und motorola srecord, wenn du gerade erst davon gehört hast dann entweder bist du neu bei microcontrollern oder das format ist älter als du bist.Eeprom-Programmierer haben das eine oder andere Dateiformat benutzt, seit Eeprom herauskam oder wahrscheinlich vorher, brauchten die gleichen Formate für das Programmieren von Mcus an dem Tag, an dem sie vor dem Flash waren, und steckten sie in einen Programmierer, bevor sie zum Board wechselten. –

Antwort

1

Es ist etwa 30 Jahre her, seit ich das letzte Mal jeden Fall ein EPROM :-)

gemacht, müssen Sie 2 Dinge ...

Part One

Erstens Ihre Dateien PNG-Format, das bedeutet, sie haben Daten, Zeiten, Paletten, Gamma-Chunks und eine Menge komprimierter Daten zlib, und Sie können das nicht einfach in einen Bildschirmpuffer kopieren. Also müssen Sie die PNGs in ein einfaches Binärformat konvertieren, wobei 0 aus ist und 1 an ist und es nichts anderes in der Datei gibt. Der einfachste Weg dazu ist mit ImageMagick, die auf den meisten Linux-Plattformen installiert ist und ist kostenlos auf MacOS und Windows verfügbar. Sagen wir mal einen Ihrer Rahmen anim.png genannt wird, und wir wollen, dass es bekommen, um ein einfaches Format, wie PGM (Portable GreyMap - siehe Wikipedia description) wir ImageMagick wie dieses an der Konsole verwenden können:

convert anim.png -compress none anim.pgm 

der ersten Zeilen werden:

P2 
128 64 
255 
255 255 255 255 255 255 255 ... 
... 
... 

, weil das Bild 128x64 und die maximale Helligkeit in der Datei ist 255. Dann werden die alle Daten in ASCII folgen (weil ich -compress none setzen). Dort steht 255 für Weiß und 0 für Schwarz.

Wie das ist zu groß für den Bildschirm, hier ist ein Bild, wie es aussieht - hoffentlich können Sie Ihre Blackbox als ein Bündel von Nullen in der Mitte an der Unterseite sehen:

enter image description here

Nun, wenn Sie denselben Befehl erneut ausführen, aber entfernen Sie die -compress none, wird der gleiche Header erzeugt, aber die Daten werden in Binärform folgen.

convert anim.png anim.pgm 

Und wir können sed auch die 3 Zeilen-Header löschen verwenden:

convert anim.png anim.pgm | sed '1,3d' > anim.bin 

Jetzt haben Sie eine Binärdatei von nur reinen Pixel, die frei von Datum/Uhrzeit, Autor und Urheberrechte ist, Paletten und komprimierte Daten können Sie zum nächsten Teil übergehen.

Teil 2

Zweitens, wenn Sie Ihre Daten in einem vernünftigen Binärformat bekommen haben, müssen Sie es auf Intel-Hex konvertieren, und dass Sie srec_cat benötigen, die für Linux täglich zur Verfügung steht und über homebrew auf einem Mac.

Dann habe ich nicht getestet und haben es nie benutzt, ich denke, Sie so etwas wie wollen:

srec_cat anim.bin -binary -output -intel 

:020000040000FA 
:20000000323535203235352032353520323535203235352032353520323535203235352000 
:200020003235352032353520323535203235352032353520323535203235352032353520E0 
:200040003235352032353520323535203235352032353520323535203235352032353520C0 
:200060003235352032353520323535203235352032353520323535203235352032353520A0 
:20008000323535203235352032353520323535203235352032353520323535203235352080 
... 
:207E8000353520323535203235352032353520323535203235352032353520323535203202 
:207EA0003535203235352032353520323535203235352032353520323535203235352032E2 
:147EC000353520323535203235352032353520323535200A2A 
:00000001FF 

Zusammenfassung

Sie abkürzen und vereinfachen, was ich vorschlage oben - Ich werde es dort lassen, damit die Leute es in Zukunft verstehen können!

convert YourImage.png gray: | srec_cat - -binary -output -intel 

Die gray: ist ein sehr einfaches ImageMagick Format entspricht nur der binäre Teil einer PGM-Datei ohne Header. Wie PGM verwendet es ein Byte pro Pixel, so dass es für Ihre reinen Schwarz-Weiß-Bedürfnisse etwas ineffizient sein wird. Sie können das an der Dateigröße erkennen - die PGM-Datei hat 8192 Bytes, also 1 Byte pro Pixel. Wenn Sie wirklich, wirklich 1 Bit pro Pixel möchten, können Sie PBM Format wie folgt verwenden:

convert YourImage.png pbm: | sed '1,3d' | srec_cat - -binary -output -intel 

Hinweis:

  1. Von v7 von ImageMagick ab, sollten Sie convert durch magick ersetzen, so um zu vermeiden, mit dem integrierten Befehl convert von Windows zu kollidieren, der Dateisysteme in NTFS konvertiert.

  2. ImageMagick ist ein ziemlich großes Paket, könnten Sie dies tun, ebenso gut nur mit der NetPBM Suite und das Werkzeug pngtopnm anstelle von convert genannt verwenden.

+0

Vielen Dank! Ich habe versucht, die Bilder binär zu machen und dann srec_cat zu verwenden, um in hex zu konvertieren ... aber ich denke, dass ich den Müll in PNGs nie in Betracht gezogen habe. Und wow, ich habe nie daran gedacht, ein EPROM zu machen, Dinge der Vergangenheit, denke ich. Es bringt Tränen in meine Augen, dass es eine so aktive Gemeinschaft gibt, die hilft. – Neko

+0

Ich habe Probleme mit dem Befehl "sed", da ich Windows verwende. Irgendwelche Ideen süße maestre? Es wird gesagt, dass "sed" nicht als ein interner oder externer Befehl, Programm oder Datei von ausführbaren Losen erkannt wird. – Neko

+0

Windows? Pfui! Ich habe das nie versucht, aber gemäß diesem Beitrag können Sie 'MORE + 3' verwenden http://StackOverflow.com/a/11432438/2836621 –