用Python获取SWF文件尺寸的最佳方法

0 投票
1 回答
617 浏览
提问于 2025-04-18 10:08

编辑:

我在考虑使用 hexagonit 和 swfTools。有没有其他的解决方案或者建议?

编辑:

新问题 - 如何解决这个错误:我尝试使用 hexagonit.swfheader,但收到了错误:

 f = 'out/'+w+"/"+s+"/"+"theSwf/"+s
 data = hexagonit.swfheader.parse(f)
 File "/Library/Python/2.7/site-packages/hexagonit/swfheader/__init__.py", line 26, in parse
 signature = ''.join(struct.unpack('<3c', input.read(3)))  
 struct.error: unpack requires a string argument of length 3

经过追踪,我发现错误发生在这里:

def parse(input):
"""Parses the header information from an SWF file."""
need_close=False
if hasattr(input, 'read'):
    input.seek(0)
else:
    input = open(input, 'rb')*
    need_close=True

* 错误发生的地方。

我看过这篇文章:用纯 Python 获取 Flash 文件 (.swf) 的尺寸

我也尝试过使用 PIL 和 Pillow,但我觉得它们是用来比较图片的,而不是 swf 文件。我对我正在查看的 swf 文件进行了反编译,同时也有 swf 文件本身。

我想知道这个文件显示的尺寸是多少(长宽)。

我最初的想法是尝试使用图片尺寸比较。

我对此的担忧是,某些作为资产使用的图片实际上比 swf 文件本身还要大,否则我可以直接用 PIL 获取最大的图片资产的尺寸(比如背景)。

其次,我的另一个问题是,Pillow 和 PIL 似乎无法处理 svg 文件,而我也想比较 svg 和 png 文件。

我的第二个想法是搜索 ActionScript 代码中的尺寸信息。

有些文件在它们的 ActionScript 中包含类似 300x300 的内容,表示尺寸。不幸的是,经过查看,我发现大多数文件并没有这个信息,这样就没什么帮助了。

我的第三个想法是忽略反编译的 swf 数据,而是直接关注 swf 文件本身。

理论上,我可以尝试在字节码中找到尺寸(或者使用一个可以做到这一点的库,但我需要找一个,因为 pip 和 Pillow 似乎不行),或者我需要运行广告,然后截图,尝试找出广告的开始和结束位置,并根据这个计算像素。我的问题是,截图时图片可能会和背景融合在一起,这样就很难甚至不可能获取正确的尺寸,更重要的是,许多 swf 文件由于安全原因,如果不在正确的 URL 中播放,是无法播放的。

所以我面临一个两难的选择。我认为最好的办法是直接使用 swf 文件本身。

1 个回答

1

看看这个官方的SWF文件格式说明书。你想要的尺寸信息应该在文件的开头附近。可以查看一下“SWF头部”这一部分。

The FrameSize field defines the width and height of the on-screen display. This field is stored as a RECT 
structure, meaning that its size may vary according to the number of bits needed to encode the coordinates. The 
FrameSize RECT always has Xmin and Ymin value of 0; the Xmax and Ymax members define the width and height 
(see Using bit values).

撰写回答