Comprensión de los requisitos de memoria para un archivo de imagen

9

Quiero comprender los requisitos de memoria para los archivos de recursos de imagen que se mostrarán en una pantalla de resolución 240x400.

La pantalla tiene las siguientes especificaciones:

Admite una profundidad de color de hasta 18 bits y utiliza el controlador de pantalla ILI9327.

Suponiendo que necesito mostrar 50 iconos diferentes, cada uno de tamaño 10 mm X 10 mm, ¿cuál es el espacio de almacenamiento requerido?

Aquí están mis cálculos:

Pixeles por mm = 400 / 61.2 = 6.536

Número de píxeles en una imagen = 65.36 x 65.36 = 4272 píxeles

Cada píxel requerirá 18 bits X 3 (para R, G y B) = 54 bits

Total de bits necesarios = 4272 x 54 = 230688 bits = 28.16 kilobytes

Para 50 imágenes, necesitaré 1.375 megabytes de almacenamiento.

¿Mi cálculo es correcto?

    
pregunta Whiskeyjack

4 respuestas

17
  

Pixeles por mm = 400 / 61.2 = 6.536

Sí.

  

Número de píxeles en una imagen = 65.36 x 65.36 = 4272 píxeles

Bueno, te refieres a píxeles por icono. Pero aún así, no puede producir píxeles fraccionarios, por lo que su número debería ser 65 x 65 o 66 x 66. Y esto conduce a una simplificación adicional. ¿Por qué no hacer tus iconos 64 x 64? Esto simplificará los cálculos de dirección para su memoria y solo producirá una "contracción" de aproximadamente el 2%. Y créeme, a este tamaño nadie lo notará. Entonces sus iconos tendrán un tamaño de 4096 píxeles.

  

Cada píxel requerirá 18 bits X 3 (para R, G y B) = 54 bits

No. Como acaba de responder jms, es de 18 bits por píxel total, o 6 bits por color. Sin embargo, una vez más, debe considerar no preocuparse tanto por el nivel de bits. Almacene sus valores de color como bytes parciales (6 bits por byte) con bytes separados por color. Esto tomará un 33% más de memoria, pero reducirá drásticamente su carga de procesamiento al transferir de la memoria a la pantalla.

  

Total de bits necesarios = 4272 x 54 = 230688 bits = 28.16 kilobytes

El número total de bits es 4096 x 24, o 98304 bits, o 12288 bytes.

  

Para 50 imágenes, necesitaré 1.375 megabytes de almacenamiento.

12288 veces 50 da 614400 bytes.

    
respondido por el WhatRoughBeast
11

Haz la vida simple para ti mismo haciendo que los iconos tengan 64 × 64 píxeles. Dibuja un borde alrededor de ellos si quieres que se vean más grandes.

Con el formato de color de 16 bits, esto solo requiere 8 kB por icono, o 400 kB para el conjunto de 50.

Una forma simple de compresión es usar una tabla de colores en lugar de almacenar el color de cada píxel directamente. Con frecuencia, 16 colores son más que suficientes para un icono, especialmente si aplica un poco de tramado creativo. Esto reduce el almacenamiento a 2 KB por icono, más 32 bytes para la tabla de colores. El almacenamiento total es un poco más de 101 KB si cada icono tiene su propia tabla de colores.

Para satisfacer mi propia curiosidad, tomé la siguiente imagen del "peor de los casos" (de aquí ):

EstalíneadecomandodeImageMagick

convertimage.jpg-crop267x267+66+0-resize64x64-colors16final.png

loconvirtióenesto:

Noestámal,y,porsupuesto,lasimágenesdeorigenconunagamadecoloresmáslimitadasaldránaúnmejor.Porejemplo,aquíestáOlin,procesadodelamismamanera:

    
respondido por el Dave Tweed
9

Más sobre la profundidad del color

Ampliando la respuesta de Dave Tweed, puedes hacerlo incluso mejor de lo que mostró.

Aquí está el mismo original de gran tamaño que utilizó:

Recortadoparasercuadradoyreducidoa64x64píxelesperoutilizandorendimientosdecolorcompletos(8bitsporrojo,grn,azul):

Alredondearlainformacióndecolorde8bitsporcanala6bits,seobtiene:

Esoesloquepuedehacertupantalla,yaquedicesqueadmiteunaprofundidaddecolorde18bits.

Redondeandolainformacióndecolora5bitspararojo,6paraverdey5paraazul,parauntotalde16bits/rendimientodepíxeles:

Esto debería ser suficientemente bueno para los íconos.

Incluso sin ninguna compresión, los iconos de este formato toman solo 64 x 64 x 2 = 8192 bytes. 50 imágenes de este tipo requerirían 409,600 bytes.

    
respondido por el Olin Lathrop
8
  

Cada píxel requerirá 18 bits X 3 (para R, G y B) = 54 bits

Tu estimación es incorrecta. El valor de "18 bits" es por píxel , no por color. Los canales rojo, verde y azul tienen cada uno una profundidad de bits máxima de 6 bits (64 valores diferentes), 18 bits en total.
Este controlador de pantalla también admite un modo de 16 bits (donde los datos de píxeles solo tienen 5 bits para el rojo, 6 para el verde y 5 para el azul), lo que facilita el empaquetado de cada píxel en solo dos bytes. Esto facilita el almacenamiento eficiente de mapas de bits y aumenta la cantidad de píxeles que puede escribir en la pantalla por segundo.

  

Número de píxeles en una imagen = 65.36 x 65.36 = 4272 píxeles

Prácticamente no puede almacenar fraccional píxeles, por lo que sus mapas de bits reales (imágenes / sprites / caracteres / lo que sea) probablemente sean 65 2 = 4225 píxeles.

Siguiendo la ruta fácil (formato de 16 bits R5G6B5 píxeles), 4225 * 16 bits equivaldrían a 67600 bits por mapa de bits, o 8450 bytes por mapa de bits. 50 imágenes requerirían 423 kB (sin compresión).

Si realmente desea la profundidad de color completa, necesita más de 2 bytes por píxel. En esa etapa, bien podría dedicar un byte a cada color (como sugiere WhatRoughBeast), lo que aumentará el requisito de almacenamiento en 3/2 (634 kB para 50 mapas de bits de 65x65).

También puede empaquetar los píxeles de 18 bits uno al lado del otro en la memoria (bits de subpíxel no alineados con los límites de bytes), sin perder ningún bit. Solo necesitaría 476 kB para los 50 mapas de bits de 65x65 a 18 bits, pero sería un dolor de programa y un proceso más lento.

    
respondido por el jms

Lea otras preguntas en las etiquetas