Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Фигурная обрезка битмапом по маске (http://www.flasher.ru/forum/showthread.php?t=127130)

zaidite 06.07.2009 14:12

Фигурная обрезка битмапом по маске
 
1. Картинку которую нужно фигурно обрезать делаю битмапом.
2. Фигуру маски по которой нужного обрезать картинку делаю битмапом.
3. Создаю пустые клипы-контейнеры для этих битмапов. Для каждого свой.
4. В эти клипы помещаю по битмапу. В один клип картинку. Во второй маску.
5. Клип с маской располагаем над клипом с картинкой и задаём маской.
6. Но обрезка происходит не по фигуре маски, а по прямоугольнику битмапа который сделали из клипа с маской.
Подскажите, как сделать фигурную обрезку изображения посредством битмапа, так, что-бы в результате осталась видимая обасть заданая маской. И что-бы в результате эта получившаяся фигурная видимая область была отдельным клипом, который бы не содержал прозрачной прямоугольной области. Т.е. если к этому клипу применить startDrag, то взять его можно было только за видимую фигурную область, оставшуюся после обрезки по маске. А не за прямоугольник с прозрачностью в котором находится оставшаяся фигурная область после задания маски.

alekslitvinenk 06.07.2009 14:28

Цитата:

2. Фигуру маски по которой нужного обрезать картинку делаю битмапом.
битмап всегда имеет прямоугольную форму, используйте шейпы

zaidite 06.07.2009 14:42

Т.е. Сделать всё тоже самое, только не через битмап, а через шейп?

alekslitvinenk 06.07.2009 14:46

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

zaidite 06.07.2009 15:08

Сейчас объясню подробнее.
Есть два одинаковых изображения. Пик1 и Пик2. На изображении Пик1 четырьмя кликами выделяется некая произвольная область. По координатам этих кликов отрисовывается четырёхугольник этой выделенной области. Этот четырёхугольник выделенной области должен стать маской, по которой обрежется изображение Пик2.
В результате должно получится следующее: мы имеем изображение Пик1, на котором видим нашу выделенную область. И фрагмент изображения Пик2, оставшийся после обрезки по области выделения. Но этот фрагмент не должен содержать прозрачности. А должен обрезаться именно по области выделения, для того, что-бы с ним можно было дальше производить трансформации.

dimarik 06.07.2009 15:19

Рисуете шейп-маску mask по координатам вершин четырехугольника. потом
Код AS1/AS2:

Пик2.setMask(mask);


zaidite 06.07.2009 15:27

dimarik, не совсем понимаю, что-такое шейп-маска. Вы имеете в виду использовать класс Shape для рисования маски? Или это что-то другое? Поясните пожалуйста.

alekslitvinenk 06.07.2009 15:32

имелось виду пользоваться графическими API такими как lineTo, curveTo для отрисовки формы.

zaidite 06.07.2009 16:01

Собственно таким образом и создаётся выделенная область. А.а.а.а... Кажется понял... Нужно отрисовать точно такуюже область, по тем-же координатам, только уже в мувике с Пик2 и назначить его маской для Пик2. Я верно понял?

alekslitvinenk 06.07.2009 16:07

ага :)

dimarik 06.07.2009 16:14

Не совсем. Маска - это отдельный mc.

вроде того

Код AS1/AS2:

var targetPoints:Array /* of Points */= new Array(
        new Point(00),
        new Point(10, 0),
        new Point(10, 10),
        new Point(010),
);
 
var mask:        MovieClip = this.createEmptyMovieClip('mask', this.getNextHieghestDepths());
var len:        Number = this.targetPoints.lenght;
var point:        Point = Point(this.targetPoints[0]);
 
this.mask.beginFill(0x00FF00, 50);
this.mask.moveTo(point.x, point.y);
 
for (var i:Number = 1; i < len; i++) {
        point = Point(this.targetPoints[i]);
        this.mask.moveTo(point.x, point.y);
}
point = Point(this.targetPoints[0]);
this.mask.moveTo(point.x, point.y);
this.mask.endFill();
 
 
var bitmap:        BitmapData;
var Пик2:        MovieClip;
 
Пик2.addBitmap(bitmap, 0);
Пик2.setMask(this.mask);

Работоспособность не проверял

zaidite 06.07.2009 16:46

alekslitvinenk, dimarik, спасибо. Пошёл рисовать.

Mnilionic 06.07.2009 21:44

можно и битмапами :)
Код AS1/AS2:

import flash.display.BitmapData;
 
var mc_box:MovieClip = this.createEmptyMovieClip('mc_box', 1);
 
var bmp_img:BitmapData = BitmapData.loadBitmap('image.jpg');
var mc_img:MovieClip = mc_box.createEmptyMovieClip('mc_img', 1);
mc_img.attachBitmap(bmp_img, 0);
 
var bmp_mask:BitmapData = BitmapData.loadBitmap('mask.png');
var mc_mask:MovieClip = mc_box.createEmptyMovieClip('mc_mask', 2);
mc_mask.attachBitmap(bmp_mask, 0);
 
mc_mask.blendMode = 11;
mc_box.blendMode = 2;


natazha 18.07.2009 12:01

Привет, я новичок в AS3, только начала изучать, и начала именно с 3-го. Так что прошу не бить сильно. А вопрос такой, точнее просьба направить. Мне нужен этот код, который написал Mnilionic, только перевести в AS3.
Вот что я сделала:
Код AS3:

var mc_box:MovieClip = new MovieClip();
 
var bmp_img:BitmapData = BitmapData(getChildByName("myimage")); // - myimage уже писутствует в списке отображения
var mc_img:MovieClip = new MovieClip();
mc_img.addChildAt(bmp_img, 0);
 
maskLoader = new Loader();
maskLoader.contentLoaderInfo.addEventListener(Event.INIT,  initListener);
maskLoader.load(new URLRequest("mask.png"));
 
var bmp_mask:BitmapData = Bitmap(maskLoader.content).bitmapData;
var mc_mask:MovieClip = new MovieClip();
mc_mask.addChildAt(bmp_mask, 0);
 
mc_mask.blendMode = BlendMode.ERASE;
mc_box.blendMode = BlendMode.LAYER;

Но во-первых в таком виде выдает ошибку в двух местах (там где добавляю ребенка):
Цитата:

1067: Неявное приведение значения типа flash.display:BitmapData к несоответствующему типу flash.display:DisplayObject.
Я пробовала по-разному, бывало что ошибок не выдает, но все равно никакой маски я не вижу.
Пожалуйста, помогите разобраться. Спасибо!


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

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