Entendendo os requisitos de memória para um arquivo de imagem


9

Quero entender os requisitos de memória para arquivos de recursos de imagem a serem exibidos em uma tela de resolução de 240x400.

A tela possui as seguintes especificações:

especificações

Ele suporta profundidade de cores de até 18 bits e usa o driver de vídeo ILI9327.

Supondo que eu precise exibir 50 ícones diferentes, cada um com tamanho de 10 mm x 10 mm, qual é o espaço de armazenamento necessário?

Aqui estão meus cálculos:

Pixels por mm = 400 / 61.2 = 6.536

Número de pixels em uma imagem = 65,36 x 65,36 = 4272 pixels

Cada pixel exigirá 18 bits X 3 (para R, G e B) = 54 bits

Total de bits necessários = 4272 x 54 = 230688 bits = 28,16 kilobytes

Para 50 imagens, exigirei 1.375 megabytes de armazenamento.

Meu cálculo está correto?


2
Você está calculando os requisitos de armazenamento de nível superior. Normalmente, as imagens são compactadas e, geralmente, é mais rápido ler e descomprimir rapidamente (digamos, um cartão SD) do que ler os bytes extras de um arquivo não compactado. Isso ocorre geralmente porque a E / S do dispositivo é um gargalo.
Kingsley

Respostas:


17

Pixels por mm = 400 / 61.2 = 6.536

Sim.

Número de pixels em uma imagem = 65,36 x 65,36 = 4272 pixels

Bem, você quer dizer pixels por ícone. Mas, mesmo assim, você não pode produzir pixels fracionários; portanto, seu número deve ser 65 x 65 ou 66 x 66. E isso leva a uma simplificação adicional. Por que não criar seus ícones de 64 x 64? Isso simplificará os cálculos de endereço para sua memória e produzirá apenas um "encolhimento" de cerca de 2%. E confie em mim, com esse tamanho que ninguém notará. Seus ícones terão 4096 pixels de tamanho.

Cada pixel exigirá 18 bits X 3 (para R, G e B) = 54 bits

Não. Como o jms acabou de responder, são 18 bits por pixel total ou 6 bits por cor. Mais uma vez, porém, você deve considerar não se preocupar tanto com o nível de bits. Armazene seus valores de cores como bytes parciais (6 bits por byte) com bytes separados por cor. Isso consumirá 33% mais memória, mas reduzirá drasticamente sua carga de processamento ao transferir da memória para a tela.

Total de bits necessários = 4272 x 54 = 230688 bits = 28,16 kilobytes

O total de bits é 4096 x 24 ou 98304 bits ou 12288 bytes.

Para 50 imagens, exigirei 1.375 megabytes de armazenamento.

12288 vezes 50 fornece 614400 bytes.


11
Mas certamente, se estamos falando de armazenamento persistente, você armazenaria seus ícones compactados como PNG ou JPEG? Ou se estamos falando de framebuffer, são simplesmente (display_width * display_height * bpp) / 8bytes?
Aroth

@aroth - Isso leva você diretamente ao domínio das trocas. O que é mais importante, tamanho da memória ou demandas de processamento? A busca por imagens não compactadas permite uma transferência praticamente indolor para a tela ao custo de arquivos grandes. É ainda mais fácil, sem a necessidade de descompactar os dados de cores de uma palavra maior. Descompactar uma imagem compactada e / ou aplicar tabelas de cores permite arquivos de dados muito menores, mas o esforço de processamento pode ser intimidador para um novato. É tudo uma questão de prioridades e bom gosto.
WhatRoughBeast

11

Simplifique a sua vida criando os ícones 64 × 64 pixels. Desenhe uma borda ao redor deles, se quiser que eles pareçam maiores.

Com o formato de cores de 16 bits, isso requer apenas 8 kB por ícone ou 400 kB para o conjunto de 50.

Uma forma simples de compactação é usar uma tabela de cores em vez de armazenar diretamente a cor de cada pixel. Geralmente, 16 cores são mais que suficientes para um ícone, especialmente se você aplicar um pouco de pontilhamento criativo. Isso reduz o armazenamento para 2 kB por ícone, mais 32 bytes para a tabela de cores. O armazenamento total é um pouco acima de 101 kB se cada ícone tiver sua própria tabela de cores.


