내 주요 프로젝트 중 하나는 마이크로 컨트롤러 용 디스플레이 라이브러리입니다. 그것의 일부로 글꼴 (비트 맵)과 아이콘 (알파 채널) 모음이 있습니다.비트 단위 데이터를위한 효율적인 RLE 아이디어
마이크로 컨트롤러에서 리소스 (플래시 메모리 및 RAM)가 제한되어 있으므로 이러한 글꼴 및 아이콘에 대한 데이터를 저장하는 더 나은 방법을 찾고 있습니다.
데이터 (예 : 아미가의 ILBM과 같은)에 대해 분리 된 평면 배열을 사용하는 방향으로 기울어 있습니다. 즉, 각 픽셀의 모든 비트를 함께 저장하는 대신 전체 이미지의 모든 첫 번째 비트를 함께 저장합니다 , 2 번째 비트 등이 뒤 따른다. 이것은 2의 거듭 제곱이 아닌 이미지 깊이로 작업하는 것이 더 효율적이다. (3 비트 데이터를 8 비트 데이터 스트림으로 패킹 해 보았는가?)
나는 또한 각 비트 평면을 압축하려고합니다. RLE가 가장 현명한 것 같습니다. 그러나 정수 값이 아닌 비트 스트림으로 작업 중이므로 RLE 구현의 가장 좋은 방법은 무엇인지 궁금합니다.
저는 8 블록 단위로 비트를 처리하고 반복되는 바이트를 찾는 전통적인 방법을 고수 할 수 있습니다 (2 개 이상 동일, 2 개로 동일하게 실행 한 다음 몇 개를 더 할 것인가). 하나의 단일 비트 평면을 구성하는 비트 단위의 데이터에 대해서는 그렇게 큰 것을 알 수 없습니다. (덧붙여 말하자면, ILBM은 데이터를 순전히 바이트로 취급하고 다음 바이트를 처리하는 방법을 정의하는 "헤더"바이트로 필요에 따라 반복하여이 바이트 방식의 다양한 방법을 사용합니다.
대안으로는 교대 비트 카운트 방법을 사용하는 것입니다. 즉, 비트가 0이라고 가정하고 시작 비트를 기록하십시오. 그런 다음 1로 전환하고 실행에서 1 비트 수를 기록하십시오. 그런 다음 다시 0으로 전환하고 비트 수를 기록하십시오. 기타
같은 비트를 장기간 실행하면 좋지만 비트가 빠르게 바뀌면 최대한 많은 공간을 차지하게됩니다 (예 : 01010101
, 끝낼 수 있음). 최대 8 바이트의 [1,1,1,1,1,1,1,1]
).
여기서 가장 중요한 점은 CPU에서 압축을 풀거나 메모리에서 압축을 풀 때 작업 버퍼를 유지하는 것이 효율적이어야한다는 것입니다. 그래서 다른 방법들보다 RLE를 생각하고 있습니다.
그래서 내가 놓친 아이디어를 찾고 있습니다. 단일 비트 스트림을 압축하고 압축 된 데이터를 바이트 중심 시스템에서 표현하기위한 최상의 구현은 무엇입니까?
예 글리프 (10 진수) :
이00 00 02 14 03 00 00 00
00 00 09 13 10 00 00 00
00 00 13 05 13 00 00 00
00 05 12 00 12 06 00 00
00 11 15 15 15 11 00 00
00 14 02 00 01 14 00 00
08 12 00 00 00 12 08 00
11 07 00 00 00 07 12 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
비트 평면 0-3 따라서, 그러나
0 1 2 3
00001000 00111000 00010000 00010000
00111000 00001000 00010000 00111000
00111000 00000000 00111000 00101000
01000000 00000100 01101100 00101000
01111100 01111100 00111000 01111100
00001000 01100100 01000100 01000100
00000000 00000000 01000100 11000110
11000100 11000100 01000110 10000010
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
문자 모양이 크기가 될 것입니다 심지어 시도하지 않을 것 압박 붕대. 그것은 무의미한만큼 작습니다. 그러나 비트 플레인의 계층화와 비트 스트림이 원본 데이터와 어떻게 관련되는지를 보여줍니다.
JBIG2는 동일한 데이터 블록 (예 : 페이지의 문자)의 패턴을 반복하고 단일 1 비트 비트 맵에 최적화 된 경우 효율적입니다.멀티 비트 플레인 이미지를 사용하면 반복 된 패턴을 너무 많이 얻지는 않습니다. 특히 이미지가 글꼴의 단일 글리프 또는 아이콘 일 때 특히 그렇습니다. 여기서 우리는 아마도 2 천만 픽셀의 비트 플래 인을 말합니다 (48x48은 비트 플레인 당 2304 비트가됩니다). 나는 그것이 많이 들리지 않는다는 것을 안다. 그러나 당신이 그들 중 몇 백개를 가지고있을 때, 단지 2 백개의 kB의 저장 장치가있을 때, 크기 문제. – Majenko
그레이 스케일 이미지를 평면으로 분리하는 것은 JBIG2가 사용되는 방법과 정확하게 같습니다. 그것은 당신이 짧은 시간에 요리를 시도하는 것보다 당신의 데이터에서 더 잘 수행 될 것입니다. –