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:
- 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.
fuente
Respuestas:
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):
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.
fuente
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 :
(Ruido RGB uniformemente aleatorio, formato PNG sin pérdidas, 903 kb)
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
pnmtojpeg
manual no explica claramente cómo configurar todas las opciones relevantes (específicamente, la-sample
opció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í:(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
pnmtojpeg
valores predeterminados (calidad = 75, submuestreo habilitado)? Vamos a intentarlo:(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 .
fuente