使用Python获取Swf文件维度的最佳方法
编辑: 我在考虑六边形和swfTools。有人有其他解决方案或见解吗? 编辑: 新问题-如何解决此错误: 我尝试使用hexagonit.swfheader,但收到错误:使用Python获取Swf文件维度的最佳方法,python,actionscript-3,debugging,flash,Python,Actionscript 3,Debugging,Flash,编辑: 我在考虑六边形和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
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
*发生错误的地方。
我读到:
我也尝试过使用PIL和枕头,但我觉得他们比较的是图像而不是swf文件。我反编译了swf文件,我一直在看,但也有swf文件本身
我想知道文件显示的大小(尺寸)
我的第一个想法是尝试使用图像大小比较
我的问题是,在swf中用作资产的一些图像实际上比swf本身大,否则我将使用PIL简单地获取最大图像资产的尺寸(背景除外)
其次,我的另一个问题是,可以同样地比较svg和png文件。。据我所知,枕头和Pil不处理svg文件
我的第二个想法是在actionscript代码中搜索维度
有些文件的动作脚本中有300x300之类的东西,表示大小。不幸的是,在查看了我正在处理的大多数文件后,我发现它们并没有这样做,这意味着这在很大程度上是没有帮助的
我的第三个想法是忽略反编译的swf数据,而是关注swf本身
理论上,我可以试着在字节码中找到尺寸(或者使用一个这样做的库(我需要找到一个,因为pip和pillow似乎不起作用)),或者我需要运行广告,然后截图,试着找到广告开始和停止的位置,并基于此计算像素。我对屏幕拍摄的问题是,图像可能会混入背景,如果不是不可能的话,也很难获得正确的尺寸,但更重要的是,如果没有在正确的url中播放,许多主权财富基金由于安全原因无法播放,等等
因此,我左右为难。我认为最好的方法是使用swf文件本身 看看这位官员。您要查找的维度信息应位于文件开头附近。请看“SWF标题”一节
哦,谢谢,我来看看。你认为有什么方法可以让我轻松地查询,或者我需要以字节码手动查看每个文件吗?我知道除了字节码,我不能以任何形式打开文件。我不知道如何轻松地将其解释为大小。但是谢谢你,我会深入了解文件格式,看看是否有什么见解这是一种二进制格式,所以是的,你需要做一些字节偏移量计算,以准确地找到数据存储的位置-但这是一个非常好的练习,信息就在文件的开头,所以这应该不会太难。那么到底是什么阻止了你使用它呢?我真的看不出你的问题与你链接的问题有什么不同。我无法让swfheader工作,因此我试图找到另一个解决方案。那么你应该提出你的问题,问你有什么问题,包括错误消息、堆栈跟踪等。只是尝试了一下,在这里效果很好。好的,我在问题中添加了我的错误。我只是在寻找一个解决办法。但我认为一个变通方法同样有用。只要按照他们在网站上展示的方式来尝试就可以了
metadata=hexagonit.swfheader.parse(TEST_-SWF)
其中TEST_-SWF是实际的SWF文件名,即Flash_-Gallery.SWF
(只是为了测试:没有使用文件夹路径,所以将所有文件保存在同一目录中,以便在没有路径斜杠的情况下进行访问)或者使用指向您的TEST_-SWF的http链接。如果这样做有效,那么至少您知道问题出在f=open('out/'+w+“/”+s+“/“+”theSwf/“+s,'r')
。parse()需要一个文件url和f=open。。不返回url,而是提供文件字节(对于@Martin之前建议的内容,顺便说一句,您需要第9个字节)
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
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).