以下为程序代码:
unit SWFBlue_u1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ActnList, StdActns, StdCtrls;
type TMain = class(TForm) b_open: TButton; b_save: TButton; b_exit: TButton; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; procedure b_openClick(Sender: TObject); procedure b_saveClick(Sender: TObject); procedure b_exitClick(Sender: TObject); private { Private declarations } public { Public declarations } FileLength : LongWord; //SWF文件尺寸 FileBuf : Array of Byte; //将SWF文件读入内存存放 end;
var Main: TMain;
implementation
{$R *.dfm}
procedure TMain.b_openClick(Sender: TObject); var f : File; fws : string[3]; //标示信息 version : Byte; //SWF文件版本号 b,b1,b2 : Byte; Buf : Array of Byte; FrameRate : real; //速率 FrameCount : Word; //总帧数 s : string; TagID : Word; //Tag标示 TagLength : LongWord; //Tag长度 CurrentPos : integer; //CurrentPos记录当前读写位置 FileLengthPos : integer; //FileLengthPos记录FileLength参数位置 TagPos : Integer; //TagPos记录当前TagID位置 Found : Boolean; begin if not OpenDialog1.Execute then exit;
FileMode:=fmOpenRead; AssignFile(f,OpenDialog1.FileName); Reset(f,1); SetLength(FileBuf,FileSize(f)); BlockRead(f,FileBuf[0],Filesize(f)); //将文件读入内存 CloseFile(f);
//下面为读取SWF文件的文件头Header部分 CurrentPos:=0; //读取'FWS'标示 SetLength(fws,3); Move(FileBuf[CurrentPos],fws[1],3); Inc(CurrentPos,3); if fws<>'FWS' then begin SetLength(FileBuf,0); ShowMessage('该文件不是Flash SWF文件!'); exit; end; //读取版本号 Move(FileBuf[CurrentPos],version,Sizeof(version)); Inc(CurrentPos,Sizeof(version)); if Version<>5 then begin SetLength(FileBuf,0); ShowMessage('该SWF文件不是Flash 5版本,本程序当前仅识别Flash 5格式SWF文件!'); exit; end; //读取SWF文件长度 FileLengthPos:=CurrentPos; Move(FileBuf[CurrentPos],FileLength,Sizeof(FileLength)); Inc(CurrentPos,Sizeof(FileLength)); //读取XMin,XMax,YMin,YMax //这里仅读出此四个值的存贮字节存放到Buf中,没有计算它们的实际值 Move(FileBuf[CurrentPos],b,1); Inc(CurrentPos,1); b2:=b shr 3; //得到Bit位数 b2:=5+b2*4; while (b2 mod 8)<>0 do Inc(b2); //计算共有多少Bit位数 b2:=(b2 div 8)-1; //计算共有多少字节Byte SetLength(Buf,b2+1); Buf[0]:=b; Move(FileBuf[CurrentPos],Buf[1],b2); Inc(CurrentPos,b2); //读取FrameRate,b2为小数点前部分,b1为小数点后部分 Move(FileBuf[CurrentPos],b1,Sizeof(b1)); Inc(CurrentPos,Sizeof(b1)); Move(FileBuf[CurrentPos],b2,Sizeof(b2)); Inc(CurrentPos,Sizeof(b2)); s:=IntToStr(b2)+'.'+IntToStr(b1); FrameRate:=StrToFloat(s); //读取总帧数FrameCount Move(FileBuf[CurrentPos],FrameCount,Sizeof(FrameCount)); Inc(CurrentPos,Sizeof(FrameCount));
//下面为读取SWF文件的文件内容Tag部分 Found:=False; Repeat TagPos:=CurrentPos; //读取TagID并得到TagLength Move(FileBuf[CurrentPos],TagID,Sizeof(TagID)); Inc(CurrentPos,Sizeof(TagID)); TagLength:=TagID and $3F; TagID:=TagID shr 6; //如果是LongTag则读取下面的TagLength if TagLength=$3F then begin Move(FileBuf[CurrentPos],TagLength,Sizeof(TagLength)); Inc(CurrentPos,Sizeof(TagLength)); end; //是否有SWF保护设置 if TagID=24 then begin Found:=True; //如果有则将该Tag去掉,将后面的Tag搬过来覆盖掉TagID为24的部分 Move(FileBuf[CurrentPos+TagLength], FileBuf[TagPos], FileLength-(CurrentPos+TagLength)+1); //相应的,要减去文件长度FileLength FileLength:=FileLength-(Sizeof(TagID)+TagLength); CurrentPos:=TagPos; end else CurrentPos:=CurrentPos+TagLength; Until TagID=0;
if Found then begin Move(FileLength,FileBuf[FileLengthPos],Sizeof(FileLength)); Label5.Caption:=OpenDialog1.FileName; b_save.Enabled:=True; ShowMessage('发现有SWF保护设置,请选择文件另存解除保护!'); end else begin SetLength(FileBuf,0); Label5.Caption:='无'; b_save.Enabled:=False; ShowMessage('未发现SWF保护设置!'); end; end;
procedure TMain.b_saveClick(Sender: TObject); var f : File; begin if not SaveDialog1.Execute then exit; FileMode:=fmOpenWrite; AssignFile(f,SaveDialog1.Filename); Rewrite(f,1); BlockWrite(f,FileBuf[0],FileLength); //将内存信息生成文件 CloseFile(f); end;
procedure TMain.b_exitClick(Sender: TObject); begin Close; end;
end. |