Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Перерисовка BitmapData из кеша (http://www.flasher.ru/forum/showthread.php?t=147886)

in4core 16.12.2010 16:01

Перерисовка BitmapData из кеша
 
Код AS3:

var bitmap:Bitmap = new Bitmap(_data); // где _data  экземпляр класса расширенного BitmapData  600/410
var tempData:BitmapData = new BitmapData(_data.width,_data.height);
var rect:Rectangle = new Rectangle(0,0,20,20);
tempData.draw(bitmap,null,null,null,rect);
trace(tempData.height) // 410

Почему так ведь квадрат задан на 20 ? Или мы можем делать зарисовку только после добавления объекта на сцену ?

gr_crd 16.12.2010 16:10

410 потомучто
Цитата:

где _data экземпляр класса расширенного BitmapData 600/410

in4core 16.12.2010 16:13

ну так смотрите строчку
Код AS3:

tempData.draw(bitmap,null,null,null,rect);

я же задаю rect для draw ! или не? пока что непонятно че не так

bav 16.12.2010 16:17

BitmapData(width:int, height:int, transparent:Boolean = true, fillColor:uint = 0xFFFFFFFF)
Создает объект BitmapData заданной ширины и высоты.
В хелпе не сказано, что метод draw() изменяет свойство height объекта BitmapData.

in4core 16.12.2010 16:21

да елы палы- после метода draw - битмап дата не меняется чтоли по вашему ?

gr_crd 16.12.2010 16:24

Цитата:

да елы палы- после метода draw - битмап дата не меняется чтоли по вашему ?
меняется, но не ее размеры. при создании было ясно сказано - 410 в высоту.

а при прорисовке - rect указал на то, что прорисовать нужно область 0,0,20,20, а остальное остается без изменений.
т.е. нарисовать в область, которую задал rect. высота и не должна меняться.

ps. и вообще, свойства height и width - только для чтения.

iNils 16.12.2010 16:25

Не меняется. Нужно создать новый экземпляр с нужным размером, перерисовать туда старый, сделать ему dispose и tempData присвоить новый экземпляр.

in4core 16.12.2010 16:30

Тоесть методика выходит такая.
1. Есть битмап дата. (1000/1000) мы ее пихаем в битмап
2. Создать битмап дату из полученного битмап (1)
3. перерисовать в новый экзепляр с dispose
4. (2) присвоить (3)

ес?

Добавлено через 40 секунд
Смысл такой, что мне нужно вырезать квадратец из картинки там где я захочу. вот

Psycho Tiger 16.12.2010 16:44

Рассматривайте БитмапДату как квадрат вашего монитора. Если монитор разрешения 1024х768, то открыв картинку 3000х3000 в размере 100% нельзя увидеть её полностью - она не влезет.

in4core 16.12.2010 16:57

Да я смысл то понимаю тигр. Пока не могу понять, одного

Код AS3:

var temp:BitmapDatanew BitmapData(20,20);
temp = tempData.draw(bitmap,null,null,null,rect) as BitmapData;

чего он на null тут ругается

Psycho Tiger 16.12.2010 17:00

Сигнатура у draw
Код:

public function draw (source:IBitmapDrawable, matrix:Matrix = null, colorTransform:ColorTransform = null, blendMode:String = null, clipRect:Rectangle = null, smoothing:Boolean = false) : void;

in4core 16.12.2010 17:02

Не нифига не разобрался.....блин

Код AS3:

var tempData:BitmapData = new BitmapData(Math.pow(_tilex,2),Math.pow(_tiley,2));
                                        var rect:Rectangle = new Rectangle(90,90,_tilex,_tiley);
                                        var temp:BitmapDatanew BitmapData(20,20);
                                        tempData.draw(bitmap,null,null,null,rect);
                                        temp = tempData;

квадратик наш зарисовывается конечно, но черт побери на координатах каких задали добавляется в итоге в дисплей лист....
тоесть соотв у нас temp получается не 20/20 а опять 400, но виден только наш квадрат на 20. и это понятно почему ибо дату переписали на старый размер. Как же правильно надо? покажите пожалуйста

-De- 16.12.2010 17:37

Вы знаете, как = работает?
Что вот после строчки
temp = tempData;
с temp происходит?

in4core 16.12.2010 17:39

Яж написал что знаю
Цитата:

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

mikhailk 16.12.2010 17:51

я так и не понял, что за задача решается изначально
вырезать кусок из битмапы?

или в том, чтобы новый битмап создался 20х20?
если второе, то надо так его и создать
var tempData:BitmapData = new BitmapData(20,20);

Ну, а для того, чтобы в новый битмап записать то, что нужно, используем матрицу
http://help.adobe.com/ru_RU/AS3LCR/F...om/Matrix.html

сначала она меня напрягала, но постепенно я к ней привык :)

-De- 16.12.2010 17:51

Рисуйте в temp, который нужного размера. Ставьте temp куда надо. Я вообще боюсь что-то говорить тем, кто этого не понимает.

in4core 16.12.2010 17:56

Задача : есть картинка. нужно из нее вырезать кусок. Любой координаты по желанию, затем добавить этот кусок в дисплей лист как битмап

Добавлено через 7 минут
-De- ты написал ерунду. Твоя методика работать вообще не будет


Код AS3:

var rect:Rectangle = new Rectangle(90,90,_tilex,_tiley);
                                        var temp:BitmapDatanew BitmapData(20,20);
                                        temp.draw(bitmap,null,null,null,rect);
                                        addChild(new Bitmap(temp))

и выйдет фига!

zuxul 16.12.2010 18:08

Используй copyPixels, может с ним разберешься :)
-De- написал все правильно...

mikhailk 16.12.2010 18:10

1. создаете битмапдату 20х20
2. задаете смещение через матрицу (используйте matrix.createBox)
3. отрисовываете контент в битмапдату с указанием этой матрицы

in4core 16.12.2010 18:11

благодарю

Добавлено через 6 минут
Код AS3:

var temp:BitmapDatanew BitmapData(20,20);
                                        var matrix:Matrix = new Matrix();
                                        matrix.createBox(1,1,0,90,90);
                                        temp.draw(bitmap,matrix);

Эффекта ноль

iNils 16.12.2010 18:22

Код AS3:

/// смещение по оси x и y
var dx:int = 10;
var dy:int = 5;
 
/// кеш
var bmp:BitmapData = new BitmapData (640, 410);
bmp.noise (0);
bmp.fillRect (new Rectangle (10, 10, 620, 390), 0xFFFF0000);
bmp.fillRect (new Rectangle (20, 20, 600, 370), 0xFF0000FF);
 
/// кроп
var bmpCrop:BitmapData = new BitmapData (40, 40);
bmpCrop.draw (bmp, new Matrix (1, 0, 0, 1, -dx, -dy));
 
/// показываем
var bitmap:Bitmap = new Bitmap (bmp)
addChild (bitmap);
 
var bitmapCrop:Bitmap = new Bitmap (bmpCrop)
bitmapCrop.x = 650;
addChild (bitmapCrop);


in4core 16.12.2010 18:25

спасибки. теперь намного понятнее

mikhailk 17.12.2010 11:40

Код AS3:

private function crop20x20 (contentLayer:Sprite,dx:int,dy:int) : BitmapData
{
        var bmpdata:BitmapData = new BitmapData(20, 20);                       
        var rect:Rectangle = new Rectangle(0, 0, 20, 20);
        var matrix:Matrix = new Matrix ();
        matrix.tx = dx; 
        matrix.ty = dy; 
        bmpdata.draw(contentLayer,matrix,null,null,rect);
        return(bmpdata);
}



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

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