¿Cuál es el tamaño más grande de un JPEG de 640x480?

25

Estoy creando un dispositivo de almacenamiento de datos que toma una cierta cantidad de imágenes del cielo nocturno durante un par de horas, y las imágenes se descargarán inmediatamente después de tomarlas todas. La tarjeta de memoria debe poder almacenar todas las imágenes a la vez.

Los archivos JPEG que se tomarán son 640x480 píxeles, y es esencial que haya suficiente espacio en la tarjeta de memoria para los 100 de ellos. Entonces, ¿cuál es el tamaño más grande de un JPEG de 640x480?

He tomado algunas fotos de prueba para resolver esto:

# 1# 2# 3

  • El tamaño del archivo de la imagen "stackoverflow" es 73,774 bytes.
  • El tamaño del archivo de la imagen blanca es de solo 36,607 bytes.
  • Pero el tamaño del archivo para los relojes de fotos a cuadros es de 149,339 bytes.

Supongo que el tamaño del archivo aumenta con la complejidad.

¿Cómo puedo construir suficiente espacio en la tarjeta de memoria para caber 100 640x480 JPEGS, sin saber qué tan complicado y de qué tamaño serán? No quiero desperdiciar espacio extra, ya que puedo estar haciendo muchos de estos dispositivos de captura.

Hielo azul
fuente
Depende del productor de la imagen. JPEG de 100 calidad puede explotar fácilmente en tamaño. ¿Cuál es su cámara y la configuración de la cámara?
John Dvorak
La cámara de prueba es una Canon Powershot A1100 IS. Para obtener más información, puede consultar los metadatos, porque no estoy seguro de lo que está pidiendo.
Blue Ice
1
¿Ha tomado alguna foto de muestra del cielo nocturno a dif. Q configuración? Como una prueba?
Carl B
2
¿Qué es esto para ? ¿Estás seguro de que JPEG es la elección correcta de formato?
Jack Aidley
3
Luego agrega algo de fondo al comentario de Jack Aidleys: la compresión JPEG cambia la imagen. Hace suposiciones y descarta información para obtener un tamaño de archivo más pequeño. (Menos que se ajuste la calidad del 100%, en cuyo caso puede ser que también utilice un formato no comprimido. A menudo, una cámara digital tiene un tiff o incluso una prima escenario de este. Si desea mantener todos los pequeños puntos como estrellas a continuación, utilizar una de estas). Esto también hará que el tamaño de una imagen sea completamente predecible.
Hennes

Respuestas:

22

Aquí sugiero un límite superior para los tamaños de archivo JPEG. Vea la respuesta de Ilmari Karonen para una discusión sobre los tamaños de JPEG más típicos.

El espacio de almacenamiento de píxeles para una imagen de mapa de bits de 32 bits 640X480 se puede calcular de esta manera (según esta respuesta, pero corregido según el comentario de Ignacio Vázquez-Abrams y esta respuesta):

Suponiendo que no se haya aplicado compresión al archivo, hay 307.200 píxeles, que es un 0.3MP. Mesa de consulta práctica

Si cada píxel contiene 32 bits de información, entonces

  1. 307,200 * 32 = 9,830,400 bits de información
  2. Dividir entre los 8 bits para convertirse en un valor de byte
  3. 9,830,400 / 8 = 1228800 bytes (o 1.17 Mb)

Este es el tamaño de un mapa de bits sin comprimir, y como tal debería ser un límite superior para el tamaño de archivo jpeg (en realidad, debido a que el formato JPEG usa compresión , sus imágenes deberían ser mucho más pequeñas, especialmente dado que está tomando fotos de la noche cielo, que imagino contiene mucho negro. Tenga en cuenta que la imagen de ejemplo más grande en su pregunta es de solo 0.14 MB).

Sin embargo, con respecto a su problema específico, incluso usando ese límite superior, 100 imágenes son solo 117 MB, y ha pasado mucho tiempo desde que vi una tarjeta de memoria tan pequeña como 128 MB. Sospecho que cualquier tarjeta de memoria disponible actualmente tendrá suficiente capacidad para satisfacer sus necesidades.

