Comprensione dei requisiti di memoria per un file di immagine


9

Voglio comprendere i requisiti di memoria per i file di risorse di immagine da visualizzare su un display con risoluzione 240x400.

Il display ha le seguenti specifiche:

Specifiche

Supporta una profondità di colore fino a 18 bit e utilizza il driver di visualizzazione ILI9327.

Supponendo che sia necessario visualizzare 50 icone diverse, ognuna delle dimensioni di 10 mm X 10 mm, qual è lo spazio di archiviazione richiesto?

Ecco i miei calcoli:

Pixel per mm = 400 / 61.2 = 6.536

Numero di pixel in un'immagine = 65,36 x 65,36 = 4272 pixel

Ogni pixel richiederà 18 bit X 3 (per R, G e B) = 54 bit

Bit totali richiesti = 4272 x 54 = 230688 bit = 28,16 kilobyte

Per 50 immagini, avrò bisogno di 1.375 megabyte di spazio di archiviazione.

Il mio calcolo è corretto?


2
Stai calcolando i requisiti di archiviazione di livello superiore. In genere le immagini sono compresse, e spesso è più veloce da leggere e decomprimere al volo (ad esempio una scheda SD) piuttosto che leggere i byte extra da un file non compresso. Questo spesso perché l'I / O del dispositivo è un collo di bottiglia.
Kingsley,

Risposte:


17

Pixel per mm = 400 / 61.2 = 6.536

Sì.

Numero di pixel in un'immagine = 65,36 x 65,36 = 4272 pixel

Bene, vuoi dire pixel per icona. Tuttavia, non puoi produrre pixel frazionari, quindi il tuo numero dovrebbe essere 65 x 65 o 66 x 66. E questo porta ad un'ulteriore semplificazione. Perché non rendere le tue icone 64 x 64? Ciò semplificherà i calcoli degli indirizzi per la memoria e produrrà solo una "contrazione" di circa il 2%. E fidati di me, a queste dimensioni nessuno se ne accorgerà. Quindi le tue icone avranno una dimensione di 4096 pixel.

Ogni pixel richiederà 18 bit X 3 (per R, G e B) = 54 bit

No. Come jms ha appena risposto, ha un totale di 18 bit per pixel o 6 bit per colore. Ancora una volta, però, dovresti considerare di non preoccuparti troppo del livello dei bit. Memorizza i tuoi valori di colore come byte parziali (6 bit per byte) con byte separati per colore. Ciò richiederà il 33% di memoria in più, ma ridurrà drasticamente il carico di elaborazione durante il trasferimento dalla memoria allo schermo.

Bit totali richiesti = 4272 x 54 = 230688 bit = 28,16 kilobyte

I bit totali sono 4096 x 24 o 98304 bit o 12288 byte.

Per 50 immagini, avrò bisogno di 1.375 megabyte di spazio di archiviazione.

12288 volte 50 dà 614400 byte.


1
Ma sicuramente se stiamo parlando di archiviazione persistente, allora memorizzeresti le tue icone compresse come PNG o JPEG? O se stiamo parlando di framebuffer, allora è semplicemente (display_width * display_height * bpp) / 8byte?
aroth

@aroth - Questo ti porta esattamente nel regno dei compromessi. Cosa c'è di più importante, le dimensioni della memoria o le esigenze di elaborazione? La ricerca di immagini non compresse consente un trasferimento sostanzialmente indolore sullo schermo al costo di file di grandi dimensioni. È ancora più semplice senza dover decomprimere i dati di colore da una parola più grande. Disimballare un'immagine compressa e / o applicare tabelle di colori consente file di dati molto più piccoli, ma lo sforzo di elaborazione può essere intimidatorio per un principiante. È tutta una questione di priorità e gusto.
WhatRoughBeast

11

Semplifica la vita creando icone 64 × 64 pixel. Disegna un bordo attorno a loro se vuoi che appaiano più grandi.

Con il formato colore a 16 bit, questo richiede solo 8 kB per icona o 400 kB per un set di 50.

Una semplice forma di compressione consiste nell'utilizzare una tabella di colori anziché memorizzare direttamente il colore di ogni pixel. 16 colori sono spesso più che sufficienti per un'icona, specialmente se si applica un po 'di dithering creativo. Ciò riduce l'archiviazione a 2 kB per icona, più 32 byte per la tabella dei colori. La memoria totale è di poco superiore a 101 kB se ogni icona ha una propria tabella di colori.


