Grundlegendes zu den Speicheranforderungen für eine Bilddatei

9

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:

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?

Whiskeyjack
quelle
2
Sie berechnen die Speicheranforderungen der oberen Ebene. In der Regel werden Bilder komprimiert, und häufig ist das Lesen und Dekomprimieren im laufenden Betrieb (z. B. von einer SD-Karte) schneller als das Lesen der zusätzlichen Bytes aus einer nicht komprimierten Datei. Dies liegt häufig daran, dass die Geräte-E / A einen Engpass darstellt.
Kingsley

Antworten:

17

Pixel pro mm = 400 / 61,2 = 6,536

Jep.

Anzahl der Pixel in einem Bild = 65,36 x 65,36 = 4272 Pixel

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.

Jedes Pixel benötigt 18 Bit x 3 (für R, G und B) = 54 Bit

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.

Erforderliche Gesamtbits = 4272 x 54 = 230688 Bits = 28,16 Kilobyte

Die Gesamtzahl der Bits beträgt 4096 x 24 oder 98304 Bit oder 12288 Byte.

Für 50 Bilder benötige ich 1,375 Megabyte Speicherplatz.

12288 mal 50 ergibt 614400 Bytes.

WhatRoughBeast
quelle
1
Aber wenn es sich um dauerhaften Speicher handelt, würden Sie Ihre Symbole sicher als PNGs oder JPEGs komprimieren? Oder wenn wir über Framebuffer sprechen, dann sind es einfach (display_width * display_height * bpp) / 8Bytes?
aroth
@aroth - Dies bringt Sie direkt in den Bereich der Kompromisse. Was ist wichtiger, Speichergröße oder Verarbeitungsbedarf? Die Verwendung unkomprimierter Bilder ermöglicht eine im Wesentlichen schmerzlose Übertragung auf den Bildschirm auf Kosten großer Dateien. Es ist noch einfacher, ohne Farbdaten aus einem größeren Wort entpacken zu müssen. Das Entpacken eines komprimierten Bildes und / oder das Anwenden von Farbtabellen ermöglicht viel kleinere Datendateien, aber der Verarbeitungsaufwand kann für einen Neuling einschüchternd sein. Es ist alles eine Frage der Prioritäten und des Geschmacks.
WhatRoughBeast
11

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:

die Kraft der Farben

Diese ImageMagick-Befehlszeile

convert image.jpg -crop 267x267+66+0 -resize 64x64 -colors 16 final.png

verwandelte es in dieses:

Geben Sie hier die Bildbeschreibung ein

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:

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Dave Tweed
quelle
2
Schlüsselwort: indizierte Farbe . Wenn beispielsweise 16 Farben pro Bitmap nicht ausreichen, können Sie das Symbol in mehrere kleinere Bitmaps mit jeweils unterschiedlicher Palette unterteilen. Das Anwenden von Dithering kann ebenfalls hilfreich sein.
JMS
9

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.

Olin Lathrop
quelle
2
Mein Bild wird auf 4 Bit pro Pixel (16 Farben) komprimiert - 2 KByte pro Symbol plus eine 32-Byte-Nachschlagetabelle. Ich wollte zeigen, wie Dithering mit einer begrenzten Anzahl von Farben aussieht.
Dave Tweed
Da wir verschiedene Farbtiefen vergleichen, möchten Sie eine mit einer 8-Bit-Farbkarte hinzufügen? Das wäre auf halbem Weg (logarithmisch) zwischen den 4-Bit- und 16-Bit-Varianten, die wir hier bereits haben.
Ilkkachu
@ Dave: Das war aus deiner Antwort nicht klar, aber das erklärt die Dithering-Artefakte.
Olin Lathrop
8

Jedes Pixel benötigt 18 Bit x 3 (für R, G und B) = 54 Bit

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.

Geben Sie hier die Bildbeschreibung ein

Anzahl der Pixel in einem Bild = 65,36 x 65,36 = 4272 Pixel

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.

jms
quelle