Bir görüntü dosyası için bellek gereksinimlerini anlama


9

Görüntü kaynak dosyalarının 240x400 çözünürlüklü ekranda görüntülenmesi için bellek gereksinimlerini anlamak istiyorum.

Ekran aşağıdaki özelliklere sahiptir:

gözlük

18 bite kadar renk derinliğini destekler ve ILI9327 ekran sürücüsünü kullanır.

Her biri 10 mm X 10 mm boyutunda 50 farklı simge göstermem gerektiğini varsayarsak, gerekli depolama alanı nedir?

İşte benim hesaplamalarım:

Mm başına piksel = 400 / 61,2 = 6.536

Bir görüntüdeki piksel sayısı = 65,36 x 65,36 = 4272 piksel

Her piksel için 18 bit X 3 gerekir (R, G ve B için) = 54 bit

Gereken toplam bit = 4272 x 54 = 230688 bit = 28,16 kilobayt

50 resim için 1.375 megabayt depolama alanına ihtiyacım olacak.

Hesaplamam doğru mu?


2
Üst düzey depolama gereksinimlerini hesaplıyorsunuz. Tipik olarak görüntüler sıkıştırılır ve çoğu zaman sıkıştırılmamış bir dosyadaki fazladan baytları okumaktan daha hızlı okumak (SD karttan itibaren) okumak ve açmak daha hızlıdır. Bunun nedeni genellikle cihaz G / Ç'nin bir darboğaz olmasıdır.
Kingsley

Yanıtlar:


17

Mm başına piksel = 400 / 61,2 = 6.536

Evet.

Bir görüntüdeki piksel sayısı = 65,36 x 65,36 = 4272 piksel

Simge başına piksel demek istediniz. Ancak öyle olsa bile, kesirli pikseller üretemezsiniz, bu nedenle sayınız 65 x 65 veya 66 x 66 olmalıdır. Bu da daha fazla basitleştirmeye yol açar. Neden simgelerinizi 64 x 64 yapmıyorsunuz? Bu, belleğiniz için adres hesaplamalarını basitleştirecek ve yalnızca yaklaşık% 2'lik bir "büzülme" üretecektir. Ve güven bana, bu boyutta kimse fark etmeyecek. Ardından simgeleriniz 4096 piksel boyutunda olacaktır.

Her piksel için 18 bit X 3 gerekir (R, G ve B için) = 54 bit

Hayır! Jms'nin cevapladığı gibi, piksel başına toplam 18 bit veya renk başına 6 bittir. Yine de, bit seviyesi hakkında çok fazla endişelenmemeyi düşünmelisiniz. Renk değerlerinizi renk başına ayrı baytlarla kısmi bayt (bayt başına 6 bit) olarak saklayın. Bu,% 33 daha fazla bellek alır, ancak bellekten ekrana aktarırken işlem yükünüzü önemli ölçüde azaltır.

Gereken toplam bit = 4272 x 54 = 230688 bit = 28,16 kilobayt

Toplam bit sayısı 4096 x 24 veya 98304 bit veya 12288 bayttır.

50 resim için 1.375 megabayt depolama alanına ihtiyacım olacak.

12288 çarpı 50, 614400 bayt verir.


1
Ancak, kalıcı depolamadan bahsediyorsak, simgelerinizi PNG veya JPEG olarak sıkıştırılmış olarak depolar mısınız? Ya da framebuffer'dan bahsediyorsak, sadece (display_width * display_height * bpp) / 8bayt mı?
aroth

@aroth - Bu sizi kare olarak takas alanına götürür. Daha da önemlisi, bellek boyutu veya işlem talepleri? Sıkıştırılmamış görüntülere gitmek, büyük dosyaların pahasına ekrana ağrısız bir aktarım sağlar. Daha büyük bir kelimeden renkli verileri açmaya gerek kalmadan daha da kolay. Sıkıştırılmış bir görüntünün paketinden çıkarılması ve / veya renk tablolarının uygulanması çok daha küçük veri dosyalarına izin verir, ancak işleme çabası bir acemi için korkutucu olabilir. Her şey öncelikler ve lezzet meselesi.
WhatRoughBeast

11

Simgeleri 64 × 64 piksel yaparak hayatı kendiniz kolaylaştırın. Daha büyük görünmelerini istiyorsanız etraflarına bir kenarlık çizin.

16-bit renk formatı ile bu, ikon başına sadece 8 kB veya 50 set için 400 kB gerektirir.

Sıkıştırmanın basit bir yolu, her pikselin rengini doğrudan saklamak yerine bir renk tablosu kullanmaktır. 16 renk bir simge için genellikle fazlasıyla yeterlidir, özellikle de biraz yaratıcı renk taklidi uygularsanız. Bu, depolama alanını simge başına 2 kB'ye, ayrıca renk tablosu için 32 bayta düşürür. Her simgenin kendi renk tablosu varsa toplam depolama alanı 101 kB'ın biraz üzerindedir.


