Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   apply Alpha Gradient to BitmapData (http://www.flasher.ru/forum/showthread.php?t=149011)

metsys 17.01.2011 22:16

apply Alpha Gradient to BitmapData
 
Собственно програмное рисование для меня загадка. Загружаю я картинку, и надо мне програмно сделать для неё градиентную альфа маску. Собственно как для типа BitmapData сделать градиентную alpha заливку? Что бы например альфа уменьшалась от нижнего к верхнему.

nOobCrafter 17.01.2011 23:34

рисуете шейп с нужным вам вариантом маски, далее устанавливаете св-ва cacheAsBitmap = true; обои и назначаете маску

Wolsh 18.01.2011 00:32

Для BitmapData делаете copyChannel() в альфа-канал из другой битмапдаты с нужным градиентом или картой прозрачностей. Копировать можно и не альфа-канал, разумеется, но - В альфа)).

metsys 18.01.2011 12:54

сижу ломаю голову ничерта не получается, может кто то кусок кода привести хотя бы приблезительный?
вот загрузил я картинку, представил её в виде BitmapData
Код AS3:

var bmd:BitmapData=e.target.content.bitmapData;

а как мне на неё альфаканал наложить?

Добавлено через 3 часа 12 минут
и так вот до чего я дошёл

Код AS3:

import flash.display.Bitmap;
import flash.display.BitmapData;
 
var bmd:BitmapData = new BitmapData(80, 80, true, 0xFFCCCCCC);
var al:Number=255/100;
var onePercent:Number=bmd.height/100;
for (var i:uint=0; i<80; i++)
{
        for (var j:int=0; j<80; j++)
        {
                var gtPxl32:uint = bmd.getPixel32(j, i);
                var alphaValue:uint = gtPxl32 >> 24 & 0x11;
                trace(alphaValue.toString(16));
 
                var q:int=(100-(i/onePercent));
                var point:uint=gtPxl32;//-(q+0x10000000);
 
                bmd.setPixel32(j, i, point);
        }
        //trace(q);
}
 
var bm:Bitmap = new Bitmap(bmd);
addChild(bm);

я беру какую нибудь исходную BitmapData, копирую её попиксельно, и в процессе копирования каждый рядок хочу сделать прозрачным с определённым значением q. Как мне q типа int перевести в uint и поставить это значение вместо альфа канало от исходной BitmapData?
Это единственное что я придумал как сделать альфа градиент к картинке.

Wolsh 18.01.2011 18:08

Код AS3:

//черная полоска будет под битмапом для теста прозрачности.
var testShape:Shape = new Shape();
testShape.graphics.beginFill(0x000000);
testShape.graphics.drawRect(30, 0, 20, 250)
addChild(testShape);
//рабочая битмапдата
var bmd:BitmapData = new BitmapData(80, 80, true, 0xFFCCCCCC);
var bm:Bitmap = new Bitmap(bmd);
addChild(bm);
//будущая карта прозрачности
var alphaMap:BitmapData = bmd.clone();
//матрица для управления градиентом
var matrix:Matrix = new Matrix();
matrix.createGradientBox(bmd.width, bmd.height, Math.PI / 2);
//векторный градиент для отрисовки в карту прозрачности
var gradient:Shape = new Shape();
gradient.graphics.beginGradientFill("linear", [0xFFFFFF, 0x000000], [1, 1], [0, 255], matrix);
gradient.graphics.drawRect(0, 0, bmd.width, bmd.height);
gradient.graphics.endFill();
// отрисовываем в карту
alphaMap.draw(gradient);
//копируем любой канал (т.к. все изменяются одинаково от 0 до 255) в альфаканал рабочей битмап
bmd.copyChannel(alphaMap, new Rectangle(0, 0, bmd.width, bmd.height), new Point(), 2, 8);


metsys 18.01.2011 20:38

в общем сделал такой геморой, и он работает, но наверное выполнение сего кода огого какое большое. Что вы скажите по поводу этого? :
Код AS3:

import flash.display.Bitmap;
import flash.display.BitmapData;
 
var bmd:BitmapData = new BitmapData(80, 80, true, 0xFF00FF00);
var onePercent:Number=bmd.height/100;
 
for (var i:uint=0; i<80; i++)
{
        var q:uint=(2.55*(100-(i/onePercent)));
        for (var j:int=0; j<80; j++)
        {
                var gtPxl:uint = bmd.getPixel(j, i);
 
                var argb:uint=0;
                argb += (q<<24);
                argb += (gtPxl);
 
                bmd.setPixel32(j, i, argb);
        }
        trace(q);
}
 
var bm:Bitmap = new Bitmap(bmd);
addChild(bm);

сейчас буду разбиратся с кодом Wolsh


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

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