Aparentemente, el tema del tamaño máximo de archivo jpeg está sujeto a algún debate. Esta respuesta de desbordamiento de pila sugiere un tamaño máximo teórico de 20.25 bytes por píxel, o 5.9 MB en su caso, pero producir una imagen de ese tamaño requiere un uso indebido deliberado del esquema de compresión del formato jpeg, por lo que es extremadamente improbable que alguna vez lo vea Una cosa producida por una cámara.

ForeverWintr
fuente
1
Desafortunadamente, incluso el valor de mapa de bits sin comprimir es un poco bajo, ya que supone el empaquetado. Un mapa de bits desempaquetado utiliza 32 bits por píxel (por motivos de alineación ), lo que aumenta el tamaño del archivo en un 33%.
Ignacio Vazquez-Abrams
Gracias @ IgnacioVazquez-Abrams. Eso es lo que obtengo por suponer que una respuesta aceptada es correcta.
ForeverWintr
1
@ IgnacioVazquez-Abrams - "Alineación" es un atributo dictado por el procesador (no el medio de almacenamiento), y es conveniente cuando los datos están en la RAM para su procesamiento. Para fines de almacenamiento, una alineación de palabras de 32 bits no es una necesidad y ciertamente una extravagancia. Los datos de embalaje son una operación común antes de escribir en el almacenamiento, especialmente para un cierto ahorro del 25%. He visto cámaras digitales que almacenan cada píxel en exactamente 3 bytes para el formato sin formato.
aserrín
1
"... ciertamente una extravagancia". Hoy en día. Hace muchas lunas, solía considerarse una función de ahorro de ciclo (no es necesario alinearse con la carga, dado el tiempo que llevaría).
Ignacio Vazquez-Abrams
3
En la práctica, aunque algunos sistemas pueden almacenar datos de imagen RGB como 4 bytes por píxel en la memoria , casi todos los formatos de archivo de imagen usan 3 bytes por píxel como máximo (a menos que haya un canal alfa real almacenado en el cuarto byte). Vea mi respuesta a continuación.
Ilmari Karonen
35

Solo para verificar, déjame probar el análisis de ForeverWintr experimentalmente.

El peor tipo de imagen de entrada para la compresión JPEG (o cualquier compresión, en realidad) es el ruido RGB uniformemente aleatorio, que en teoría es incompresible. Permítanme generar algunos usando las herramientas netpbm :

$ rawtoppm < /dev/urandom 640 480 > rnd.ppm
$ pnmtopng < rnd.ppm > rnd.png
$ du -b rnd.*
923772  rnd.png
921615  rnd.ppm

Ruido RGB uniformemente aleatorio, formato PNG sin pérdidas
(Ruido RGB uniformemente aleatorio, formato PNG sin pérdidas, 903 kb)

Nota (marzo de 2017): estoy bastante seguro de que la imagen de arriba estaba en formato PNG cuando escribí esta respuesta por primera vez y la cargué en 2013. (Incluso hay un comentario sobre la gestión del color a continuación que implica esto). Desafortunadamente, sería parece que se ha convertido silenciosamente a JPEG en algún momento, haciendo que la comparación visual aquí sea inútil.

Intenté volver a cargar una nueva imagen de prueba PNG, pero aparentemente alcanza algún tipo de límite arbitrario de tamaño de archivo PNG en imgur y se convierte automáticamente a JPEG. No estoy seguro de si hay alguna forma de evitar este problema, pero al menos si tiene acceso a un cuadro de Linux, siempre puede volver a ejecutar los comandos dados para generar sus propias imágenes de prueba. En cualquier caso, aparte de evitar la comparación visual directa de la calidad de compresión, esto no invalida el análisis a continuación de ninguna manera.

OK, entonces el archivo PPM sin comprimir tiene una longitud de 640 × 480 × 3 = 921,600 bytes, más 15 bytes para el encabezado PPM mínimo, tal como se esperaba. Intentar comprimirlo sin pérdidas usando el formato PNG solo termina aumentando el tamaño en 2157 bytes, presumiblemente asumido por los encabezados y metadatos PNG y posiblemente por una leve ineficiencia en el algoritmo de compresión que intenta comprimir datos incompresibles.

(Sí, eso es 3 bytes por píxel, no 4; incluso el formato PPM, que es tan simple como puede obtener un formato de archivo de gráficos, no es lo suficientemente tonto como para almacenar un cuarto byte por píxel inútil en el disco. Puede haber algunos ventaja de hacerlo en la memoria por razones de alineación, especialmente si también necesita almacenar un canal alfa, pero esas razones no se aplican al escribir la imagen en un archivo).

