![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Jan 2006
Сообщений: 179
|
Собственно вопрос поднимался, хотелось бы кое-что выяснить и внести ясность.
Опять же вопрос стоит по загрузщик фото (на примере Вконтакте). Собственно получилось сделать такое же, но не совсем главная проблема в декодировании Bitmap в byteArray. Сейчас наверно все закричать ты чего, тысячу раз уже обсуждали и пошлют смотреть JPGEncoder ну кто-то подскажет про Live JPEG Encoder (который даёт ещё event). Кто-то скажет что же ещё ? Опять же берём пример Вконтакте, там сделано декодирование на КЛИЕНТЕ !!! Проверено скачивал флешку и декодировал. причём сделано с помощью С (alchemy). Можно почитать ветку форума. Причём почитав, что пишут, можно скачать оттуда пример, в котором уже всё скомпилировано, причём в загрузщике ВКонтакте всё тоже самое (конечно куски кода там побиты, иначе бы я взял оттдуа работающий код). Собственно главный вопрос, скачав этот пример, у меня не получилось его запустить, но ВКонтакте он уже используется, может гуру подскажут как же его использовать, в этом примере как раз показывается разница скорости обработки путём alchemy и JPGEncoder. Я думаю что эта нужная штука, которая реально в разу увеличивает скорость обработки графических файлов. Жду Ваших мыслей. |
|
|||||
|
ИМХО сохраниние несложных векторных рисунков, которые можно накалякать вконтакте легче созранять в каком-нибудь своем векторном формате. Во вконтакте рисуются только линии. Линия имеет начало и конец, отлщину, цвет и прозрачность. Запомнить эти несколько параметров проще чем jpg рисунок этой линии.
ПС: танком по мухам это, конечно дааа... круто блин(эот я про alchemy). |
|
|||||
|
Хм... Прикол. Действительно этот враппер весит в скомпиленной флешке 4 килобайта и кодирует быстрее разов в 5. Простой тест загрузка картинки изменение размера и кодирование всем известным енкодером и этим новым враппером. При использовании енкодера флешка зависайт (думает) около секунды и враппером (вообще не думает) моментально.
http://www.murmadillo.tut.su/m/my_jpg.swf package
{
import flash.display.*;
import flash.text.*;
import flash.net.*;
import flash.events.*;
import flash.utils.*;
import com.adobe.images.JPGEncoder;
import flash.geom.*;
import flash.filters.*;
import hurlant.jpeg.as3_jpeg_wrapper;
/**
* ...
* @author http://www.murmadillo.tut.su/
*/
public class DocJpgEncoder extends Sprite
{
private var loader:Loader,
file:FileReference,
txt:TextField,
sender:ByteArray,
i:int,
bmd550x400:BitmapData;
public function DocJpgEncoder()
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
txt=new TextField;
file = new FileReference;
// file.browse(getTypes());
file.addEventListener(Event.COMPLETE,onComplete);
file.addEventListener(Event.SELECT,onSelectFile);
//onShowloadDialog();
txt.htmlText = "<a href=\'event:load\'><u>[Загрузить файл]</a>" +
" <a href=\'event:save\'><u>[Сохранить файл JPGEncoder 550х400]</a> " +
" <a href=\'event:saveWrap\'><u>[Сохранить файл as3_jpeg_wrapper 550х400]</a>";
txt.autoSize=TextFieldAutoSize.LEFT;
addChild(txt);//добавить на рабочее поле
txt.filters = [new GlowFilter(0xffffff, 1, 3, 3, 3)];
txt.autoSize=TextFieldAutoSize.LEFT;
addChild(txt);
txt.addEventListener(TextEvent.LINK, txtLinkFunc);
bmd550x400 = new BitmapData(550, 400, true, 0x00000000);
var seed:int = int(Math.random() * int.MAX_VALUE);
var channels:uint = BitmapDataChannel.RED | BitmapDataChannel.BLUE;
bmd550x400.perlinNoise(100, 80, 12, seed, false, true, channels, false, null);
}
private function txtLinkFunc(evt:TextEvent):void {
if (evt.text == 'load') {
onShowloadDialog();
}
if (evt.text == 'save') {
onShowSaveDialog();
}
//saveWrap
if (evt.text == 'saveWrap') {
onShowSaveWrapDialog();
}
}
//отображение диалога открытия файла
private function onShowloadDialog(event:Event=null):void {
var fileFilter:FileFilter=new FileFilter("Images","*.jpg");
try {
file.browse([fileFilter]);
}
//catch(illegalOperation:IllegalOperationError){
catch (e:Error) {
}
}
//отображение диалога save файла
private function onShowSaveDialog(event:Event=null):void {
var jpgEncoder:JPGEncoder = new JPGEncoder(100);//100 качество
var jpgStream:ByteArray = jpgEncoder.encode(bmd550x400);
var saveFile:FileReference = new FileReference;
try {
saveFile.save(jpgStream,"lexJPGEncoder.jpg");
}
//catch(illegalOperation:IllegalOperationError){
catch (e:Error) {
}
}
//отображение диалога save Wrapper файла
private function onShowSaveWrapDialog(event:Event = null):void {
var ba:ByteArray = bmd550x400.getPixels(new Rectangle(0,0,550,400));
var retByteArray:ByteArray = as3_jpeg_wrapper.write_jpeg_file(ba, 550, 400, 3, 2);
var saveFile:FileReference = new FileReference;
try {
saveFile.save(retByteArray,"lex_as3_jpeg_wrapper.jpg");
}
//catch(illegalOperation:IllegalOperationError){
catch (e:Error) {
}
}
//при выборе файла загружаем его
private function onSelectFile(event:Event):void {
try {
file.load();
}
// catch(illegalOperation:IllegalOperationError)
catch (e:Error) {
}
}
private function onComplete(event:Event):void {
//addChild(loader = new Loader);
loader = new Loader;
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderContentHandler);
loader.loadBytes(file.data);
loader.y = 20;
}
private function loaderContentHandler(evt:Event):void {
var bitmapData:BitmapData = Bitmap(loader.content).bitmapData.clone();
var sp:Sprite = new Sprite;
var image:Bitmap = new Bitmap(bitmapData);
var myMatrix:Matrix = new Matrix();
var scale:Number;
var scalXY:Object = new Object;
trace('hi');
bmd550x400 = new BitmapData(550, 400, true, 0x00000000);
scalXY = getAutoScale(bitmapData, 550, 400);
myMatrix.createBox(scalXY.scale, scalXY.scale, 0, 0, 0);//scaleX,scaleY,rotation,x,y
bmd550x400.draw(image, myMatrix);
sp.addChild(image = new Bitmap(bmd550x400));
image.x = scalXY.x;
image.y = scalXY.y;
bmd550x400 = new BitmapData(550, 400, false, 0xffffff);
bmd550x400.draw(sp);
addChild(image = new Bitmap(bmd550x400));
addChild(txt);
}
private function getAutoScale(_bm:BitmapData,_w:Number,_h:Number):Object {
var sizeX:Number = _bm.width;
var sizeY:Number = _bm.height;
var scale:Number;
var scalXY:Object = new Object;
var tv:Number = sizeX / sizeY;
trace(tv);
if (tv > 1||tv < 1.3) {//квадрат
scale = _w / sizeX;
scale = scale / tv;
}
if (tv < 1) scale = _h / sizeY;//вертикаль
if (tv >= 1.3) scale = _h / sizeY;//горизонт
scalXY.x = (_w - sizeX * scale) / 2;
scalXY.y = (_h - sizeY * scale) / 2;
scalXY.scale = scale;
return scalXY;
}
}
}
Последний раз редактировалось Alex Lexcuk; 02.04.2009 в 10:26. |
|
|||||
|
Регистрация: Jan 2006
Сообщений: 179
|
Скажите как быть ? В итоге свой пример сделал а он не работает, может кто-то помочь его подправить, чтобы он заработал.
Добавлено через 9 минут Да и ещё я не устанавливал ничего кроме flash cs4, может из-за этого не идёт ? Добавлено через 19 минут В итоге я вставил твой код во flash: import flash.display.*; import flash.text.*; import flash.net.*; import flash.events.*; import flash.utils.*; import com.adobe.images.JPGEncoder; import flash.geom.*; import flash.filters.*; import hurlant.jpeg.as3_jpeg_wrapper; var loader:Loader, file:FileReference, txt:TextField, sender:ByteArray, i:int, bmd550x400:BitmapData; DocJpgEncoder(); function DocJpgEncoder() { stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; txt=new TextField; file = new FileReference; // file.browse(getTypes()); file.addEventListener(Event.COMPLETE,onComplete); file.addEventListener(Event.SELECT,onSelectFile); //onShowloadDialog(); txt.htmlText = "<a href=\'event:load\'><u>[Загрузить файл]</a>" + " <a href=\'event:save\'><u>[Сохранить файл JPGEncoder 550х400]</a> " + " <a href=\'event:saveWrap\'><u>[Сохранить файл as3_jpeg_wrapper 550х400]</a>"; txt.autoSize=TextFieldAutoSize.LEFT; addChild(txt);//добавить на рабочее поле txt.filters = [new GlowFilter(0xffffff, 1, 3, 3, 3)]; txt.autoSize=TextFieldAutoSize.LEFT; addChild(txt); txt.addEventListener(TextEvent.LINK, txtLinkFunc); bmd550x400 = new BitmapData(550, 400, true, 0x00000000); var seed:int = int(Math.random() * int.MAX_VALUE); var channels:uint = BitmapDataChannel.RED | BitmapDataChannel.BLUE; bmd550x400.perlinNoise(100, 80, 12, seed, false, true, channels, false, null); } function txtLinkFunc(evt:TextEvent):void { if (evt.text == 'load') { onShowloadDialog(); } if (evt.text == 'save') { onShowSaveDialog(); } //saveWrap if (evt.text == 'saveWrap') { onShowSaveWrapDialog(); } } //отображение диалога открытия файла function onShowloadDialog(event:Event=null):void { var fileFilter:FileFilter=new FileFilter("Images","*.jpg"); try { file.browse([fileFilter]); } //catch(illegalOperation:IllegalOperationError){ catch (e:Error) { } } //отображение диалога save файла function onShowSaveDialog(event:Event=null):void { var jpgEncoder:JPGEncoder = new JPGEncoder(100);//100 качество var jpgStream:ByteArray = jpgEncoder.encode(bmd550x400); var saveFile:FileReference = new FileReference; try { saveFile.save(jpgStream,"lexJPGEncoder.jpg"); } //catch(illegalOperation:IllegalOperationError){ catch (e:Error) { } } //отображение диалога save Wrapper файла function onShowSaveWrapDialog(event:Event = null):void { var ba:ByteArray = bmd550x400.getPixels(new Rectangle(0,0,550,400)); var retByteArray:ByteArray = as3_jpeg_wrapper.write_jpeg_file(ba, 550, 400, 3, 2); var saveFile:FileReference = new FileReference; try { saveFile.save(retByteArray,"lex_as3_jpeg_wrapper.jpg"); } //catch(illegalOperation:IllegalOperationError){ catch (e:Error) { } } //при выборе файла загружаем его function onSelectFile(event:Event):void { try { file.load(); } // catch(illegalOperation:IllegalOperationError) catch (e:Error) { } } function onComplete(event:Event):void { //addChild(loader = new Loader); loader = new Loader; loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderContentHandler); loader.loadBytes(file.data); loader.y = 20; } function loaderContentHandler(evt:Event):void { var bitmapData:BitmapData = Bitmap(loader.content).bitmapData.clone(); var sp:Sprite = new Sprite; var image:Bitmap = new Bitmap(bitmapData); var myMatrix:Matrix = new Matrix(); var scale:Number; var scalXY:Object = new Object; trace('hi'); bmd550x400 = new BitmapData(550, 400, true, 0x00000000); scalXY = getAutoScale(bitmapData, 550, 400); myMatrix.createBox(scalXY.scale, scalXY.scale, 0, 0, 0);//scaleX,scaleY,rotation,x,y bmd550x400.draw(image, myMatrix); sp.addChild(image = new Bitmap(bmd550x400)); image.x = scalXY.x; image.y = scalXY.y; bmd550x400 = new BitmapData(550, 400, false, 0xffffff); bmd550x400.draw(sp); addChild(image = new Bitmap(bmd550x400)); addChild(txt); } function getAutoScale(_bm:BitmapData,_w:Number,_h:Number):Object { var sizeX:Number = _bm.width; var sizeY:Number = _bm.height; var scale:Number; var scalXY:Object = new Object; var tv:Number = sizeX / sizeY; trace(tv); if (tv > 1||tv < 1.3) {//квадрат scale = _w / sizeX; scale = scale / tv; } if (tv < 1) scale = _h / sizeY;//вертикаль if (tv >= 1.3) scale = _h / sizeY;//горизонт scalXY.x = (_w - sizeX * scale) / 2; scalXY.y = (_h - sizeY * scale) / 2; scalXY.scale = scale; return scalXY; } Все пути к библиотекам правильно, файл "as3_jpeg_wrapper.swc", лежит там же где и флешка. По клику jpeg encoder as3 - вcё ок, когда кликаю по wrapper VerifyError: Error #1014: Не удалось найти класс cmodule.as3_jpeg_wrapper::CLibInit. at test_fla::MainTimeline/onShowSaveWrapDialog() at test_fla::MainTimeline/txtLinkFunc() |
|
|||||
|
Ставим (читаем - http://racer242install.blogspot.com/)
Microsoft.NET 2.0 Java 1.6+ Выбираем последнюю версию флешдевелопа http://www.flashdevelop.org/communit...orum.php?f=11/ Распаковуем опен соурсе флекс сдк http://opensource.adobe.com/wiki/dis...ownload+Flex+4 Качаем последнюю версию дебуг плеера http://www.adobe.com/support/flashplayer/downloads.html Создаем проект во флеш девелоп кидаем п папку проекта нашу swc кликаем на правой кнопочкой, там будет добавить в проект. Настраиваем девелопа http://www.murmadillo.tut.su/m/InstructionFDoc.swf А вообще-то поищите ка файлик as3corelib.swc где находится этот энкодер, и сунте в туже папку as3_jpeg_wrapper.swc, в Adobe Flash эти swc лежат не знаю где, поищите в гугле (подключение библиотек swc к Adobe Flash CS3, в СS4 наверное так-же) или в каталоге Adobe Flash CS4 (где их будет больше всего туда и сунте), Последний раз редактировалось Alex Lexcuk; 02.04.2009 в 13:39. |
|
|||||
|
Регистрация: Jan 2006
Сообщений: 179
|
Отчёт о проделанной работе:
1) Нашёл всё-таки куда пихать файл "as3_jpeg_wrapper.swc" в эту папку C:\Program Files\Adobe\Adobe Flash CS4\Common\Configuration\ActionScript 3.0\libs либо можно publish setting науськавтаь на файл Результат стал другим он уже не ругается что не найден класс, а просто пишет: ReferenceError: Error #1065: Переменная DocJpgEncoder не определена. |
|
|||||
|
Регистрация: Jul 2008
Сообщений: 5
|
Имхо библиотека as3_jpeg_wrapper.swc какая-то неправильная.
Я не смог её подцепить в cs4. Мне кажется, что там не хватает пары методов для полноценной работы с cs4 (cs3). А вообще тема интересная (в плане использования С-ых библиотек), хотя и и тЁмная для меня. |
|
|||||
|
>>Результат стал другим он уже не ругается что не найден класс, а просто пишет:
ReferenceError: Error #1065: Переменная DocJpgEncoder не определена. DocJpgEncoder это документ класс. Кликаем на пустую поверхость рабочего поля нажимает ctrl+F3 Там есть поле Document Class вставляем туда DocJpgEncoder. В той же папке должен быть файл DocJpgEncoder.as с содержимым, которое я уже дал. >>(в плане использования С-ых библиотек), Они уже не сишные, там просто с код в стиле AS3 и к сям уже не имеет никакого отношения. |
|
|||||
|
Регистрация: Jan 2006
Сообщений: 179
|
Цитата:
|
|
|||||
|
>>Вот собственно всё так и сделано один в один та же ошибка
motoroller, заскриншотил код, который давал и код, который вы зачем-то вставили сюда, там нехватает пару важных слов. ![]() И поставьте себе FlashDevelop, много ошибок Flash CS пофигу. Последний раз редактировалось Alex Lexcuk; 02.04.2009 в 20:24. |
![]() |
![]() |
Часовой пояс GMT +4, время: 08:36. |
|
|
« Предыдущая тема | Следующая тема » |
|
|