这个问题涉及游程编码。这是一种在不丢失任何信息的情况下减小图像文件大小的方法(无损压缩)。游程编码依赖于像素值的统计相关性,例如相同颜色的长串像素。我们从一个简单的例子开始,如下所示:我们可以从左上角开始逐行列出像素值(白色为 1,黑色为 0),如下所示:11111100111111000111110...100111111 很明显,白色和黑色像素都有长串。在这种情况下,在每个字符串中存储像素数会更有效。使用约定
我们总是从一串白色像素开始,图像可以写成 6,2,6,3,5,3,5,3,5,3,5,2,6。由于我们需要存储的最大数字是 6,并且 22 −1 = 3 < 6 ≤ 7 = 23 −1,因此对于每个值的固定位长,我们需要每个数字 3 位。由于有 13 个像素串,我们总共需要 13×3 = 39 位。这与直接以每像素(黑色或白色)一位存储的图像的存储空间相比,需要 54 位(因为有 54 个像素)。
答案1
\documentclass{article}
\makeatletter
\newif\ifwhite
\newcommand\zz[1]{%
\begin{flushleft}
\hsize=\dimexpr9em+18\fboxsep+18\fboxrule\relax
\whitetrue
\@for\z:=#1\do{%
\loop
\fbox{\ifwhite\phantom{\rule{1em}{1em}}\else\rule{1em}{1em}\fi}%
\linebreak[0]%
\edef\z{\the\numexpr\z-1\relax}%
\ifnum\z>0
\repeat
\ifwhite\whitefalse\else\whitetrue\fi
}%
\end{flushleft}
}
\makeatother
\begin{document}
\zz{6,2,6,3,5,3,5,3,5,3,5,2,6}
\end{document}