OK, ¿y qué hay de JPEG? Intentemos minimizar las pérdidas de compresión primero (calidad = 100, sin submuestreo de croma, DCT de punto flotante). Desafortunadamente, el pnmtojpegmanual no explica claramente cómo configurar todas las opciones relevantes (específicamente, la -sampleopción aparece en la sección "Opciones para asistentes", que solo hace referencia a un archivo en la documentación de libjpeg), así que la convertiré en el GIMP en su lugar. El archivo resultante se ve así:

897249  rnd.jpg

JPEG comprimido ruido RGB, calidad = 100, sin submuestreo de croma
(JPEG comprimido ruido RGB, calidad = 100, sin submuestreo de croma, 876 kb)

¿Qué, cómo puede ser más pequeño? ¿No acabo de decir que el ruido puro era incompresible? Bueno, la cosa es que, incluso con la máxima calidad, compresión normal JPEG no es bastante sin pérdidas. Al volver a abrir la imagen en GIMP y compararla con el original, se puede ver que algunos de los píxeles han cambiado sus valores de color en uno o dos pasos (de 256). Esos son los píxeles donde el algoritmo de compresión JPEG "engañó" y arrojó un poco aquí, otro allí, donde estimó que el cambio no sería notable. De hecho, para el ojo humano sin ayuda, el resultado es bastante indistinguible del original, pero esos bits descartados se suman a una disminución medible en el tamaño del archivo, incluso después de tener en cuenta el encabezado y la sobrecarga de codificación.

Entonces esa fue la máxima calidad; ¿Qué pasa con las configuraciones más típicas, como los pnmtojpegvalores predeterminados (calidad = 75, submuestreo habilitado)? Vamos a intentarlo:

$ pnmtojpeg < rnd.ppm > rnd2.jpg
$ du -b rnd2.jpg
185128  rnd2.jpg

JPEG comprimido RGB ruido, calidad = 75, submuestreo de croma
(JPEG, ruido RGB comprimido, calidad = 75, submuestreo de croma, 184 kb)

¡Guau, desde 901 hasta 184 kb! Sin embargo, esa es una compresión bastante agresiva, y definitivamente puedes notar la diferencia al comparar las imágenes de cerca. La mayor parte se debe al submuestreo de croma, que básicamente solo arroja el 75% de los datos de color (matiz / saturación). Probarlo en el GIMP con submuestreo desactivado da un archivo de 350,618 bytes que todavía se ve (al menos para el ojo humano) bastante cerca del original incluso cuando se amplía.

De todos modos, el objetivo de todo esto es demostrar que, no importa cuán ruidosas sean sus fotos del cielo nocturno, y no importa cuán alta sea la calidad que pueda seleccionar, simplemente no hay forma de que un archivo JPEG de 640 × 480 pueda ser significativamente más grande que 900 kb. (Bueno, a menos que su cámara adjunte un perfil de color Exif de varios megabytes o algo igualmente estúpido, eso es). Y si está usando configuraciones de compresión JPEG más típicas, el tamaño máximo de archivo plausible se reduce a aproximadamente 200 kb más o menos .

Ilmari Karonen
fuente
44
teóricamente incompresible solo para compresión sin pérdidas, ¿verdad?
Daniel Beck
1
@DanielBeck: Correcto. Obviamente, puede comprimir cualquier información tanto como desee si está dispuesto a tirar partes de ella. (Eso es básicamente lo que hace la compresión JPEG, solo trata de hacerlo de tal manera que las partes perdidas no sean perceptibles para el ojo humano, y que lo que queda se pueda codificar de manera compacta. El ruido sigue siendo un caso difícil, ya que el Lo único que un algoritmo de compresión con pérdida puede hacer con el ruido es tirar partes de él.)
Ilmari Karonen
Tal vez solo soy yo, pero la segunda imagen parece más brillante que la primera.
Bogdacutu
@Bogdacutu: no debería, aunque siempre es posible que su navegador esté haciendo algo extraño con la gestión del color, etc. Intente cargarlos en un editor de gráficos y compare los valores de color.
Ilmari Karonen
Buen reportaje @Ilmari.
ForeverWintr