我在从 .tmx(平铺)文件中提取图层内容时遇到问题。 我想用 PHP 获取完整的未压缩 数据并制作它的小图像。 获取标题信息(如宽度、高度等)没有问题 - SimpleXML 在那里完成它的工作。但不知何故解压瓦片层不起作用。
数据本身存储为 base64 和 gzip 编码的字符串(例如 H4sIAAAAAAAAC+3bORKAIBQEUVzuf2YTTSwEA/gL00EnJvJQsAjcSyk7EU3v+Jn3OI
)但我什至在获取 base64 解码代码时遇到问题(它只是让我感到奇怪字符,当我重新打开平铺 map 并将其保存为“未压缩的 base64”时,结果只是一个空字符串 - 当然不使用 gzip 解压缩)。
我已经通过网络搜索并看到了数据是如何被精确压缩的(Github article)。似乎我必须使用 gzinflate()
命令而不是所有其他命令(例如 gzuncompress),但这对我也不起作用。
我现在的代码如下:
<?php
// Get the raw xml data
$map_xml = new SimpleXML(file_get_contents("map.tmx"));
$data = $map_xml["layer"][0]["data"]["@content"]; // I would make a loop here
$content =gzinflate(base64_decode($map_content)); // gives me and error
var_dump($data); // results in nothing
?>
经过更多研究后,我发现我应该使用 zlib 过滤器 ( php.net article )。 现在我真的很困惑我不知道我应该选择什么 - 我再次询问谷歌并得到以下信息:Compressing with Java Decompressing with PHP .根据答案,我必须在使用 base64 和 gzip 方法之前裁剪标题。
现在我的问题是:我必须先剪掉标题吗?如果是,我该怎么做? 如果没有,那我怎样才能得到未压缩的数据呢?
我真的希望有人能在这里帮助我!
最佳答案
如前所述,Php 的 gzinflate 和 gzuncompress 命名不正确。但是,我们可以利用接受原始压缩数据的 gzinflate。 gzip header 有 10 个字节长,可以使用 substr 去除。使用上面的示例,我尝试了这个:
$base64content = "H4sIAAAAAAAAC+3bORKAIBQEUVzuf2YTTSwEA/gL00EnJvJQsAjcSyk7EU3v+Jn3OI";
$compressed = substr( base64_decode($base64content), 10);
$content = gzinflate($compressed);
这会为您提供一个表示原始数据的字符串。您的 TMX 层主要由 gid 0、2 和 3 组成,因此如果您将其打印出来,您只会看到空白。要获得有用的数据,您需要对字符调用 ord:
$chars = str_split($content);
$values = array();
foreach($chars as $char) {
$values[] = ord($char);
}
var_dump( implode(',', $values) ); // This gives you the equivalent of saving your TMX file with tile data stored as csv
希望对您有所帮助。
关于php - 用 PHP 解压缩 Tiled TMX 文件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10613996/