Запазва се местните SWF файлове от един bitmap изображения

admin June 16th, 2008

Проблем Резюме:
Записване на изображенията от въздуха прилагане в SWF формат.

Решение Резюме:
Encode BitmapData да PNG или JPEG файлове, както и натоварване може да използвате Loader loadBytes метод. След като натоварването е готов можете да покажете на SWF данни, използвайки байта собственост на LoaderInfo клас. Този метод работи само във въздуха приложения.

Обяснение:
Заявленията за изображения във въздуха, натоварени с Loader клас се съхранява вътрешно като една рамка, а не компресиран SWF файл. Доколкото знам, това не е документирана никъде, но изглежда да работи по този начин. Това също бърз начин за превръщане на местните графичен файл (png, jpg или gif) да swf формат. Ние ще използваме този метод за създаване на местни освен swf файлове от всяко изображение, която се съхранява в BitmapData клас инстанция.

/* create bitmap to be saved as an swf file */
var bd:BitmapData = new BitmapData(320,240);
/* capture application snapshot, this can be any other object */
bd.draw( Application.application as IBitmapDrawable );

Когато имаме вече създадени bitmap изображения ние трябва да го encode PNG или JPEG виртуален файл. Виртуална означава, че той ще се съхраняват в паметта чрез ByteArray клас. В долния пример използваме mx.graphics.codec.PNGEncoder, за да създадете виртуален png файл.

/* create virtual png file */
var png:ByteArray = ( new PNGEncoder() ).encode( bd );

Последна стъпка е да използвате Loader клас за зареждане на изображението. Да заредите виртуалната png изображения, съхранявани в по инициатива на ByteArray клас ние трябва да използвате loadBytes метод. Слушател функция saveContentToSWF ще бъде изпълнено, когато натоварването готов.

/* load virtual png image */
var l:Loader = new Loader();
l.contentLoaderInfo.addEventListener( Event.COMPLETE, saveContentToSWF );
l.loadBytes( png );

Когато събитието е изпратено, нашият имидж вече се превръща в SWF файл. Bytes, съхранявани в Loader клас могат да бъдат достъпни с contentLoaderInfo.bytes собственост. За да създадете и запишете файла местните ние използваме файла и FileStream класове. Да поставя това всички заедно сега.
function saveContentToSWF( event : Event ):void

{
/* create output file on desktop */
var file:File = File.desktopDirectory.resolvePath(’out.swf’);
var fs:FileStream = new FileStream(); fs.open( file, FileMode.WRITE );

/* pull out SWF bytes from Loader */
fs.writeBytes( (evt.target as LoaderInfo).bytes );

fs.close();
}

Този метод ще се създадат местни анологов SWF файл. Да се намали размера ние да създавате и сгъстен SWF файл. За да направите това ние трябва да копирате 8 бит заглавна част от анологов едно. Да покаже, че файлът е компресиран ние трябва да е първи бит на стойност 0×43 (При съставянето на нови на буквата “С”). Цялата файл, след първите 8 байта може да се използва сгъстен тогава метод на компресиране ByteArray клас. Прилагане на това ние заедно се слушател нова функция, която създава сгъстен SWF файлове.

function saveContentToSWF_compress( event : Event ):void
{
var file:File = File.desktopDirectory.resolvePath(’out_c.swf’);
var fs:FileStream = new FileStream();
fs.open( file, FileMode.WRITE );

/* compressed file header */
var swf_head : ByteArray = new ByteArray();
swf_head.endian = Endian.LITTLE_ENDIAN;
swf_head.writeBytes( (evt.target as LoaderInfo).bytes, 0, 8 );
swf_head[0] = 0×43; // ‘C’ letter, indicates that file is compressed
swf_head.position = 0;

/* compressed file body */
var swf_body : ByteArray = new ByteArray();
swf_body.endian = Endian.LITTLE_ENDIAN;
swf_body.writeBytes( (evt.target as LoaderInfo).bytes, 8 );
swf_body.position = 0;
swf_body.compress();
swf_body.position = 0;
/* write it down to file */
fs.writeBytes( swf_head );
fs.writeBytes( swf_body );
fs.close();
};

Пример код използва тази техника е приложен. Пример за прилагането спестява две SWF файлове, компресирани и анологов върху потребителите работния плот.

Свързани файлове за изтегляне: save_swf.zip

Източник: Saving local SWF files from an image bitmap

Trackback URI | Comments RSS

Leave a Reply