development
RLE란 무엇인가? (feat. Notion AI)
주먹불끈
2023. 4. 24. 00:19
개요
RLE라는 개념을 알게 되었다. 이미지의 마스크를 서버간 통신으로 전달할 때에 용량을 줄일 수 있다고 한다. 기존 방식으로 정리를 한다면 구글링부터 하고 정보들을 모아서 정리하였겠지만 이번에는 노션의 AI 기능을 적극 활용해 보았다. 작성을 하고 드는 생각은
- 내가 직접 쓰는 것보다 훨씬 세련되게 작성이 된다.
- 이렇게 작성할 수 있게 된 시대에 블로그 포스팅은 어떤 의미를 가지게 되는가?
- 블로그 포스팅에서는 존칭을 안쓰려 하는데 존칭으로 작업이 된다
RLE란?
RLE은 **"Run Length Encoding"**의 약자로, 이미지나 비디오 데이터를 압축하는 데 사용되는 압축 알고리즘 중 하나입니다. 이 알고리즘은 이미지에서 연속된 픽셀 값이 반복되는 경우, 그 값을 반복되는 횟수와 함께 저장하여 데이터를 압축합니다. 이를 통해 데이터 용량을 줄일 수 있습니다.
RLE 알고리즘 다이어그램
알고리즘 자체는 간단하다. 11111000 이라면 1이 5개, 0이 3개이니 1503인 것이다.
실제 구현
실제로 적용할 때에는 다음의 단계를 생각할 수 있다.
- 마스크 이미지를 바이너리 값으로 변환한다.
- 위에 언급한 RLE 방식으로 값을 변환한다.
- 이를 zlib로 한 번 더 압축한 다음
- 바이너리를 통신 전송하기 위해 base64로 변환한다.
다음 코드는 위 내용을 Notion AI에게 Golang으로 예시를 보여달라 요청한 것이다.
func main() {
// assume mask is a 2D boolean array
mask := [][]bool{
{true, true, false},
{false, true, false},
{false, false, true},
}
// encode mask using RLE
var buf bytes.Buffer
var count int32
var value bool
for _, row := range mask {
for _, pixel := range row {
if pixel == value {
count++
} else {
binary.Write(&buf, binary.BigEndian, count)
buf.WriteByte(byte(value))
count = 1
value = pixel
}
}
}
binary.Write(&buf, binary.BigEndian, count)
buf.WriteByte(byte(value))
// compress using zlib
var compressed bytes.Buffer
writer := zlib.NewWriter(&compressed)
writer.Write(buf.Bytes())
writer.Close()
// encode using base64
encoded := base64.StdEncoding.EncodeToString(compressed.Bytes())
fmt.Println(encoded)
}
반응형