搜索
查看: 3730|回复: 1

如何获取flash控件中swf文件的实际长宽比例?

[复制链接]

10

主题

82

帖子

666

积分

三级会员

Rank: 4

积分
666
发表于 2014-1-9 10:08:32 | 显示全部楼层 |阅读模式
本帖最后由 alajia 于 2014-1-22 14:54 编辑

原帖放在下方,大家好看一些。谢谢不争的回答,自己也找了一些资料,这里记录一下:

方法说明:
    文件头以标识符开始,第一位“F”或“C”。F表示该文件未压缩;C表示文件从 RECT 字段开始(第9个字节)至文件结尾的所有内容,用ZLIB压缩过的;ZLIB解压缩请见http://bbs.aardio.com/forum.php?mod=viewthread&tid=3840;本文读取的是已经解压后的文件。
    解压后,前面加了8个字节(“FWS”+1位版本号+4位文件长度),所以还是从第9个字节读起。先取前5位二进制,就是传说中的Nbits,这个标识后面二进制按照多少位进行分割,比如10000,换算是16,那后面就要在其后取4*16位的二进制,分别代表X最小值、X最大值、Y最小值、Y最大值,我这里用到的宽和高,就只需要X最大值和Y最大值即可(如果是01111,换算是15,那后面就要取4*15位的二进制)。最后,换算出来的如果要换算成像素,还要除以20,因为宽度和高度是按照twip为单位的(1twip等于1/20像素)。
      自己使用的都是文档转PDF,再转SWF,所以一般尺寸一致,就是横向和纵向排版的区分,所以可以进一步简化,读第10个字节读起8个字节,我的文件读取的数据为:0 2 13 160 0 1 115 224,这8个字节的第2字节数值大于第6个字节的,可以简单判断是横向的排版。
     
遇到的问题:
    1、 每次解压再读取是比较麻烦的事情,是不是还有简单一些的做法?
    2、ZLIB解压缩后,直接内存读取的数据不对,大概是对数据格式理解的不正确,请指正;
    3、这个问题有点远了,就是flash控件是否能对Flexpaper赋值,Flexpaper在<mx:Script>中定义了getString,通过读取Script参数给SwfFile="{_SwfFile}"赋值,有达人请告知,谢谢!

//2进制处理函数
con_bin = function(s){
    return ( string.replace(s,".",
        function(s){
                return string.format("%08b", s[1])
        }
    ) )
}

file = io.open("1_fws.swf","rb")   //二进制模式打开
file.seek("set",8)   //移动指针准备
s = file.read( {
    byte s[20]  //指定读取字节数
    } )
file.close()  

var k = "";
k ++= con_bin(s.s);

var Nbits = string.left(k,5);
var m,n = tonumber(Nbits,2);
var k1 = 5 + m;
var k2 = k1 + m;
var w = string.sub(k,k1,k2);
var width,nw = tonumber(w,2);

var k3 = 5 + 3*m;
var k4 = k3 + m;
var h = string.sub(k,k3,k4);
var heigh,nh = tonumber(h,2);

io.open()
io.print("宽:" ,width/20,"  高:" ,heigh/20);

execute("pause")
io.close()


原帖如下:
在flash控件中加载swf文件后,如果等宽放大显示,高度超出部分不显示,需修改控件的长宽大小,请教如何获取flash控件中swf文件的实际长宽尺寸或者比例?

import win.ui;
import com.flash;
/*DSG{{*/
var winform = ..win.form( bottom=523;parent=...;text="HTMLayout 使用Flash控件";right=789 )
winform.add(  )

/*}}*/

import web.layout;
var wbLayout = web.layout( winform );
import com.flash;
wbLayout.onControlCreated = function( ltEle,ltCtrl ){
        var movie = ltEle["data-movie"];
        if(movie){
                flashBox = com.flash( ltCtrl )
                flashBox.scale = "NoBorder";        //调整缩放模式,如何获取长宽比例,对应修改style?
                flashBox.movie = movie
               
                flashBox.play()
                ltEle.onSize = function (ltEle) {
                        ltCtrl.adjust();
                }
                ltEle.attachEventHandler();
        }
}

import win.ui.ctrl.custom;
wbLayout.html =/***
<body>
<widget cls="custom" data-movie="123.swf" style="width:2000px;height:1400px;"></widget>
</body>
***/

winform.show()
win.loopMessage()
回复

使用道具 举报

4

主题

874

帖子

4704

积分

荣誉会员

Rank: 8Rank: 8

积分
4704
发表于 2014-1-9 19:03:52 | 显示全部楼层

你应当定义一个接口函数 [url]http://bbs.aardio.com/forum.php?mod=viewthread&tid=8785[/url]

你应当定义一个接口函数
http://bbs.aardio.com/forum.php?mod=viewthread&tid=8785 这里面就有演示
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-10-24 10:26 , Processed in 0.062500 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表