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:
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?
Respostas:
Sim.
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.
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.
O total de bits é 4096 x 24 ou 98304 bits ou 12288 bytes.
12288 vezes 50 fornece 614400 bytes.
fonte
(display_width * display_height * bpp) / 8
bytes?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 ):
Esta linha de comando do ImageMagick
transformou-o neste:
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:
fonte
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.
fonte
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.
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.
fonte