#image-format #pixel-art #image-compression #color-palette #image-encoding #pie #lossless

bin+lib pie_format

PIE - 像素索引编码 - 可选外部调色板的图像格式,特别适合像素艺术。参考实现和 PNG -> PIE CLI。

2 个稳定版本

1.0.1 2023 年 3 月 29 日

#823图像

MIT/Apache

430KB
311 代码行

PIE - 像素索引编码

版本 1.0.1

描述

这种无损图像格式仅可选地存储文件中的颜色。它设计用于与一个调色板一起使用,解码器可以从该调色板中采样颜色。

使用外部调色板可以将未压缩的图像大小减少 75%,假设是 RGBA 这样的四通道格式,或者 60%,假设是 RGB 无透明度的三通道格式。

使用内部调色板将根据调色板大小增加大小,但通常比 PNG 等其他格式更小,适用于像素艺术。

比较

在 images/ 文件夹中,您可以找到来自 lospec.org 的随机选择 .png 像素艺术图像以及转换后的 .pie 文件。如果您有任何这些图像属于您并且希望将其删除,请创建一个问题。

文件 大小差异
a-strawberry-dude-509249.pie 77.00% 的 png 版本大小
cubikism-023391.pie 81.00% ..
dune-portraits-787893.pie 74.00% ..
goblin-slayer-808592.pie 63.00% ..
khorne-berserker-509756.pie 50.00% ..
snowfighter-844418.pie 64.00% ..

内存布局

┌─ PIE Image Format ──────────────────────────────────────────────┐
│ magic    u8[3] -- Magic bytes "PIE"                             │
│ version  u8    -- Version                                       │
│ width    u16   -- Width in pixels (BE)                          │
│ height   u16   -- Height in pixels (BE)                         │
│ flags    u8    -- 0b00000001 is whether the palette is included │
│                -- 0b00000010 is whether there is transparency   │
│                -- Other bits are reserved for future updates    │
│ length   u16   -- Run count of the data section (BE)            │
│ data     u8[]  -- Indices into palette (external or internal)   │
│ palette? u8[]  -- Optional palette included in the image        │
│                -- Stride can be 3 or 4 depending on RGB/RGBA    │
└─────────────────────────────────────────────────────────────────┘

数据压缩

鉴于这种格式是为像素艺术图像设计的,因此做出了一些假设。

  1. 调色板通常有 2-64 种颜色,很少超过 256。
  2. 水平重复像素将是常见的。

因此

  • 调色板可能包含多达 256 种颜色。调色板的索引可能由一个字节表示。
  • 使用 RLE(行程长度编码)对具有相同索引的水平像素序列进行编码。
  • 不考虑垂直轴。

序列长度不能超过 255 像素,并且它们作为字节数组的一部分回绕到下一行,因为字节数组是一维的,没有行的概念。

调色板压缩

调色板未进行压缩。

依赖关系

~1MB
~20K SLoC