PDA

Просмотр полной версии : пошаговое считывание из BitmapData


AlexSol
23.10.2006, 15:02
делаю рисовалку, где необходимо передать результат на сервер. считываю данные с BitmapData и заношу массив.
arr_btn.onRelease = function() {
t = getTimer();
var lastColor;
for (i=0; i<Math.round(clip._height); i++) {
var leng:Number = 0;
arrayCss[i] = new Array();
var index:Number = 0;
t1 = getTimer();
lineInfo(i);
}
makeAutData(arrayCss);
trace('-----------------');
trace(getTimer()-t);
};
function lineInfo(i) {
for (j=0; j<=Math.round(clip._width); j++) {
if (j == 0) {
lastColor = bitmap.getPixel(j+1, i+1).toString(16);
}
var color = bitmap.getPixel(j+1, i+1).toString(16);
//если тот же цвет
if (color == lastColor) {
//если клетка не последняя
if (j != Math.round(clip._width)) {
leng++;
} else {
//если последняя: записываем
arrayCss[i][index] = [leng, lastColor];
}
} else {
//цвет другой
arrayCss[i][index] = [leng, lastColor];
leng = 1;
index++;
lastColor = color;
}
}
trace('i'+i+'::'+(getTimer()-t1));
}

кактинку 300*300 обрабатывает около 3 сек, при этом подвисает и выдает результат trace('i'+i+'::'+(getTimer()-t1)) после того как считывание закончено. Хочется разбить этот процесс на части, чтобы пользователю выводился процент считанной инфы, пока программа думает.

etc
23.10.2006, 15:32
Ну, а где вопрос? :D

AlexSol
23.10.2006, 15:57
считывание подвешивает флешку. как выводить промежуточный результат считывания? в функцию lineInfo(num) передается номер обрабатываемой строки. как его выводить? trace внутри фунции выдается тока после окончания считывания всей картинки.

etc
23.10.2006, 16:19
Трейс выводится вовремя, просто попадает он в аутпут после просчёта всего. Просто так получается.
Нужно цикл по высоте заменить интервалом.

AlexSol
23.10.2006, 16:29
>Просто так получается

не так просто... если выводить в текстовое поле - то три секунды тишины а потом номер последней строки.

>Нужно цикл по высоте заменить интервалом
былв такая идея. а вот как этот интервал подобрать? чтобы он примерно соответствовал времени разбора строки?

silin
23.10.2006, 16:50
не надо подбирать, поставь 0

etc
23.10.2006, 17:07
Да, а оно уж само по времени распределится.

AlexSol
23.10.2006, 20:56
перевел на интервал, работает. Процент выполненнного считывания выдается, а вот время считывания увеличилось в два раза, при этом скорость считывания строки таже. Можно ли это исправить? код вышел такой:
var intervalId:Number;
var count:Number = 0;
var clipH:Number;
var duration:Number = 0;
function executeCallback():Void {
var leng:Number = 0;
arrayCss[count] = new Array();
var index:Number = 0;
t1 = getTimer();
lineInfo(count);
if (count>=clipH) {
clearInterval(intervalId);
makeAutData(arrayCss);
trace('-----------------');
trace(getTimer()-t);
}
count++;
}
arr_btn.onRelease = function() {
t = getTimer();
var lastColor;
clipH = Math.round(clip._height);
intervalId = setInterval(executeCallback, duration);
};
function lineInfo(i) {
for (j=0; j<=Math.round(clip._width); j++) {
if (j == 0) {
lastColor = bitmap.getPixel(j+1, i+1).toString(16);
}
var color = bitmap.getPixel(j+1, i+1).toString(16);
//если тот же цвет
if (color == lastColor) {
//усли клетка не последняя
if (j != Math.round(clip._width)) {
leng++;
} else {
//если последняя: записываем
arrayCss[i][index] = [leng, lastColor];
}
} else {
//цвет другой
arrayCss[i][index] = [leng, lastColor];
leng = 1;
index++;
lastColor = color;
}
}
tt.text = ''+Math.round(i*100/(clip._height));
trace('i'+i+'::'+(getTimer()-t1));
}

etc
23.10.2006, 21:14
Ну или одно или другое.
Зато ты можешь отобразить процесс.

AlexSol
23.10.2006, 22:14
да, могу. с интервалом меня устраивает. просто ситуация интересная.