Ich möchte die Speicheranforderungen für Bildressourcendateien verstehen, die auf einem Display mit einer Auflösung von 240 x 400 angezeigt werden sollen.
Das Display hat folgende Spezifikationen:
Es unterstützt Farbtiefen von bis zu 18 Bit und verwendet den ILI9327-Anzeigetreiber.
Angenommen, ich muss 50 verschiedene Symbole mit einer Größe von jeweils 10 mm x 10 mm anzeigen. Wie viel Speicherplatz wird benötigt?
Hier sind meine Berechnungen:
Pixel pro mm = 400 / 61,2 = 6,536
Anzahl der Pixel in einem Bild = 65,36 x 65,36 = 4272 Pixel
Jedes Pixel benötigt 18 Bit x 3 (für R, G und B) = 54 Bit
Erforderliche Gesamtbits = 4272 x 54 = 230688 Bits = 28,16 Kilobyte
Für 50 Bilder benötige ich 1,375 Megabyte Speicherplatz.
Ist meine Berechnung korrekt?
Antworten:
Jep.
Du meinst Pixel pro Symbol. Trotzdem können Sie keine gebrochenen Pixel erzeugen, daher sollte Ihre Zahl entweder 65 x 65 oder 66 x 66 sein. Dies führt zu einer weiteren Vereinfachung. Warum machen Sie Ihre Symbole nicht 64 x 64? Dies vereinfacht die Adressberechnung für Ihren Speicher und führt nur zu einer "Schrumpfung" von etwa 2%. Und vertrau mir, bei dieser Größe wird es niemand bemerken. Dann haben Ihre Symbole eine Größe von 4096 Pixel.
Nee. Wie jms gerade geantwortet hat, sind es insgesamt 18 Bit pro Pixel oder 6 Bit pro Farbe. Auch hier sollten Sie sich nicht so viele Gedanken über die Bitebene machen. Speichern Sie Ihre Farbwerte als Teilbytes (6 Bit pro Byte) mit separaten Bytes pro Farbe. Dies benötigt 33% mehr Speicher, reduziert jedoch die Verarbeitungslast beim Übertragen vom Speicher auf den Bildschirm drastisch.
Die Gesamtzahl der Bits beträgt 4096 x 24 oder 98304 Bit oder 12288 Byte.
12288 mal 50 ergibt 614400 Bytes.
quelle
(display_width * display_height * bpp) / 8
Bytes?Machen Sie sich das Leben einfach, indem Sie die Symbole auf 64 × 64 Pixel setzen. Zeichnen Sie einen Rand um sie, wenn Sie möchten, dass sie größer aussehen.
Beim 16-Bit-Farbformat sind nur 8 KB pro Symbol oder 400 KB für den Satz von 50 erforderlich.
Eine einfache Form der Komprimierung besteht darin, eine Farbtabelle zu verwenden, anstatt die Farbe jedes Pixels direkt zu speichern. 16 Farben sind häufig mehr als genug für ein Symbol, insbesondere wenn Sie ein wenig kreatives Dithering anwenden. Dies reduziert den Speicher auf 2 kB pro Symbol plus 32 Byte für die Farbtabelle. Der Gesamtspeicher beträgt etwas mehr als 101 KB, wenn jedes Symbol eine eigene Farbtabelle hat.
Um meine eigene Neugier zu befriedigen, habe ich das folgende "Worst-Case" -Bild (von hier ) aufgenommen:
Diese ImageMagick-Befehlszeile
verwandelte es in dieses:
Nicht schlecht, und natürlich werden Quellbilder mit einer begrenzten Farbpalette noch besser wiedergegeben. Hier ist zum Beispiel Olin, der auf die gleiche Weise verarbeitet wurde:
quelle
Mehr zur Farbtiefe
Wenn Sie die Antwort von Dave Tweed erweitern, können Sie sogar noch besser als das, was er gezeigt hat.
Hier ist das gleiche große Original, das er verwendet hat:
Beschnitten, um quadratisch zu sein und auf 64 x 64 Pixel zu verkleinern, aber unter Verwendung der vollen (8 Bit pro Rot, Grün, Blau) Farbausbeute:
Das Runden der Farbinformationen von 8 Bit pro Kanal auf 6 Bit führt zu:
Das kann Ihr Display, da Sie sagen, dass es eine Farbtiefe von 18 Bit unterstützt.
Runden Sie die Farbinformationen weiter auf 5 Bit für Rot, 6 für Grün und 5 für Blau, um insgesamt 16 Bit / Pixel zu erhalten:
Dies sollte wirklich gut genug für Symbole sein.
Auch ohne Komprimierung benötigen Symbole dieses Formats nur 64 x 64 x 2 = 8192 Byte. 50 solcher Bilder würden 409.600 Bytes erfordern.
quelle
Ihre Schätzung ist falsch. Der Wert "18 Bit" gilt pro Pixel und nicht pro Farbe. Die roten, grünen und blauen Kanäle haben jeweils eine maximale Bittiefe von 6 Bit (64 verschiedene Werte), insgesamt 18 Bit.
Dieser Display-Controller unterstützt auch einen 16-Bit-Modus (wobei Pixeldaten nur 5 Bit für Rot, 6 für Grün und 5 für Blau enthalten), wodurch es einfach ist, jedes Pixel in nur zwei Bytes zu packen. Dies erleichtert das effiziente Speichern von Bitmaps und erhöht die Anzahl der Pixel, die Sie pro Sekunde auf das Display schreiben können.
Sie können praktisch nicht speichern gebrochene Pixel, so dass Ihre tatsächlichen Bitmaps (Bilder / Sprites / Zeichen / was auch immer) wahrscheinlich 65 sein würde , 2 = 4225 Pixel.
Auf dem einfachen Weg (16-Bit-R5G6B5-Pixelformat) würden 4225 * 16 Bit 67600 Bit pro Bitmap oder 8450 Byte pro Bitmap betragen. 50 Bilder würden 423 kB erfordern (ohne Komprimierung).
Wenn Sie wirklich die volle Farbtiefe wünschen, benötigen Sie mehr als 2 Bytes pro Pixel. In diesem Stadium können Sie genauso gut ein Byte für jede Farbe verwenden (wie WhatRoughBeast vorschlägt), wodurch sich der Speicherbedarf um 3/2 erhöht (634 kB für 50 65 x 65 Bitmaps).
Sie können die 18-Bit-Pixel auch direkt nebeneinander in den Speicher packen (Subpixel-Bits, die nicht an Byte-Grenzen ausgerichtet sind), ohne Bits zu verschwenden. Sie würden nur 476 kB für die 50 65x65 18-Bit-Bitmaps benötigen, aber es wäre mühsam zu programmieren und langsamer zu verarbeiten.
quelle