Hiểu các yêu cầu về bộ nhớ cho một tệp hình ảnh


9

Tôi muốn hiểu các yêu cầu bộ nhớ cho các tệp tài nguyên hình ảnh sẽ được hiển thị trên màn hình độ phân giải 240x400.

Màn hình có các thông số kỹ thuật sau:

thông số kỹ thuật

Nó hỗ trợ độ sâu màu lên tới 18 bit và sử dụng trình điều khiển hiển thị ILI9327.

Giả sử tôi cần hiển thị 50 biểu tượng khác nhau, mỗi biểu tượng có kích thước 10 mm X 10 mm, không gian lưu trữ cần thiết là bao nhiêu?

Dưới đây là tính toán của tôi:

Điểm ảnh trên mm = 400 / 61,2 = 6,536

Số pixel trong một hình ảnh = 65,36 x 65,36 = 4272 pixel

Mỗi pixel sẽ yêu cầu 18 bit X 3 (cho R, G và B) = 54 bit

Tổng số bit cần thiết = 4272 x 54 = 230688 bit = 28,16 kilobyte

Đối với 50 hình ảnh, tôi sẽ cần 1,375 megabyte dung lượng lưu trữ.

Tính toán của tôi có đúng không?


2
Bạn đang tính toán các yêu cầu lưu trữ cấp trên. Thông thường, hình ảnh được nén và thường nhanh hơn để đọc và giải nén khi đang di chuyển (từ thẻ SD) hơn là đọc thêm byte từ tệp không nén. Điều này thường là do I / O của thiết bị là một nút cổ chai.
Kingsley

Câu trả lời:


17

Điểm ảnh trên mm = 400 / 61,2 = 6,536

Vâng

Số pixel trong một hình ảnh = 65,36 x 65,36 = 4272 pixel

Vâng, ý bạn là pixel trên mỗi biểu tượng. Nhưng ngay cả như vậy, bạn không thể tạo các pixel phân đoạn, do đó, số của bạn phải là 65 x 65 hoặc 66 x 66. Và điều này dẫn đến việc đơn giản hóa hơn nữa. Tại sao không làm cho biểu tượng của bạn 64 x 64? Điều này sẽ đơn giản hóa các tính toán địa chỉ cho bộ nhớ của bạn và sẽ chỉ tạo ra "độ co" khoảng 2%. Và hãy tin tôi, ở kích thước này sẽ không có ai chú ý. Sau đó, các biểu tượng của bạn sẽ có kích thước 4096 pixel.

Mỗi pixel sẽ yêu cầu 18 bit X 3 (cho R, G và B) = 54 bit

Không. Như jms vừa trả lời, tổng cộng là 18 bit cho mỗi pixel hoặc 6 bit cho mỗi màu. Tuy nhiên, một lần nữa, bạn nên cân nhắc không quá lo lắng về mức độ bit. Lưu trữ giá trị màu của bạn dưới dạng byte một phần (6 bit mỗi byte) với các byte riêng biệt cho mỗi màu. Điều này sẽ chiếm thêm 33% bộ nhớ, nhưng sẽ giảm đáng kể tải xử lý của bạn khi chuyển từ bộ nhớ sang màn hình.

Tổng số bit cần thiết = 4272 x 54 = 230688 bit = 28,16 kilobyte

Tổng số bit là 4096 x 24 hoặc 98304 bit hoặc 12288 byte.

Đối với 50 hình ảnh, tôi sẽ cần 1,375 megabyte dung lượng lưu trữ.

12288 lần 50 cho 614400 byte.


1
Nhưng chắc chắn nếu chúng ta đang nói về lưu trữ liên tục thì bạn sẽ lưu trữ các biểu tượng của mình được nén dưới dạng PNG hay JPEG? Hoặc nếu chúng ta đang nói bộ đệm khung thì nó chỉ đơn giản là (display_width * display_height * bpp) / 8byte?
aroth

@aroth - Điều này giúp bạn thẳng thắn vào vương quốc của sự đánh đổi. Điều gì quan trọng hơn, kích thước bộ nhớ hoặc nhu cầu xử lý? Sử dụng các hình ảnh không nén cho phép chuyển về cơ bản không gây đau đớn với chi phí của các tệp lớn. Nó thậm chí còn dễ dàng hơn mà không cần phải giải nén dữ liệu màu từ một từ lớn hơn. Giải nén hình ảnh nén và / hoặc áp dụng bảng màu cho phép các tệp dữ liệu nhỏ hơn nhiều, nhưng nỗ lực xử lý có thể đáng sợ đối với người mới. Tất cả là vấn đề ưu tiên và hương vị.
WhatRoughBeast

11

Làm cho cuộc sống trở nên đơn giản cho chính bạn bằng cách tạo các biểu tượng 64 × 64 pixel. Vẽ một đường viền xung quanh chúng nếu bạn muốn chúng trông lớn hơn.

Với định dạng màu 16 bit, điều này chỉ yêu cầu 8 kB cho mỗi biểu tượng hoặc 400 kB cho bộ 50.

Một hình thức nén đơn giản là sử dụng bảng màu thay vì lưu trữ trực tiếp màu của mỗi pixel. 16 màu thường là quá đủ cho một biểu tượng, đặc biệt nếu bạn áp dụng phối màu sáng tạo một chút. Điều này làm giảm dung lượng lưu trữ xuống còn 2 kB mỗi biểu tượng, cộng thêm 32 byte cho bảng màu. Tổng dung lượng chỉ hơn 101 kB một chút nếu mỗi biểu tượng có bảng màu riêng.


