PDA

Просмотр полной версии : Как использовать часть изображения?


negasus
15.06.2009, 20:51
Заранее прощу прощения, если тема обсуждалась - не нашёл.

Вопрос:

В библиотеке есть изображение, например 100*100 px
Необходмо программно получать из него часть изображения, например 10*10px с заданной позиции и вывести в кадр.

К сожалению программированием на Action Script только что начал заниматься, но буду рад любой информации. Желательно конечно пример кода и указать мануал - где об этом можно почитать.

Спасибо.

Добавлено через 6 минут
Если не понятно написал вопрос - пожалуйста уточните )
А то буду ждать сам не знаю чего =)

fljot
15.06.2009, 21:12
ну посмотрите на класс BitmapData метод draw или просто на свойство scrollRect у DisplayObject

negasus
15.06.2009, 21:18
ну посмотрите на класс BitmapData метод draw или просто на свойство scrollRect у DisplayObject

Если не сложно, подскажи пожалуйста где смотреть.
Я тоже думал что информация по BitmapData мне поможет, но не нашел этой информации (

silin
15.06.2009, 21:48
>>подскажи пожалуйста где смотреть
обычно в хелпе..:)
import flash.display.BitmapData;
import flash.geom.*;

var bmd:BitmapData = BitmapData.loadBitmap("image");//image - id картинки в библиотеке
var bmd1:BitmapData = new BitmapData(10, 10);
var rec:Rectangle = new Rectangle(0, 0, 10, 10);//нужная часть
bmd1.copyPixels(bmd, rec, new Point());
this.attachBitmap(bmd1, 0);

negasus
15.06.2009, 21:53
silin

Спасибо, пошёл пробовать. На вид - всё просто и понятно )

PS: Вот понимаю что в хелпе )) Но возможно на этом форуме понятие "хелп" отличается от моего. Так как качал различную доку по AS2 - и почему то не нашел нужной инфо. Хотя и склоняюсь к тому, что не там или не так искал )

UPD:
Добавлено через 13 часов 8 минут
Продолжение вопроса :)

Часть картинки из библиотеки благополучно выводится, но в координатах 0, 0

Как один из выходов я попробовл сделать так:


var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
...
mc._x = 30;
mc._y = 30;


Есть ли другое решение? Дело в том, что таких частей картинок будет около 100.

silin
16.06.2009, 16:41
да нормальное решение, если надо этими фрагментами еще и манипулировать, то по другому наверное никак
если нужно просто показать, то можно создать большой прозрачный битмап и копировать фрагменты в нужную часть этого битмапа

negasus
16.06.2009, 16:45
если нужно просто показать, то можно создать большой прозрачный битмап и копировать фрагменты в нужную часть этого битмапа

К такому же самому решению пришел час назад ) Очевидное рядом. ))


Правда, к сожалению, созрел еще один вопрос :)

Пример:

Есть картинки .png с прозрачными частями. Но когда я их накладываю - вместо прозрачного фона получается просто белый цвет.

В библеотеке для моей картинки выставил "без сжатия PNG\GIF" но это ничего не дало

В чем может быть дело?

Волгоградец
16.06.2009, 16:57
Значит .png не 32-х битная или в copyPixels() самый последний параметр поставили в false.

silin
16.06.2009, 16:58
битмап, в который копируем должен быть прозрачным (по дефолту он 32-битный, но непрозрачный)
var bmp:BitmapData = new BitmapData(10, 10, true, 0x0);

negasus
16.06.2009, 17:02
Извиняюсь, надо было сразу указать:

var map:BitmapData = new BitmapData(600, 400, true);
...
map.copyPixels(bmdSurf, rec, new Point(x,y));

Как видно, битмап у меня прозрачный. А вот про copyPixels - поясните пожалуйста?
Или про рязрадность png

Добавлено через 1 минуту
Свойства png-картинки: Глубина цвета: 32

silin
16.06.2009, 17:11
битмап у тебя непрозрачный белый
сравни с new BitmapData(600, 400, true, 0x0);//или 0x00FFFFFF, неважно

negasus
16.06.2009, 17:20
Разницы никакой.

var bmdSurf:BitmapData = BitmapData.loadBitmap("SurfTiles");

Вот здесь у меня идет загрузка png-картики для нарезки, может быть что-то тут не так?

Поясню еще - вырезаю из png прямоугольник 40*20. Там изображен ромб на прозрачном фоне.
Но после того, как я этот прямоугольник вырезал и накладываю один рядом с другим - фон белый.

Волгоградец
16.06.2009, 17:27
png без альфа канала значит. Или вообще не png.

silin
16.06.2009, 17:37
>>Разницы никакой
позволь не поверить..
в общем смотри внимательно в какой битмап ты копируешь плюс то, что Волгоградец подсказал - последний аргумент в copyPixels (от него зависит чья альфа будет применена к результату)

Волгоградец
16.06.2009, 17:46
Еще такой вариант - указана такая битмапа:
var bmp:BitmapData = new BitmapData(200, 200, true, 0xFFAA0000);
Т.е. непрозрачная, поддерживающая прозрачность. Тогда при копировании пикселов та область, которая на png является прозрачной, копируется и исходная битмапа становится прозрачной и через нее виден белый фон. Поставь false.

negasus
16.06.2009, 17:48
Волгоградец

Спасибо. Так получилось
var map:BitmapData = new BitmapData(600, 400, false, 0x00FFFFFF);

Я уж хотел исходник прикрепить - а то даже и не знал как объяснить )