Apenas para satisfazer minha própria curiosidade, peguei a seguinte imagem do "pior caso" ( daqui ):

o poder das cores

Esta linha de comando do ImageMagick

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

transformou-o neste:

insira a descrição da imagem aqui

Nada mal e, é claro, as imagens de origem com uma gama de cores mais limitada serão ainda melhores. Por exemplo, aqui está o Olin, processado da mesma maneira:

insira a descrição da imagem aqui insira a descrição da imagem aqui


2
Palavra-chave: cor indexada . Se, por exemplo, 16 cores por bitmap não forem suficientes, você poderá dividir o ícone em vários bitmaps menores, cada um com uma paleta diferente. Aplicar pontilhamento também pode ajudar.
JMS

9

Mais sobre a profundidade de cores

Expandindo a resposta de Dave Tweed, você pode fazer ainda melhor do que o que ele mostrou.

Aqui está o mesmo original de tamanho grande que ele usou:

Cortado para ficar quadrado e reduzido a 64 x 64 pixels, mas usando cores completas (8 bits por vermelho, grn, blu):

Arredondar as informações de cores de 8 bits por canal para 6 bits resulta em:

É isso que sua tela pode fazer, já que você diz que suporta profundidade de cor de 18 bits.

Arredondando as informações de cores ainda mais para 5 bits para vermelho, 6 para verde e 5 para azul, para um total de rendimentos de 16 bits / pixel:

Isso realmente deve ser bom o suficiente para ícones.

Mesmo sem nenhuma compactação, os ícones desse formato ocupam apenas 64 x 64 x 2 = 8192 bytes. 50 dessas imagens exigiriam 409.600 bytes.


2
Minha imagem é compactada em até 4 bits por pixel (16 cores) - 2k bytes por ícone, além de uma tabela de pesquisa de 32 bytes. Eu queria mostrar como é o pontilhamento com um conjunto limitado de cores.
Dave Tweed

Como estamos comparando diferentes profundidades de cores, adicione uma com um mapa de cores de 8 bits? Isso seria a meio caminho (logaritmicamente) entre as variantes de 4 e 16 bits que já temos aqui.
precisa saber é

@ Dave: Isso não ficou claro em sua resposta, mas isso explica os artefatos pontilhados.
Olin Lathrop

8

Cada pixel exigirá 18 bits X 3 (para R, G e B) = 54 bits

Sua estimativa está incorreta. O valor "18 bits" é por pixel , não por cor. Cada canal vermelho, verde e azul possui uma profundidade de bits máxima de 6 bits (64 valores diferentes), total de 18 bits.
Este controlador de vídeo também suporta um modo de 16 bits (onde os dados de pixel têm apenas 5 bits para vermelho, 6 para verde e 5 para azul), o que facilita o empacotamento de cada pixel em apenas dois bytes. Isso facilita o armazenamento eficiente de bitmaps e aumenta a quantidade de pixels que você pode gravar na tela por segundo.

insira a descrição da imagem aqui

Número de pixels em uma imagem = 65,36 x 65,36 = 4272 pixels

Você não pode armazenar praticamente pixels fracionários ; portanto, seus bitmaps reais (imagens / sprites / caracteres / o que for) provavelmente seriam 65 2 = 4225 pixels.

Seguindo a rota fácil (formato de pixel R5G6B5 de 16 bits), 4225 * 16 bits equivaleria a 67600 bits por bitmap ou 8450 bytes por bitmap. 50 imagens exigiriam 423 kB (sem compactação).

Se você realmente deseja a profundidade total das cores, precisa de mais de 2 bytes por pixel. Nesse estágio, você pode dedicar um byte para cada cor (como sugere o WhatRoughBeast), o que aumentará ainda mais o requisito de armazenamento em 3/2 (634 kB para 50 bitmaps de 65 x 65).

Você também pode empacotar os pixels de 18 bits um ao lado do outro na memória (bits de subpixel desalinhados com os limites de bytes), sem desperdiçar bits. Você precisaria apenas de 476 kB para os 50 bitmaps de 65x65 e 18 bits, mas seria difícil programar e processar mais lentamente.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.