记RIDDLE JOKERのCG提取 |
您所在的位置:网站首页 › 游戏cg储存位置 › 记RIDDLE JOKERのCG提取 |
首先是柚子社的传统艺能,xp3的封包形式,很容易能通过提取程序(如Crass / ExtractData)提取出里面的内容 提取后的文件内容分为两部分: 通过010 Editor查看二进制流,发现(猜测)其形式为包含了底图(背景CG)和分镜时的覆盖图层(Sprite),以及覆盖的坐标信息。在查看CG时,程序会首先置放底图,并在查看不同分镜时利用坐标信息在对应位置覆盖Sprite。 正当在考虑如何编写程序,将pimg文件含有的数据分离开时,狗哥让我发现了这个(其实人家本来是给DRACU-RIOT用的)。其中包含的 expimg.exe 将传入的pimg文件分解为了若干 tlg 文件和一个单独的 layer 信息。编写一个脚本,来将pimg文件放入单独的文件夹中,并在单独的文件夹里提取出tlg文件和layer信息: # Run this script under pimg directory $file = Get-ChildItem foreach ($f in $file) { if ($f.Name -cmatch ".pimg") { $filename = $f.Name $perfix = $filename -creplace ".pimg","" New-Item -Path .\ -Name $perfix -ItemType "directory" Move-Item -Path .\$filename -Destination .\$perfix .\expimg.exe ".\$perfix\$filename" } }然后在万能的Gayhub上找到 tlg2png,用法为 tlg2png.exe ,利用以下脚本遍历文件夹转换tlg文件,并清理之前的文件: # Put tlg2png.exe outside *.pimg directory $file = Get-ChildItem foreach ($f in $file) { if ($f.Name -like "ev*") { $directoryName = $f.Name $imgFile = Get-ChildItem -Path ".\$directoryName" foreach ($f1 in $imgFile) { if ($f1.Name -like "*.tlg") { $tlgFile = $f1.Name $pngName = $tlgFile -creplace ".tlg",".png" .\tlg2png-v10-w32\tlg2png.exe ".\$directoryName\$tlgFile" ".\$directoryName\$pngName" } } Remove-Item -Path ".\$directoryName\*.tlg" Remove-Item -Path ".\$directoryName\*.pimg" } }转换后的内容如下: ev*+pimg+layers.txt 文件中内容形式如下: image_width: 1920 image_height: 1080 name: Ah layer_id: 9 width: 257 height: 191 left: 1036 top: 199 opacity: 255 layer_type: 0 type: 13 visible: 1 name: Ag layer_id: 8 width: 257 height: 199 left: 1036 top: 191 opacity: 255 layer_type: 0 type: 13 visible: 1 ......包含了编号、位置、大小、透明度等信息,利用以上信息就可以构造出完整的CG图片来,但Windows下命令行图片构造工具8太好找,因此以下环境切换为WSL: sudo apt install imagemagick-6.q16 # Use convert command to generate a full CG convert --help以下perl脚本可以读取ev*+pimg+layers.txt中的位置信息,并利用convert命令合成CG: # Usage: merge_pimg.pl # Notice: All required PNG file must under same directory $filename = $ARGV[0] =~ m@(.*)\+pimg\+layers@; $prefix = $1; sub get_value { $line = ; if ($line =~ m@.*:\s*(\S+)@) { return $1; } else { return ""; } } $image_width = get_value(); $image_height = get_value(); get_value(); while (1) { $name = get_value(); last unless $name; $layer_id = get_value(); $width = get_value(); $height = get_value(); $left = get_value(); $top = get_value(); while (get_value() ne "") {} $layers{$layer_id}{"name"} = $name; $layers{$layer_id}{"layer_id"} = $layer_id; $layers{$layer_id}{"width"} = $width; $layers{$layer_id}{"height"} = $height; $layers{$layer_id}{"left"} = $left; $layers{$layer_id}{"top"} = $top; $last_layer_id = $layer_id; } for $layer_id (keys(%layers)) { $name = $layers{$layer_id}{"name"}; $width = $layers{$layer_id}{"width"}; $height = $layers{$layer_id}{"height"}; $left = $layers{$layer_id}{"left"}; $top = $layers{$layer_id}{"top"}; if ($layer_id != $last_layer_id) { $base_name = $layers{$last_layer_id}{"name"}; $base_width = $layers{$last_layer_id}{"width"}; $base_height = $layers{$last_layer_id}{"height"}; $base_left = $layers{$last_layer_id}{"left"}; $base_top = $layers{$last_layer_id}{"top"}; system("convert", "-size", "${image_width}x${image_height}", "-page", "+${base_left}+${base_top}", "${prefix}+pimg+${last_layer_id}.png", "-page", "+${left}+${top}", "${prefix}+pimg+${layer_id}.png", "-mosaic", "${prefix}+${base_name}+${name}.png"); } else { system("convert", "-size", "${image_width}x${image_height}", "-page", "+${left}+${top}", "${prefix}+pimg+${layer_id}.png", "-mosaic", "${prefix}+${name}.png"); } }将perl脚本分发至每个含有png和txt文件夹中,遍历执行 不过处理的真心有点慢......文章写到这里,程序还在跑着: 很不负责任的一次update,优化了以上合成CG的方法: 另外给自己挖个大坑,试试有空写一个一键提取合成游戏内cg的方法( 一点吐槽: 柚子社不愧是黄油带厂,日常场景CG分镜+-10张,HS分镜一般50+convert跑的真慢啊......(不过也可能是CG太多)柚子社以上打包形式的游戏都可以这么拆了(Steam上的千恋*万花说你呢)打算之后开个专栏,记一下Gal的解包日常 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |