Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   метод getPixels возвращающий ByteArray (http://www.flasher.ru/forum/showthread.php?t=86918)

miramax 25.10.2006 16:11

метод getPixels возвращающий ByteArray
 
В АС 3 метод getPixels возвращает ByteArray. К тому же появились методы для работы с байтами.
Что мы можем изменить в полученном массиве? Как организован возвращаемый этой функцией массив?
Методы getPixel и setPixel слишком медленные что бы обработать большое количество пикселов, Можно ли манипулировать пикслемами в массиве что возвращает функция getPixels ? Как я понимаю обработать массив байтов можно намного быстрее чем последовательно вызывать функции getPixel и setPixel. И ещё
почему метод copyPixels в несколько раз быстрее чем вызов getPixels и setPixels у двух растровых объектов?

etc 25.10.2006 16:23

А что тебя конкретно интересует? Ты можешь изменить любой байт, если нужно. Или нужно послать массив байтов на сервер?

Код:

import flash.utils.ByteArray;
import flash.geom.Rectangle;
import flash.display.BitmapData;
var rect:Rectangle = new Rectangle(0,0,5,5);
var bitmap:BitmapData = new BitmapData(10,10,false,0xFF0000);
var byteArray:ByteArray = bitmap.getPixels(rect);
trace(byteArray[0],byteArray[1],byteArray[2]); // 255 255 0


miramax 25.10.2006 16:34

Цитата:

Сообщение от __etc
А что тебя конкретно интересует? Ты можешь изменить любой байт, если нужно. Или нужно послать массив байтов на сервер?

http://flasher.ru/forum/showthread.p...417#post581417
Хотелось бы заменить пикселы определённых цветов на пикселы других цветов. Только очень быстро

MerlinTwi 25.10.2006 16:39

Как я понимаю, вопрос был в каком формате хранятся пиксели в ByteArray.
Аналогично этому:
Код:

var ar:Array = new Array();
for (var y:int=0; y<bitmap.height; y++) {
        for (var x:int=0; x<bitmap.width; x++) {
                ar.push(bitmap.getPixel32(x,y));
        }
}

И поскольку в byteArray пиксели записываются как unsigned integer, то читах их следует не побайтно, а с помощью readUnsignedInt:
Код:

byteArray.position=0;
while (byteArray.position < byteArray.length) {
        trace(byteArray.readUnsignedInt().toString(16));
}

А то, что copyPixels работает быстрее надо просто принять как факт, скорее всего там происходит тупо копирование куска памяти в то время как в getPixels и setPixels создание нового объекта ByteArray с последовательным преобразованием пикселей туда обратно.

miramax 27.10.2006 06:26

Отлично :)
А как мне определить координаты пиксела? относительно прямоугольника из которого я взял эти пикселы.

MerlinTwi 27.10.2006 12:03

О! Появился. А я уж, по затянувшемуся молчанию решил, что тебя за сорванные сроки с картой заказчик порешил :)

Координаты просто, на каждую точку 4 байта, значит надо позиционироваться на 4*(y*ширина_прямоугольника + x) и читать значение.
Код:

// заливаем все красным
var bitmap:BitmapData = new BitmapData(10,10,false,0xFF0000);
// ставим синюю точку в 2:3
bitmap.setPixel(2,3,0x0000FF);
// считываем ByteArray прямоугольника 5 на 5
var rect:Rectangle = new Rectangle(0,0,5,5);
var byteArray:ByteArray = bitmap.getPixels(rect);
// показываем цвет точки в 2:3
trace(getPixel(2,3, byteArray,rect).toString(16));
// и на всякий случай в 3:3
trace(getPixel(3,3, byteArray,rect).toString(16));

// возвращает 32 цвет точки
function getPixel(x:Number, y:Number, b:ByteArray, r:Rectangle):Number {
        b.position = (y*r.width + x)*4;
        return b.readUnsignedInt();
}


miramax 27.10.2006 20:56

Цитата:

Сообщение от MerlinTwi
Координаты просто, на каждую точку 4 байта, значит надо позиционироваться на 4*(y*ширина_прямоугольника + x) и читать значение.

Получается ByteArray не несёт информации о размерах содержимого прямоугольника с пикселами (ширина, высота):confused:

etc 27.10.2006 21:05

miramax, а откуда ж там эти данные возьмутся?

Nirth 28.10.2006 20:18

Цитата:

Получается ByteArray не несёт информации о размерах содержимого прямоугольника с пикселами (ширина, высота)
У каждого рисунка, есть заголовок, где пишется всякая дребедень вроде кол-ва бит на пиксель, ширина высота, тэги, комментарии(если формат поддерживает).

INK• 16.11.2006 06:55

http://ink.envisionext.com/swf2png/
я тут запостил отчёт о сохранение картинки на сервер. т.е. BitmapData в byteArray (PNG картинка) и отправка готовой картинки для записи на сервер.


Часовой пояс GMT +4, время: 15:25.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.