Sadece kendi merakımı tatmin etmek için, aşağıdaki "en kötü durum" imajını aldım ( buradan ):

renklerin gücü

Bu ImageMagick komut satırı

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

bunu şu hale getirdi:

resim açıklamasını buraya girin

Kötü değil ve elbette daha sınırlı renk yelpazesine sahip kaynak görüntüler daha da iyi olacak. Örneğin, işte Olin, aynı şekilde işlendi:

resim açıklamasını buraya girin resim açıklamasını buraya girin


2
Anahtar kelime: dizine alınmış renk . Örneğin, bitmap başına 16 renk yeterli değilse simgeyi, her biri farklı bir palete sahip olan birkaç küçük bitmap'e bölebilirsiniz. Renk taklidi uygulamak da yardımcı olabilir.
jms

9

Renk derinliği hakkında daha fazla bilgi

Dave Tweed'in cevabına genişleyerek, gösterdiklerinden daha iyisini yapabilirsiniz.

İşte aynı büyük boyutlu orijinal:

Kare olarak kırpılır ve 64 x 64 piksele küçülür, ancak tam (kırmızı, grn, blu başına 8 bit) renk elde edilir:

Renk bilgisini kanal başına 8 bitten 6 bit'e yuvarlamak şöyle sonuçlanır:

Ekranınızın yapabileceği budur, çünkü 18 bit renk derinliğini desteklediğini söylersiniz.

Renk bilgisini toplamda 16 bit / piksel verimi için kırmızı için 5 bit, yeşil için 6 ve mavi için 5'e yuvarlama:

Bu gerçekten simgeler için yeterince iyi olmalı.

Sıkıştırmasız bile, bu biçimdeki simgeler yalnızca 64 x 64 x 2 = 8192 bayt alır. Bu tür 50 görüntü için 409.600 bayt gerekir.


2
Resmim piksel başına 4 bit (16 renk) - simge başına 2 bin bayt artı 32 baytlık bir arama tablosu şeklinde sıkıştırıldı. Sınırlı renk setiyle renk taklidinin neye benzediğini göstermek istedim.
Dave Tweed

Farklı renk derinliklerini karşılaştırdığımız için, 8 bit renk eşlemesine sahip bir tane eklemeye özen gösterin mi? Bu, burada zaten bulunan 4 bit ve 16 bit varyantlarının yarısında (logaritmik olarak) olurdu.
ilkkachu

@Dave: Bu, cevabınızdan net değildi, ama titrek eserleri açıklıyor.
Olin Lathrop

8

Her piksel için 18 bit X 3 gerekir (R, G ve B için) = 54 bit

Tahmininiz yanlış. "18 bit" değeri renk başına değil piksel başınadır. Kırmızı, yeşil ve mavi kanalların her birinin maksimum bit derinliği 6 bit (64 farklı değer), toplam 18 bittir.
Bu ekran denetleyicisi aynı zamanda her bir pikseli yalnızca iki bayta paketlemeyi kolaylaştıran 16 bitlik bir modu (piksel verilerinin yalnızca 5 bit, yeşil için 6 ve mavi için 5 olduğu) destekler. Bu, bitmap'leri verimli bir şekilde depolamayı kolaylaştırır ve ekrana saniyede yazabileceğiniz piksel miktarını artırır.

resim açıklamasını buraya girin

Bir görüntüdeki piksel sayısı = 65,36 x 65,36 = 4272 piksel

Kesirli pikselleri pratik olarak depolayamazsınız , bu nedenle gerçek bitmap'leriniz (resimler / spritelar / karakterler / ne olursa olsun) muhtemelen 65 2 = 4225 piksel olacaktır.

Kolay rotaya gidildiğinde (16 bit R5G6B5 piksel biçimi), 4225 * 16 bit, bitmap başına 67600 bit veya bitmap başına 8450 bayt anlamına gelir. 50 görüntü 423 kB gerektirir (sıkıştırma olmadan).

Tam renk derinliğini gerçekten istiyorsanız, piksel başına 2 bayttan daha fazlasına ihtiyacınız vardır. Bu aşamada, her bir renk için bir bayt ayırabilirsiniz (WhatRoughBeast'in önerdiği gibi), depolama gereksinimini 3/2 (50 65x65 bitmap için 634 kB) daha da şişirir.

Ayrıca 18 bit pikselleri bellekte yan yana (bayt sınırları ile hizalanmamış alt piksel bitleri), herhangi bir bit israf etmeden paketleyebilirsiniz. 50 65x65 18 bit bitmap'ler için yalnızca 476 kB'ye ihtiyacınız olacak, ancak programlanması bir acı ve işlenmesi daha yavaş olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.