PDA

View Full Version : کمپرس کردن فایل Swf



Hamid_PaK
سه شنبه 18 مرداد 1384, 07:05 صبح
با سلام ...
دوستان می خواستم بدونم چطوری میشه با کد و Zlib یک فایل SWF رو کمپرس و یا دیکمپرس کرد ...

Delphi_Developer
سه شنبه 18 مرداد 1384, 14:48 عصر
Manzooret az Compress va Decompress chi hast ?
akhe file haye SWF khodeshoon Compress shode hastand
Shayad manzooret in bashe ke ma ye bare dige file ro Compress konim be tori ke size file az ooni ke hast kamtar beshe
vase in kar bayad ba binary va in joor chiza kar koni va byte ha ro dastkari koni
Az component estefade koni rahat tari .

Hamid_PaK
چهارشنبه 19 مرداد 1384, 00:40 صبح
دوست عزیز همون که فایل های فلش کمپرس هست چطوری کمپرس شده و اینو می دونم که zLib هم کمپرس شده ...
حالا می خاهیم برنامه ای بنویسیم که هم بتون دیکمپرس کنه و هم بتونه کمپرس کنه !!!

Hamid_PaK
چهارشنبه 19 مرداد 1384, 23:47 عصر
کسی نمی دونه ، این لینک برنامه نویسی است که این کار رو با دلفی انجام داده ولی سورس رو برای دانلود نگذاشته اگه ممکنه یکی منو راهنمایی کنه ...
http://buraks.com/swifty/swfc.html

Delphi_Developer
جمعه 18 شهریور 1384, 03:15 صبح
خوب ببین عزیز - اینا با باینری و این جور چیزا کار میکنن --- مثلا بعضی بایت های اضافی رو حذف میکنن یا بعضی هاشون هم از کیفیت عکس های استفاده شده در SWF کم میکنن و سایز رو کم میکنن . اینا کاری به ZLIb و اینا نداره

Hamid_PaK
جمعه 16 دی 1384, 06:47 صبح
یک سوال دیگه ما یک فایل SWF داریم با یک Header مشخص که شامل ورژن فایل ، طول فایل و غیره می شود ولی برای قسمت بدنه فایل چطور می توان طول این قسمت از فایل رو تعیین کرد ( برای خواندن و نوشتن در این قسمت ::: فایل Compress شده فلش همین طوری هست یعنی Header فایل تعیین شده ولی در ادامه اطلاعات بصورت Compress شده ذخیره شده ) ....

بهتر یک فایل Compress شده و یک فایل معمولی فلش را در یک HexViewer مشاهده کنید بسادگی متوجه می شوید !!!

Hamid_PaK
جمعه 16 دی 1384, 09:13 صبح
مشکل حل شد ... ولی بسیار ساده و به نظر من مسخره میاد ( چون اصلا فکرش رو نمی کردم ).
فایلهای SWF در دو شکل معمولی و کمپرس (Compress) شده قابل استفاده هستند ... ولی فرق این دو نوع فایل باهم چیه ؟؟؟
خیلی ساده است فایل معمولی که مورد خاصی نداره و شکل کامل خودشو داراست ... اما اون یکی نه، فقط 8 بایت اول این فایل شامل حجم و نوع فایل می باشد و باقی آن استیریمی (Stream) کم حجم شده از نوع ZLib هست ( البته 3 بایت اول این فایل از نوع چر (Char) و حاوی عبارت "CWS" به جای "FWS" می باشد) .

برای دیکمپرس کردن این فایل کافیه بعد از 8 بایت اول را در یک استریم مموری (TMemoryStream) کپی کرده و سپس آن را با یک بازکننده استیریم (TDecompressStream) دیکمپرس کنیم و با 8 بایت اولیه در یک فایل ذخیره سازیم ( 3 بایت اولیه باید به "FWS" تبدیل شود ) .


type
TSWFRect = packed record
Xmin: integer; // in twips
Xmax: integer; // in twips
Ymin: integer; // in twips
Ymax: integer; // in twips
end;

TSWFHeader = packed record
Signature: array [0..2] of char;
Version: byte;
FileLength: cardinal;
FrameSize: TSWFRect;
FrameRate: byte;
FrameRateRemainder: byte;
FrameCount: cardinal;
end;

procedure DeCompCWS;
var
byteFile:PByteArray;
aFilStrm,bFileStrem:TFileStream;
aMemStrm:TMemoryStream;
zLibStrm:TDecompressionStream;
aHead:TSWFHeader;
FileSize:Integer;
begin
aFilStrm := TFileStream.Create('1.swf',fmOpenRead+fmShareDenyN one);
try
aFilStrm.Read(aHead,8);
GetMem(byteFile,aHead.FileLength);
aMemStrm := TMemoryStream.Create;
try
aMemStrm.CopyFrom(aFilStrm,aFilStrm.Size-8);
aMemStrm.SaveToFile('2.comp');
aMemStrm.Position := 0;
zLibStrm := TDecompressionStream.Create(aMemStrm);
bFileStrem := TFileStream.Create('3.swf',fmCreate);
try
FileSize := zLibStrm.Read(byteFile^,aHead.FileLength);
aHead.Signature := 'FWS';
bFileStrem.WriteBuffer(aHead,8);
bFileStrem.WriteBuffer(ByteFile^,FileSize);
finally
bFileStrem.Free;
zLibStrm.Free;
end;
finally
FreeMem(byteFile);
aMemStrm.Free;
end;
finally
aFilStrm.Free;
end;
end;


برای کمپرس کردن هم همین عملیات بلعکس صورت می گیرد.
با تشکر از دوستانی که مرا در حل این مشکل یاری دادند ...
یا حق !!!