CD-RW相变层可见图像逆向工程:从占空比映射到EFM编码 我第一次把一张刻坏的CD-RW对着台灯转了个角度才意识到盘面那层若有若无的暗纹并不是“烧焦了”而是相变记录层在可见光下留下的反射率差。后来我反复琢磨“用CD-RW刻录可见图像”这件事发现它本质上是一个介于数据编码和光学艺术之间的逆向工程普通刻录机只认扇区、帧、EFM游程和CIRC校验而人眼看到的是轨道上非晶态标记与晶态间隔的宏观分布。把一张照片、一段文字或一个几何图案“写”进CD-RW让它不需要特殊光雕设备也能在斜光、偏振光或微距镜头下显影核心不在于画图软件而在于把像素灰度翻译成记录层的占空比再翻译成合法的通道位流。这个方向适合喜欢折腾光盘底层格式、对相变材料、光学观察和命令行走廊有基本概念的人也适合想理解“数据如何变成物质痕迹”的爱好者。它解决的不是高清印刷问题而是让一张可擦写光盘成为低分辨率、强材质感的光学载体并且整个过程可以测量、可以校准、可以复现。下面我按我实际推演和试做的顺序把边界、原理、编码链路、操作流程和踩坑记录完整拆开。1. 先把边界说清CD-RW上的“可见图像”到底是什么1.1 记录层相变而不是盘面印刷很多人一听“光盘刻录图像”第一反应是盘面光雕或者贴纸打印。这里必须先把概念钉死我讨论的是CD-RW的相变记录层。CD-RW盘片内部有一层以硫系合金为主的记录材料激光聚焦后局部加热到熔化温度再快速冷却会形成非晶态标记擦除时用较低功率加热到结晶温度并缓慢冷却又回到晶态。晶态和非晶态的反射率不同宏观上就表现为轨道上深浅不一的纹理。这个纹理不是油墨不是涂层脱落也不是激光烧穿的坑而是材料相态变化带来的光学差异。它很薄、很细、对比度有限所以必须在合适角度下观察不能指望像打印纸一样正对着看。这也解释了为什么CD-RW可以反复擦写而CD-R写完一次就固定。CD-R靠有机染料变色CD-RW靠相变可逆。做可见图像时CD-RW的优势是你可以先写测试图案、观察、擦除、再调参数劣势是相变层的反射率差本来就不大图案容易发灰、发淡需要靠半色调和观察技巧放大。它更像在金属表面做微弱的氧化纹理而不是在白纸上画黑线。1.2 与光雕类方案的差异和取舍市面上有些盘面光雕方案是在盘片表面涂层上直接用激光烧出可见图案分辨率和对比度通常更好但需要盘片和刻录机同时支持素材和硬件绑定很强。CD-RW相变图像走的是另一条路不依赖盘面涂层不依赖厂商私有指令而是利用标准刻录链路本身留下的记录痕迹。它的好处是通用性更强坏处是分辨率受轨道间距、EFM游程和纠错编码限制图案更像“光学纹理画”不是照片级输出。路线成像位置对比度来源分辨率特点可逆性主要限制盘面光雕类方案盘面涂层涂层烧蚀变色较高受涂层限制通常不可逆需专用盘片和固件支持CD-RW相变图案记录层晶态与非晶态反射率差轨道级纹理宏观可见可擦写编码约束强观察角度敏感普通数据刻录记录层合法扇区数据痕迹不追求视觉可擦写数据模式与图像无关专业母盘直写感光层或金属层显影或烧蚀很高不可逆设备门槛高不适合桌面环境我选CD-RW路线是因为它能把“数据编码”和“光学艺术”接在一起你写的仍然是合法扇区但你会刻意挑选数据模式让EFM编码后的标记密度在宏观上呈现灰度。这个取舍决定了后面所有工作都要围绕“可写性”和“可见性”的平衡展开不能为了图像好看而写出刻录机不认的非法帧。1.3 逆向工程的对象是映射关系而不是破解标题里的“逆向工程”容易被误解。我做的不是破解固件也不是绕过版权保护而是逆向一套映射图像像素坐标如何落到盘片的逻辑地址灰度值如何落到非晶态标记的占空比占空比又如何被EFM和CIRC改写成实际通道位流。正向看刻录机把用户数据变成激光脉冲逆向看我想先决定激光脉冲在盘面上留下的宏观纹理再反推应该喂给它什么数据。这个映射不是一一对应的。CIRC会插入校验字节EFM会把8位数据变成14位通道位合并位还会改变游程。所以你不能简单地说“这个像素是黑就写0xFF”。更现实的做法是建立候选数据块库先用编码模拟器算出每个候选块在局部轨道上的标记占空比再拿目标灰度去匹配。分辨率越低匹配越容易图案越复杂越需要接受纹理化和误差。这个认知很关键否则你会在一开始就追求“照片级”然后被编码约束反复打脸。2. 光学与材料为什么刻过的轨迹能在斜光下显影2.1 盘片截面和相变层的角色一张CD-RW从下往上大致包括透明基板、记录层、保护层、反射层和涂层。激光从基板侧进入穿过透明层聚焦到记录层。记录层很薄相变区域更薄所以肉眼看到的不是“坑”而是反射率分布。盘面有预刻沟槽沟槽负责引导轨道并提供地址信息轨道间距通常在1.6微米量级。这个尺度远小于人眼分辨率但成千上万条轨道上的明暗差异叠加起来就会形成肉眼可见的宏观图案。我在斜光下观察时会看到类似同心螺旋的细纹这不是图像本身而是轨道结构。真正由数据造成的差异是某些轨道段更暗、某些段更亮。因为CD是CLV恒线速轨道是螺旋连续的所以任何图案都会带一点螺旋感。你想做同心圆、放射线或者文字都要接受这个基底纹理。它像在粗布上刺绣布纹永远在。2.2 晶态与非晶态反射率差的实际表现晶态区域原子排列有序反射率相对高非晶态区域排列无序反射率相对低。两者差异不是黑白分明通常只是百分之十几甚至更小的相对变化。正对光看可能只觉得盘面有点“脏”斜着看或者用偏振片压掉部分镜面反射对比度才会出来。这个特性决定了图像设计要避免大面积中间灰因为中间灰在低对比度下最容易糊成一片。高对比的黑白块、粗线条、大字和几何图形成功率明显高于细腻人像。我自己的经验是把目标图像先做“二值化粗化”处理再考虑半色调。比如一个圆形徽记可以用密集非晶态标记做暗部用晶态间隔做亮部边缘留出明显过渡。细小的抗锯齿在屏幕上好看刻到盘上会被轨道和游程吃掉。观察时用手机微距加侧光比肉眼直接看更容易记录但拍摄角度要固定否则同一张盘不同照片的对比度没法比较。2.3 功率窗口和速度选择的基本计算CD-RW的写入功率有一个窗口太低材料达不到熔化温度标记不成形太高可能过度加热、擦除不干净或者损伤记录层。不同盘片标称的功率范围不同刻录机会根据ATIP信息和策略表调整。我不建议一上来就手动改功率先用中低速测试更稳。速度方面1倍速CD的线速度大约在1.2到1.4米每秒4倍速就是四倍左右。速度越高激光在每一点上的驻留时间越短相变冷却过程越难控制图案对比度往往越差。一个粗略的估算如果轨道间距按1.6微米算1倍速下每秒走过的轨道长度约1.2米相当于每秒经过约75万个轨道间距的纵向尺度但横向只有一条轨道宽。实际图像分辨率更多受轨道间距和EFM游程限制不是受主轴转速限制。速度选择的核心不是“算出一个绝对最优”而是让刻录机工作在它策略表里比较保守的区间。我通常从4倍速开始如果图案太淡就降到2倍速如果盘片标称不支持低速就按标称来。不要用最高速做艺术盘失败率会明显上升。注意CD-RW的擦除功率通常高于写入功率反复擦写会增加材料疲劳。测试图案不要在同一小段轨道上反复写擦十几次换一段区域做对照更可靠。3. 数据编码链路图像如何被“翻译”成EFM游程3.1 从像素灰度到占空比的半色调映射图像进入光盘之前先要变成“每个局部区域需要多少非晶态标记”的图。最简单的映射是占空比设目标灰度归一化为g范围0到1暗部希望非晶态标记多亮部希望晶态间隔多。可以定义占空比d d_min g × (d_max - d_min)。d_min和d_max不是0和1因为EFM游程限制决定了标记和间隔都不能无限长或无限短。实际可用范围可能在0.2到0.8之间具体要靠编码模拟器测。半色调的作用是把连续灰度变成局部密度。比如一个16×16像素的块目标灰度0.5不是让每个点都半黑而是让其中一半左右的通道位段处于非晶态。因为人眼和相机在宏观距离上看的是平均反射率局部密度够了就会形成灰度感。这里的关键是“局部”要大于编码约束的尺度否则你想要的灰度会被EFM和CIRC打散。我的做法是先把图像缩小到很低的分辨率比如64×64或128×128再用块状半色调映射到扇区段最后接受它变成纹理画。3.2 扇区、帧和CIRC为什么不能直接写像素CD的一个扇区有2352字节用户数据分成98帧每帧24字节数据加校验再经过CIRC交织和EFM调制。CIRC是交叉交织里德-所罗门码用来纠突发错误EFM是8到14调制把8位数据变成14位通道位并保证游程在3到11个通道位之间。你写进去的用户数据不是最终盘面标记最终标记是编码后的通道位序列。CIRC会插入校验字节EFM会改变位模式合并位还会根据前后符号调整。这意味着“像素到字节”的映射必须经过编码器。你不能直接控制每一个非晶态标记的长度和位置只能通过选择用户数据来间接影响。一个实用的方法是建立候选块库准备若干种2352字节的扇区数据模式比如全零、全FF、交替模式、伪随机模式、特定游程模式先用软件模拟CIRC和EFM统计每种模式在局部产生的标记占空比和低频纹理。然后根据目标灰度选择最接近的候选块。这样虽然分辨率粗但可写、可读、可复现。3.3 EFM游程限制对图像纹理的影响EFM的3T到11T游程限制会让图像出现一种“条纹化”的底层纹理。短游程多标记密集看起来偏暗长游程多间隔宽看起来偏亮。但你不能随意制造任意长度的游程因为编码表有限。结果是同样的灰度在不同数据模式下可能呈现不同的颗粒感。有的区域像细密砂纸有的区域像粗条纹。做艺术盘时这种纹理不是缺点反而可以当作风格。但如果你想要平滑渐变就会很难。我试过用交替的短游程模式做暗部用较长的游程模式做亮部中间灰度靠混合块实现。效果是近看颗粒明显远看有灰度。后来我干脆放弃平滑渐变改用三到五级灰度的海报化风格图案反而更干净。这个取舍很现实CD-RW的可见图像不是印刷它是光学纹理接受纹理才能做好。3.4 地址区、TOC和写入范围保护光盘不是一整片空白磁带它有导入区、目录区、数据区和导出区。ATIP预刻沟槽里带着绝对时间信息刻录机靠它定位。RAW写入虽然能让你更自由地组织扇区但也不能随便写到系统区否则盘片可能无法识别甚至让刻录机反复重试。我的原则是只在数据区中段做图案前后留出安全边界先写一张纯数据测试盘确认刻录机认盘再做图案盘。不要把图案写到最内圈因为那里有导入区和文件系统关键结构也不要把最外圈写满边缘区域容错更低。如果你只是做观察用不要求数据可读仍然建议保留合法扇区结构。完全乱写可能让刻录机在写入过程中报错或者写完后无法擦除。可擦写盘的价值在于可逆别为了艺术把盘写成“一次性废片”。4. 实操流程从测试盘到可观察图案4.1 硬件、耗材和安全准备我建议准备三张以上同规格CD-RW做对照一张纯数据测试一张低密度图案测试一张正式图案。刻录机选择支持RAW DAO写入、对CD-RW支持较稳的型号不必追求高速。观察工具包括侧光手电、手机微距镜头、偏振片和黑色卡纸。黑色卡纸用来挡住环境反射偏振片用来压掉部分镜面反光侧光角度控制在20到40度之间比较容易看出纹理。安全上不要拆开刻录机不要直视激光出口不要用刀片刮盘面不要用酒精或溶剂擦相变层。盘面有灰用柔软镜头布从中心向外轻擦。环境光线也会影响判断。白天窗边散射光下看不清的图案晚上用单侧光可能很清楚。每次观察记录角度和光源不然你没法比较两张盘。刻录前让盘片回到室温不要刚从冷柜或暴晒环境拿出来就写。刻录机连续工作会发热写两三张后停一会儿等温度稳定再继续。4.2 生成图案数据的伪代码思路下面是我常用的伪代码框架重点不是某个库而是映射关系。先把图像缩到低分辨率再映射到逻辑地址段再为每个块选候选数据模式。实际实现时候选块要先经过CIRC和EFM模拟打分这里用score_block表示。# 伪代码从低分辨率灰度图生成候选扇区序列 # 输入gray_img[y][x] 取值0.0到1.00为亮1为暗 # 输出pattern.bin按扇区排列的2352字节块 def gray_to_target_duty(g): d_min, d_max 0.20, 0.78 return d_min g * (d_max - d_min) def lba_to_xy(lba, sectors_per_row96): # 简化映射实际要用ATIP校准这里只做示意 return lba // sectors_per_row, lba % sectors_per_row def choose_block(target_duty, candidate_blocks): best None best_err 1e9 for block in candidate_blocks: duty score_block(block) # 模拟CIRCEFM后的局部占空比 err abs(duty - target_duty) if err best_err: best_err err best block return best candidate_blocks build_candidates() # 全零、全FF、交替、伪随机、游程模式等 image load_low_res_image(pattern.png) # 64x64或128x128 out bytearray() for y in range(image.height): for x in range(image.width): g image.get(x, y) duty gray_to_target_duty(g) block choose_block(duty, candidate_blocks) out.extend(block) write_raw_dao(pattern.bin, speed4, buffer_underrun_protectTrue)这段代码里最容易被低估的是lba_to_xy。CD是CLV逻辑地址和物理半径、角度不是简单线性关系。你按行扫描映射刻出来的图案可能被拉长或旋转。正确做法是先写一张校准盘在已知LBA区间写几个标记块观察它们在盘面上的实际位置反推映射参数。校准一次后面所有图案都受益。不要跳过这一步否则你会以为编码错了其实是坐标映射歪了。4.3 RAW写入参数和写入步骤写入时我一般按这个顺序先擦除整张盘确保相变层回到晶态再用RAW DAO方式写入图案数据写完后不要立刻用手摸盘面等盘片冷却最后在普通光驱里读一下确认盘片没有完全失效。速度从4倍速开始如果图案太淡再降到2倍速。功率不手动改除非你有同型号盘片的测试数据。缓存欠载保护要打开但不要依赖它因为写入中断会在盘面留下明显断点。参数起始建议调整方向原因写入速度4倍速图案淡则降速低速驻留时间长相变更充分写入方式RAW DAO不支持则换机便于组织完整数据流擦除方式整盘快速擦除先擦后写减少旧图案残留缓存保护开启不要频繁中断避免断点破坏图案写入范围数据区中段前后留边界避开导入区和边缘观察光源单侧白光20到40度增强反射率差对比写入完成后先不要急着判断成败。把盘放在黑色卡纸上用侧光慢慢转角度。有时正面看什么都没有转到某个角度会出现清晰暗纹。手机拍摄时锁定曝光和对焦不要用自动增强否则不同照片无法比较。拍完记下速度、功率策略和观察角度下一张才有参照。4.4 观察、拍摄和记录方法观察CD-RW相变图案光源比相机更重要。我通常用一支小手电从侧面打光让光线掠过盘面再用黑卡纸挡住另一侧的环境光。偏振片可以放在光源前或镜头前旋转到背景反光最暗的位置图案对比会增强。微距镜头能拍到轨道纹理但宏观图案用普通手机主摄加侧光更容易看全。拍摄时让盘面占满画面避免反光点落在图案中心。记录表格比凭感觉可靠。我会记下盘片编号、写入速度、图案类型、观察角度、光源距离和主观对比度。两张盘对比时只看同一角度同一光源下的照片。这样你才能判断是速度影响了对比度还是图案设计本身太细。这个习惯看起来麻烦但能省下大量重复试错。5. 常见问题与排查表图案太淡、错位、写废怎么办5.1 图案完全不可见或只有螺旋纹图案完全不可见先查观察条件再查写入参数。正对光看不到很正常换侧光、黑背景、偏振片。如果侧光下只有均匀螺旋纹没有你设计的明暗块可能是数据模式太均匀局部占空比没有拉开也可能是写入功率太低相变没有充分发生还可能是你选的候选块在CIRC和EFM之后占空比趋同。我的排查顺序是先用一张已知高对比的测试块盘确认观察方法再检查候选块模拟结果最后降速重写。5.2 图案错位、拉伸或旋转错位通常不是编码问题而是LBA到物理坐标的映射没校准。CD的CLV结构让同一行LBA在不同半径上的角度长度不同简单按固定扇区数分行会把图案拉成扇形。解决办法是写校准标记在几个已知LBA位置写短块量出它们在盘面上的角度和半径拟合映射曲线。另一个原因是刻录机的写入起始偏移换机器后要重新校准。不要用上一张盘的映射参数直接套新机器。5.3 写入中断、盘片报错和擦除不干净写入中断常见于盘片脏污、供电不稳、缓存欠载或功率策略不匹配。CD-RW对盘面清洁比较敏感指纹和灰尘会让激光功率吸收不均匀。擦除不干净会让旧图案叠在新图案上看起来像重影。处理方法是换一张盘做对照清洁盘面降低速度关闭其他占用磁盘的任务。如果同一张盘多次擦写后对比度明显下降说明材料疲劳换新盘不要继续加功率硬写。5.4 可读性和可见性的平衡可见性追求高占空比差异可读性追求合法扇区和纠错余量。两者会冲突。我的建议是如果盘片只用于观察仍然保留合法扇区结构但可以牺牲部分数据可读性如果还要读数据图案密度不要拉满写入范围避开文件系统关键区。不要为了更暗把整片区域写成极端模式那样可能让刻录机读盘时反复纠错甚至无法擦除。艺术盘和数据盘最好分开一张盘只做一件事。现象优先排查次优排查处理建议完全看不到图案观察角度和光源写入功率是否过低换侧光、黑背景、偏振片降速重写只有螺旋纹数据模式是否太均匀候选块占空比是否趋同增加高对比候选块做块状半色调图案拉伸旋转LBA映射未校准换刻录机后偏移变化写校准标记重新拟合映射图案重影旧数据未擦净盘片材料疲劳整盘擦除换新盘写入中断盘面脏污或供电不稳缓存欠载清洁盘面降速关闭占用任务读盘困难写入密度过高写入范围压到系统区降低占空比避开导入区和目录区对比度逐次下降反复擦写疲劳功率策略不匹配换盘不要盲目加功率6. 经验边界与扩展玩法哪些能做哪些别硬上6.1 设备保护和安全操作的底线CD-RW相变图案是一个低风险但需要耐心的玩法底线是不要拆刻录机、不要直视激光、不要用化学溶剂擦盘、不要用刀片刮记录层。刻录机激光虽然被封闭在机芯里但拆开后风险完全不一样不值得为了观察轨道去冒这个险。盘片清洁用柔软镜头布从中心向外轻擦不要打圈。写坏的盘不要反复加热试图“修复”相变层有疲劳越折腾越糟。电源要稳连续写入时不要移动机器。还有一点很现实不是所有刻录机都愿意接受RAW DAO写入CD-RW也不是所有盘片都适合低速。你得接受“硬件组合决定上限”。同一张图案数据换一台机器可能完全写不出可见纹理。遇到这种情况不要怀疑编码先换盘换机做对照。这个领域的可复现性很大程度依赖硬件批次。6.2 偏振、显微和多角度观察的扩展如果你已经能写出基本图案下一步可以玩观察方式。偏振片能压掉部分镜面反射让相变区的微弱差异更明显微距镜头能拍到轨道上的颗粒感把宏观图案和微观纹理放在同一张照片里多角度拍摄能做“隐藏图像”效果正面看是均匀盘面侧光看才出现文字。还可以把两张不同图案的盘叠在一起用不同角度观察做光学叠加的视觉实验。这些扩展不需要改编码只需要改观察和记录。我的建议是先把同一张盘在五种角度下拍完再决定要不要做更复杂的图案。很多时候不是图案不够好而是观察方法没到位。CD-RW的可见图像本质上是一种低对比度光学纹理观察方式和图案设计同等重要。6.3 后续可扩展的方向如果继续往下走我会先做三件事第一建立更细的候选块库把不同游程模式和CIRC后的局部占空比标定出来第二做一张完整的LBA到物理坐标校准盘把图案变形降到可接受范围第三尝试多级灰度海报化而不是追求连续渐变。再往后可以研究不同写入速度对相变标记尺寸的影响或者用显微拍摄做纹理分析。但我不建议一上来就追求高分辨率照片那会陷入编码约束和硬件限制的双重泥潭。我最后留下的一张盘图案其实很简单一圈粗线、几个大字和一块高密度暗区。它正面看几乎只是一张有点花的CD-RW侧光下才显出纹理。这个结果不算精美但它把“数据编码到光学艺术”的链路跑通了我知道每个暗块对应什么样的占空比知道哪一段LBA落在了盘面的哪个角度也知道下一次该降速还是该改候选块。对我来说这种可测量、可复现的粗糙比一张不可控的漂亮盘更有意思。