DPI 的真相:PNG pHYs 的「像素每米」、JFIF density,与印刷尺寸的一笔账

72dpi 的图改成 300dpi,文件大了吗?没有——一个像素都没变,变的只是「打印时每英寸摆多少像素」的解释权。这篇拆解 DPI 在 PNG(pHYs 块、单位竟是像素每米)与 JPEG(JFIF APP0 的 density 字段)里的真实存放位置、字节级改写为什么要重算 CRC32,以及「A4 300dpi 要多大像素」这笔印刷方最爱算的账。

重复文件查找三级漏斗:大小分桶、首尾 64KB 快哈希与诚实的「疑似」标注

找出硬盘里的重复文件,直觉做法是「每个文件算一遍哈希再比对」,但一万张照片就是上百 GB 的读取量。正确姿势是三级漏斗:先按字节大小分桶(大小不同必不重复),再对同桶文件只读首尾各 64KB 算快哈希,最后只剩极少数候选做全量 SHA-256。这篇拆每级淘汰率、为什么读首尾两头、以及超过 100MB 的文件为什么诚实标注「疑似」而不装确定。

音频变速的两条路:线性插值重采样,与 2048 采样窗的 WOLA 时间拉伸

1.5 倍速播 podcast,声音变尖了还是没变?取决于走哪条路:重采样是按倍距重读采样、音高随速度一起变,一行循环就能写完;变速不变调则要把音频切成 2048 采样的颗粒、加 Hann 窗重叠搬移、再按窗权归一化(WOLA)。这篇把两条路的数学、参数取舍与 4 倍重叠的窗和陷阱逐一拆开。

vCard 解剖:一行一属性、75 字符折行与 iPhone item1. 分组的私有方言

手机通讯录导出的 .vcf 是纯文本:BEGIN:VCARD 开场、一行一个属性、分号分隔结构化字段。这篇拆解 vCard 的转义次序为什么不能乱、规范折行如何用「换行加空格」回接长行、N 与 FN 谁说了算、中文名该怎么拆,以及 iPhone 导出文件里 item1.TEL 这类私有分组写法的兼容处理。

口播静音切除:50ms 窗 RMS、扫描线判定与切不坏句尾的收边算法

口播录音里「嗯——」与句间长停顿占掉两成时长,切除它们不是波形上看一眼那么简单:按 50ms 窗算 RMS 响度、与 dBFS 阈值逐窗比较、把连续低于阈值的运行段聚成静音区、两侧各收 50ms 边防止切掉气声尾音,最后按保留段把采样逐字节拼回 WAV。这篇拆解整条算法链的每一步取舍。

EPUB 解剖:一个 ZIP 如何装下一本书,mimetype 为何必须第一个且不压缩

EPUB 3 的本质是一个改了打包规矩的 ZIP:mimetype 条目必须排第一、必须 STORE 不压缩,META-INF/container.xml 指路,OPF 清单串起章节与双目录(EPUB 3 的 nav 加兼容旧阅读器的 toc.ncx)。这篇按规范逐层拆开 .epub,并讲 TXT/Markdown 按章节切分的正则细节与为什么全程可以在浏览器里完成。

ID3 标签解剖:synchsafe 整数、反同步与 MP3 乱码歌名的字节级真相

MP3 里显示的歌名、歌手、封面不是音频数据,是嵌在文件头部的 ID3 标签。这篇逐字节拆解 ID3v2 的帧结构:synchsafe 整数为什么要砍掉每个字节的最高位、unsynchronisation 防的是什么假警报、四种文本编码如何决定中文是正常显示还是乱码,以及文件末尾那 128 字节的 ID3v1 遗产。

DEFLATE 解剖:LZ77 与霍夫曼如何压掉七成体积,gzip 头尾字段逐个讲

gzip 文件 = 10 字节头 + DEFLATE 流 + 8 字节尾。这篇拆开三层:RFC 1952 的容器字段、RFC 1951 里 LZ77 滑窗与霍夫曼编码的接力、以及浏览器 CompressionStream 一行流式 API 的能力边界——为什么没有压缩级别参数、为什么多成员 gzip 只解出第一个。

节拍检测:自相关如何从波形里「听」出 BPM

人耳听 BPM 靠打拍子,机器靠统计。降混单声道、能量包络、onset 半波整流、滞后自相关——四级流水线把节拍从波形里算出来,再加上八度歧义、抛物线插值与置信度,拆解 BPM 检测的每一步。

浏览器视频处理管线:MediaRecorder 的能力与妥协

不装 ffmpeg、不上传云端,浏览器也能旋转、变速、拼接视频——代价是理解三个约束:录制实时进行、编码器可用性因浏览器而异、变速的音调需要专门兜底。拆解从 video 解码到 MediaRecorder 出片的完整管线,以及本地管线的适用边界。