符文工房吧 关注:21,642贴子:344,258

【资源重发】符文工房边境和海洋图片导出

只看楼主收藏回复

楼主最近通过改进EveryFileExplorer后,成功将边境和海洋的更多图片批量导出了,这里发个记录贴,感兴趣的话可以看看。




IP属地:云南1楼2025-10-02 00:45回复
    二楼用于发布导出的图片


    IP属地:云南2楼2025-10-02 00:45
    收起回复
      2026-01-09 15:26:31
      广告
      不感兴趣
      开通SVIP免广告
      授人以鱼不如授人以渔,来说说我导出这些图片的一些教程和心路历程吧。
      处理边境的RUNEFACTORY.dat,使用扑家发布的开源工具rfo就可以了,这个在我很早以前的教程贴里就说过,虽然它提示只能解包海洋的RFF2.dat,但其实它们的文件结构是接近的,使用这个工具就可以处理。


      IP属地:云南3楼2025-10-02 00:56
      回复
        将这个文件包解包以后,难点就在于该怎么处理这些bin文件了,因为这个文件包没有文件目录表,所以导出的文件是按照文件索引,再加上bin的后缀名来命名的。


        IP属地:云南4楼2025-10-02 01:01
        回复
          判断这些文件的类型当然还是根据它们的十六进制进行分析,比如说文件头为FBTI是文件包,HXTB是图片或者纹理,而文件头的十六进制为0x55, 0xAA, 0x38, 0x2D则是U8的文件包,我根据文件头重命名了这些文件。






          IP属地:云南5楼2025-10-02 01:06
          回复
            而这些文件中比较常见的是U8的文件包,这个EFE默认就支持,里面的TPL也是Wii常见的文件格式,这个我大概在七八年前就尝试提取过,不过当时不懂代码,批量导出做的并不好。
            再加上EFE负责解码图片的Textures类,本身有很多问题,处理某些图片可能会导致程序崩溃,或者在调试过程中抛出System.AccessViolationException的异常,要么就提示应用程序进入了中断模式,所以那会其实有很多图片都没有导出,只是导出了一小部分。






            IP属地:云南6楼2025-10-02 01:16
            回复
              现在总算知道是为什么了,原因在于解码TPL调用Textures类的ToBitmap方法,是使用了指针的不安全代码,而在C#中使用不安全代码和指针时,必须极其谨慎的进行边界检查,否则就会导致程序出现崩溃性的BUG。
              例如指针如果访问了不属于该程序管理的内存区域,可能会引发违规访问,越界写入可能会破坏其他变量或调用栈,出现不可预知的行为。



              IP属地:云南7楼2025-10-02 01:24
              回复
                关于之前为什么会崩溃,我举几个例子就知道是什么情况了。
                拿CMPR举例,原作者并没有做细致的边界检查,就导致像素坐标计算越界了,例如这张图片的分辨率为320x213,它的高度为213,索引范围是0到212,而当y的值为208,y2=4,y3=3时,算出来就是208+4+3=215,这个大于图片的高度,就导致越界了。
                解决方案自然在那里定义相应变量,则y+y2+y3还有x+x2+x3的值,当它们的值大于图片的高度或者宽度时,使用continue语句跳过越界的部分即可。






                IP属地:云南8楼2025-10-02 01:32
                回复
                  2026-01-09 15:20:31
                  广告
                  不感兴趣
                  开通SVIP免广告
                  其他格式也是同理,拿CI4的纹理格式举例,CI4我前面做了越界处理,虽然遇到这种格式的图片不会导致程序崩溃了,但无法解码出正确的图像。
                  原因在于没有正确读取当前像素的索引数据,导致纹理数据的指针没有推进,使用continue语句跳过了内层循环后续的部分代码,包括对offs的递增,如果这个少了的话,读取位置就会错乱,解码出来的图片就是错误的。
                  解决方法自然是在边界检查之前就需要读取索引和推进指针。






                  IP属地:云南9楼2025-10-02 01:42
                  回复
                    所以我对GCNWii的Textures类进行了大幅改进,每种格式都进行了越界处理并加强了健壮性。
                    除此之外还补全了缺失的RGBA32和CI14X2格式,对于需要使用调色板,则索引颜色的CI4,CI8和CI14X2格式,支持了三种不同的调色板(原作者只只处理了RGB5A3的调色版,我补全了IA8和RGB565的调色板),这样才可以导出正确的图片,并修复程序崩溃性的BUG。
                    拿代码文件大小来看的话,原作者的只有9KB,而我经过调整和扩展后,增加到了76KB,当然现在还具有试验性,后面有时间精力的话,依然要优化和改BUG。







                    IP属地:云南10楼2025-10-02 01:55
                    回复
                      这样EFE解码Wii的纹理就没有问题了,对于U8和TPL的处理,我为EFE实现了批处理功能,在插件中注册了相关命令并制作了对应的efesc脚本,可以完成U8的解包与TPL的批量转换。











                      IP属地:云南11楼2025-10-02 02:01
                      回复
                        至于HXTB的话,在好几个月前,我其实就在EFE中实现查看功能了,在项目中添加了一个RF的dll插件。
                        HXTB文件结构跟TPL有接近的地方,需要使用大端序读取,当时参考了一下开源项目DolphinTextureExtraction-tool的代码,试了一下居然成功了,只是这几个月在忙其他事,批量导出就鸽了很久。
                        前面改Textures的代码其实也是磨刀不误砍柴工了,因为HXTB也是可以调用这个类来进行解码的,那个类的ToBitmap方法的各种嵌套for循环和颜色转换的代码,对于能否解码出正确的图片,是非常关键的。
                        这个开源项目也告诉了我代码的复用性,同样是非常重要的,例如Textures类不仅可以用于处理常见的BTI与TPL图片,还可以用于处理HXTB这种专用格式。










                        IP属地:云南12楼2025-10-02 02:17
                        回复
                          而FBTI的话,和HXTB一样是Wii上的符文工房的专用格式,属于文件包,里面可能有HXTB纹理,我也是参考了DolphinTextureExtraction-tool的代码在EFE中完成的。
                          同样需要使用大端序读取,FBTI似乎没有文件目录表,我就使用文件的索引来做为文件名了,和之前那个较大的文件包一样。






                          IP属地:云南13楼2025-10-02 02:22
                          回复
                            FBTI解包出来的文件同样根据文件头来重命名处理一下,再使用HXTB的EFESC脚本就可以完成批处理。







                            IP属地:云南14楼2025-10-02 02:25
                            回复
                              2026-01-09 15:14:31
                              广告
                              不感兴趣
                              开通SVIP免广告
                              边境的图片这次确实导出了更多,感兴趣的话就下载了自己看吧。
                              这里提醒一下我个人并没有这些素材的版权,一切以游戏开发商为准,仅用于学习交流,禁止用于商业用途和付费游戏。






                              IP属地:云南15楼2025-10-02 02:31
                              回复