10 万条记录改一条:文本文件 737 毫秒,数据库 0.2 毫秒
同样 10 万条数据改一条:文件 737 毫秒,数据库 0.2 毫秒。
照片带不带拍摄地点,不看画面有没有打码,看你是怎么存的那一份。

手机按下快门的时候,除了画面,还会往文件里写一段文字:手机型号、机身序列号、拍摄时间、当时站在哪个经纬度。
这段文字叫 EXIF(拍摄信息,藏在图片文件里的一小段记录,看图软件平时不显示)。
它像快递箱外贴的运单:箱子里是画面,运单上写着谁寄的、什么时候寄的、从哪儿寄的。
我手上没有一张真带定位的手机原图,所以照手机拍照的格式,给自己一张壁纸写了一份进去。字节是真的,读法也是真的。
然后拿这张 970,505 字节的图,用 10 种常见办法各存一份,看坐标还在不在。
10 种里 4 种把定位带走了,6 种弄丢了。
带走的那 4 种,共同点是文件里的拍摄信息被原样搬了过去。直接复制最干脆,一个字节都不改。另外 3 种是我处理时主动勾了「带上拍摄信息」。
不勾的时候,PIL(常用的图片处理库)默认不搬这段;ffmpeg(转码工具)重新编码也不搬;浏览器里把图画到画布上再导出,同样不搬。
这 4 份带信息的,机身序列号是同一串。别人拿到两张图,一比就知道出自同一台手机。
那段信息一共 4,407 字节,占原文件 0.45%。拿 801,398 和 805,805 这两份对比就清楚:压缩质量一样,差的就是这 4,407 字节。
这处我没预料到。拍摄信息里还夹着一张 74×160 的小预览图,3,999 字节,占那 4,407 的九成。
我把主图下半部分裁掉了,拍摄信息照原样带上。打开那张小预览图,下半部分一帧没少,还是完整的原画面。
逐像素比过:小预览图和原图平均差 5.55,和裁过的图平均差 59.16。前者是压缩噪点,后者是真的换了内容。
道理不复杂。小预览图是按下快门那一刻生成的,之后主图怎么修、怎么裁,都碰不到它。所以涂黑、打码、裁掉之前,先把拍摄信息清掉,不然等于白干。
查有没有:手机相册点开照片看「详细信息」,里面出现位置或者地图,就是带着。
电脑上看原始数据,装了 Python 一行就够:
python3 -c "from PIL import Image;e=Image.open('照片.jpg').getexif();print(dict(e.get_ifd(0x8825)))"
我这张跑出来是 {1: 'N', 2: (39.0, 54.0, 26.8), 3: 'E', ...},北纬 39 度 54 分、东经 116 度 28 分,北京城里随便一个路口。
清掉最省事:另存一份、不勾带原信息,或者干脆转 PNG、截个图。上面丢定位的 6 种都行,代价是画质或者体积。我这图按 90 的质量另存后 926,109 字节,拍摄信息从 4,407 字节变成 0。
只想删坐标、留着拍摄时间和型号也行:把定位那一块抹掉,别的照旧,文件 970,321 字节。
下次发图前我只确认两件事:图里有没有坐标,里面有没有那张 74×160 的小图。
同样 10 万条数据改一条:文件 737 毫秒,数据库 0.2 毫秒。
18.6 MB 字体按页面用字裁到 232.7 KB,附四个坑
同一段 63 秒视频 9 种压法实测:设得越清楚,文件越大画质没变好。