Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Прозрачность части изображения (http://www.flasher.ru/forum/showthread.php?t=189728)

Bekass 16.12.2012 16:55

Прозрачность части изображения
 
Есть рисунок png. Есть задача при ведении по рисунку кистью (курсором), делать эту область прозрачной.
Вопрос: Как это можно реализовать?

Спасибо.

Hauts 16.12.2012 17:11

Код AS3:

import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.events.MouseEvent;
import flash.display.Sprite;
import flash.geom.Rectangle;
 
var bd:BitmapData = new BitmapData(image.width,image.height,true,0x00000000);
bd.draw(image);
 
var bitmap:Bitmap = new Bitmap(bd);
var bitmapContainer:Sprite = new Sprite();
bitmapContainer.addChild(bitmap);
addChild(bitmapContainer);
 
bitmapContainer.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
function mouseMoveHandler(e:MouseEvent):void {
        //bd.setPixel32(bitmapContainer.mouseX, bitmapContainer.mouseY, 0x00000000);
        bd.fillRect(new Rectangle(bitmapContainer.mouseX - 5, bitmapContainer.mouseY - 5, 10, 10), 0x000000);
}

Например так можно.

Bekass 16.12.2012 17:27

Супер, большое спасибо

Hauts 16.12.2012 17:31

Не за что, обращайтесь. :)

Bekass 16.12.2012 18:22

а можно ли задать как-то не полностью прозрачную область а с какой-то альфой ? т.е. чтоб при ведении мышки облать становилась прозрачной спустя N раз

Hauts 16.12.2012 19:27

Код AS3:

import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.events.MouseEvent;
import flash.display.Sprite;
import flash.geom.Rectangle;
import flash.geom.Point;
 
var bd:BitmapData = new BitmapData(image.width,image.height,true,0x00000000);
bd.draw(image);
 
var bitmap:Bitmap = new Bitmap(bd);
var bitmapContainer:Sprite = new Sprite();
bitmapContainer.addChild(bitmap);
addChild(bitmapContainer);
var alphaBitmapData:BitmapData = new BitmapData(20,20,true,0xCC000000);
bitmapContainer.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
 
function mouseMoveHandler(e:MouseEvent):void {
        var p:Point = new Point(bitmapContainer.mouseX - 5,bitmapContainer.mouseY - 5);
        var rect:Rectangle = new Rectangle(p.x,p.y,10,10);
        bd.copyPixels(bd, rect, p, alphaBitmapData);
}

Так?

Srednas 17.12.2012 09:55

Цитата:

Сообщение от Hauts (Сообщение 1110170)
[as3]

Например так можно.

Поясните, пожалуйста, почему ваш способ работает? )
Тут, вроде, нет ни режимов наложения, ни маски.. Странно даже )

Hauts 17.12.2012 11:04

Я отрисовываю картинку в битмапдату, создаю битмапу на основе этой битмапдаты и во время движения курсора закрашиваю прямоугольную область прозрачным цветом.

Вообще как объяснить, если код перед вами?

Srednas 17.12.2012 12:11

Цитата:

Сообщение от Hauts (Сообщение 1110307)
Вообще как объяснить, если код перед вами?

А разве форум существует не для того, что бы спрашивать, если что-то непонятно? )
Цитата:

Сообщение от Hauts (Сообщение 1110307)
Я отрисовываю картинку в битмапдату, создаю битмапу на основе этой битмапдаты и во время движения курсора закрашиваю прямоугольную область прозрачным цветом.

За объяснение спасибо. Сначала понял действия кода примерно так: рисуем битмапдату и на ней рисуем прозрачные прямоугольники, а т.к. они прозрачные под ними должна быть видна картинка.
Но теперь мне стало понятнее, а вам, надеюсь, не поплохело от двух написанных строчек )
Так что — спасибо )

Wolsh 17.12.2012 12:24

Не "закрашиваю прямоугольную область прозрачным цветом", а "копирую в прямоугольную область те же самые пиксели, что и в этой области, но с альфой, взятой из alphaBitmapData". После первого прохода альфа этих (непрозрачных) пикселей станет 0хСС. При втором проходе за исходные будут приняты уже эти полупрозрачные пиксели и их альфа будет уменьшена еще раз (на 0хFF - 0xCC = 0х33). И так далее.


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

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