Chỉ để thỏa mãn sự tò mò của riêng mình, tôi đã chộp được hình ảnh "trường hợp xấu nhất" sau đây (từ đây ):

sức mạnh của màu sắc

Dòng lệnh ImageMagick này

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

biến nó thành thế này:

nhập mô tả hình ảnh ở đây

Không tệ, và tất nhiên hình ảnh nguồn với dải màu hạn chế hơn sẽ xuất hiện thậm chí còn tốt hơn. Ví dụ: đây là Olin, được xử lý theo cách tương tự:

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây


2
Từ khóa: màu được lập chỉ mục . Nếu ví dụ 16 màu trên mỗi bitmap là không đủ, bạn có thể chia biểu tượng thành nhiều bitmap nhỏ hơn, mỗi màu có một bảng màu khác nhau. Áp dụng hoà sắc có thể giúp quá.
jms

9

Thêm về độ sâu màu

Mở rộng câu trả lời của Dave Tweed, bạn có thể làm tốt hơn những gì anh ấy thể hiện.

Đây là cùng một bản gốc kích thước lớn, ông đã sử dụng:

Được cắt thành hình vuông và được thu nhỏ thành 64 x 64 pixel nhưng mang lại hiệu suất màu đầy đủ (8 bit cho mỗi màu đỏ, grn, blu):

Làm tròn thông tin màu từ 8 bit trên mỗi kênh thành 6 bit cho kết quả:

Đó là những gì màn hình của bạn có thể làm, vì bạn nói nó hỗ trợ độ sâu màu 18 bit.

Làm tròn thông tin màu hơn nữa thành 5 bit cho màu đỏ, 6 cho màu xanh lục và 5 cho màu xanh lam, với tổng năng suất 16 bit / pixel:

Điều này thực sự nên có đủ tốt cho các biểu tượng.

Ngay cả khi không có bất kỳ nén nào, các biểu tượng của định dạng này chỉ mất 64 x 64 x 2 = 8192 byte. 50 hình ảnh như vậy sẽ cần 409.600 byte.


2
Hình ảnh của tôi được nén xuống 4 bit mỗi pixel (16 màu) - 2k byte mỗi biểu tượng, cộng với bảng tra cứu 32 byte. Tôi muốn thể hiện sự phối màu với một bộ màu hạn chế trông như thế nào.
Dave Tweed

Vì chúng ta đang so sánh độ sâu màu khác nhau, bạn có muốn thêm một màu với bản đồ màu 8 bit không? Điều đó sẽ đi được một nửa (logarit) giữa các biến thể 4 bit và 16 bit mà chúng ta đã có ở đây.
ilkkachu

@Dave: Điều đó không rõ ràng từ câu trả lời của bạn, nhưng điều đó giải thích cho các tạo tác hoà sắc.
Olin Lathrop

8

Mỗi pixel sẽ yêu cầu 18 bit X 3 (cho R, G và B) = 54 bit

Ước tính của bạn là không chính xác. Giá trị "18 bit" là trên mỗi pixel , không phải mỗi màu. Mỗi kênh màu đỏ, xanh lục và xanh lam có độ sâu bit tối đa là 6 bit (64 giá trị khác nhau), tổng cộng là 18 bit.
Bộ điều khiển hiển thị này cũng hỗ trợ chế độ 16 bit (trong đó dữ liệu pixel chỉ có 5 bit cho màu đỏ, 6 cho màu xanh lá cây và 5 cho màu xanh lam) giúp bạn dễ dàng đóng gói mỗi pixel thành hai byte. Điều này giúp dễ dàng lưu trữ ảnh bitmap hiệu quả và tăng lượng pixel bạn có thể ghi vào màn hình mỗi giây.

nhập mô tả hình ảnh ở đây

Số pixel trong một hình ảnh = 65,36 x 65,36 = 4272 pixel

Bạn thực tế không thể lưu trữ các pixel phân đoạn , do đó, bitmap thực tế của bạn (hình ảnh / họa tiết / ký tự / bất cứ thứ gì) có thể sẽ là 65 2 = 4225 pixel.

Đi theo lộ trình dễ dàng (định dạng pixel R5G6B5 16 bit), 4225 * 16 bit sẽ lên tới 67600 bit trên mỗi bitmap hoặc 8450 byte mỗi bitmap. 50 hình ảnh sẽ cần 423 kB (không nén).

Nếu bạn thực sự muốn độ sâu màu đầy đủ, bạn cần nhiều hơn 2 byte cho mỗi pixel. Ở giai đoạn đó, bạn có thể dành hết một byte cho mỗi màu (như WhatRoughBeast gợi ý), điều này sẽ làm tăng thêm yêu cầu lưu trữ thêm 3/2 (634 kB cho 50 bitmap 65x65).

Bạn cũng có thể đóng gói các pixel 18 bit ngay cạnh nhau trong bộ nhớ (các bit subpixel không được phân bổ theo ranh giới byte), mà không lãng phí bất kỳ bit nào. Bạn sẽ chỉ cần 476 kB cho bitmap 50 65x65 18 bit, nhưng sẽ rất khó để lập trình và xử lý chậm hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.