Solo per soddisfare la mia curiosità, ho preso la seguente immagine "peggiore" (da qui ):

il potere dei colori

Questa riga di comando di ImageMagick

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

trasformato in questo:

inserisci qui la descrizione dell'immagine

Non male, e ovviamente le immagini sorgente con una gamma di colori più limitata usciranno ancora meglio. Ad esempio, ecco Olin, elaborato allo stesso modo:

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine


2
Parola chiave: colore indicizzato . Se ad esempio 16 colori per bitmap non sono sufficienti, puoi dividere l'icona in più bitmap più piccole, ognuna con una tavolozza diversa. Anche l'applicazione del dithering può essere d'aiuto.
jms

9

Maggiori informazioni sulla profondità del colore

Espandendo la risposta di Dave Tweed, puoi fare anche meglio di quello che ha mostrato.

Ecco lo stesso originale di grandi dimensioni che ha usato:

Ritagliata per essere quadrata e ridotta a 64 x 64 pixel ma utilizzando rese di colore complete (8 bit per rosso, grigio, blu):

L'arrotondamento delle informazioni sul colore da 8 bit per canale a 6 bit comporta:

Questo è ciò che il tuo display può fare, dal momento che dici che supporta una profondità di colore a 18 bit.

Arrotondare ulteriormente le informazioni sul colore a 5 bit per il rosso, 6 per il verde e 5 per il blu, per un totale di 16 bit / pixel:

Questo dovrebbe davvero essere abbastanza buono per le icone.

Anche senza alcuna compressione, le icone di questo formato richiedono solo 64 x 64 x 2 = 8192 byte. 50 di tali immagini richiederebbero 409.600 byte.


2
La mia immagine è compressa fino a 4 bit per pixel (16 colori) - 2k byte per icona, più una tabella di ricerca a 32 byte. Volevo mostrare come appare il dithering con un set limitato di colori.
Dave Tweed,

Dato che stiamo confrontando diverse profondità di colore, ti va di aggiungerne una con una mappa colori a 8 bit? Sarebbe a metà strada (logaritmicamente) tra le varianti a 4 e 16 bit che abbiamo già qui.
ilkkachu,

@Dave: non è stato chiaro dalla tua risposta, ma questo spiega gli artefatti dithering.
Olin Lathrop,

8

Ogni pixel richiederà 18 bit X 3 (per R, G e B) = 54 bit

Il tuo preventivo non è corretto. Il valore "18 bit" è per pixel , non per colore. I canali rosso, verde e blu hanno ciascuno una profondità massima di 6 bit (64 valori diversi), 18 bit in totale.
Questo controller di visualizzazione supporta anche una modalità a 16 bit (in cui i dati pixel hanno solo 5 bit per il rosso, 6 per il verde e 5 per il blu) che semplifica il confezionamento di ciascun pixel in soli due byte. Ciò semplifica la memorizzazione efficiente di bitmap e aumenta la quantità di pixel che è possibile scrivere sul display al secondo.

inserisci qui la descrizione dell'immagine

Numero di pixel in un'immagine = 65,36 x 65,36 = 4272 pixel

Non puoi praticamente memorizzare pixel frazionari , quindi le tue bitmap effettive (immagini / sprite / caratteri / qualunque cosa) sarebbero probabilmente 65 2 = 4225 pixel.

Seguendo il percorso semplice (formato pixel R5G6B5 a 16 bit), 4225 * 16 bit ammonterebbero a 67600 bit per bitmap o 8450 byte per bitmap. 50 immagini richiederebbero 423 kB (senza compressione).

Se vuoi davvero la profondità del colore, hai bisogno di più di 2 byte per pixel. A quel punto potresti anche dedicare un byte per ogni colore (come suggerisce WhatRoughBeast), che aumenterà ulteriormente il requisito di archiviazione di 3/2 (634 kB per 50 bitmap 65x65).

È inoltre possibile comprimere i pixel a 18 bit uno accanto all'altro in memoria (bit subpixel non allineati con i limiti di byte), senza sprecare alcun bit. Avresti bisogno solo di 476 kB per 50 bitmap 65x65 a 18 bit, ma sarebbe un problema programmare e rallentare l'elaborazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.