我们有一个由第三人创建的相对简单的SWF,基本上可以移动一些文本。我需要能够每天修改该文本,但我没有Flash,我不知道如何使用Flash。因此,在Flash中打开和修改它不是一种选择。外部文件也不是一个选项。
我尝试使用FLASM和SWFMILL反汇编SWF,但结果不显示实际文本。
使用FLASM我使用 flasm -d main_ver3.swf> main_ver3.flm 即可。结果如下:https://dl.dropboxusercontent.com/u/10067449/Flash/main_ver3.flm
使用swfmill我使用 swfmill swf2xml main_ver3.swf main_ver3.xml 。结果如下:https://dl.dropboxusercontent.com/u/10067449/Flash/main_ver3.xml
在他们两个中我都没看到一些添加到Flash的文本,例如“Blackberry Curve”,“Apple iphone”,“Nokia Lumia”。
问题是什么?该文本是使用Flash的文本工具创建的。
感谢。
答案 0 :(得分:0)
是的,不幸的是,它不会像替换文本字符串那么容易。 SWF是一种复杂的格式,具有很多可能性。在您的情况下,字体嵌入为一组字形,字形(字母)在文本对象中引用。
漫画sans字体在此标记下定义:
<DefineFont3 objectID="15" isShiftJIS="0" isUnicode="0" isANSII="0" wideGlyphOffsets="0" italic="0" bold="0" language="1" name="Comic Sans MS">
此标记中定义了一堆字形,您会注意到第10个字形(如果从0开始计数,则为9的索引)具有map =“65”值:
<Glyph map="65">
<GlyphShape>
<edges>
<ShapeSetup x="12500" y="300" fillStyle0="1"/>
<CurveTo x1="-920" y1="0" x2="-680" y2="-2360"/>
<CurveTo x1="-260" y1="-900" x2="-390" y2="-2250"/>
...
十进制“65”是ASCII中的大写字母A.所以上面的绘制调用正在绘制一个大写字母A.稍后,以字形9(ascii 65,大写字母A)开头并拼出'Apple iPhone'的文本记录是(我添加了字母):
<DefineText objectID="22">
<bounds>
<Rectangle left="26" right="2560" top="81" bottom="574"/>
</bounds>
<transform>
<Transform transX="0" transY="0"/>
</transform>
<records>
<TextRecord>
<records>
<TextRecord6 isSetup="1" objectID="15" y="440" fontHeight="400">
<color>
<Color red="255" green="255" blue="255"/>
</color>
</TextRecord6>
<TextRecord6 isSetup="0">
<glyphs>
<TextEntry glyph="9" advance="293"/> # 9 = A
<TextEntry glyph="25" advance="214"/> # 25 = p
<TextEntry glyph="25" advance="214"/> # 25 = p
<TextEntry glyph="21" advance="110"/> # 21 = l
<TextEntry glyph="17" advance="219"/> # 17 = e
<TextEntry glyph="0" advance="120"/> # 0 = space
<TextEntry glyph="19" advance="112"/> # 19 = i
<TextEntry glyph="25" advance="214"/> # 25 = P
<TextEntry glyph="18" advance="231"/> # 18 = h
<TextEntry glyph="24" advance="210"/> # 24 = o
<TextEntry glyph="23" advance="209"/> # 23 = n
<TextEntry glyph="17" advance="219"/> # 17 = e
</glyphs>
</TextRecord6>
<TextRecord6 isSetup="0">
<glyphs/>
</TextRecord6>
</records>
</TextRecord>
</records>
</DefineText>
我不确定advance =“###”是什么,但我猜它是定义字母间距。 l,i和空间只有大约100个单位宽,而其他字母大约是200个单位。
此外,SWF是紧凑的,因此无法保证您拥有随意替换文本所需的每个字形 - 它可能只有在SWF中呈现文本所需的字形。
简而言之,可以使用这些工具修改SWF,但是您需要进行一些挖掘和努力来更改此文本。
另请注意,如果设计人员小心,可以构建一个使用简单可替换文本字段反编译的SWF。它需要从AS3代码(又名动作)中定义的数组中获取文本字段的文本。