проблема слияния двух альфа-каналов объектов растровых данных - PullRequest
0 голосов
/ 23 августа 2011

у меня следующая ситуация:

один слой для рисования (графический объект с lineTo и т. Д.)

один PNG с альфа-каналом (должен служить только в качестве маски)

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

Я пытаюсь так:

var bitmapData:BitmapData = new BitmapData( 320, 320 );
bitmapData.draw( drawingLayer );
bitmapData.copyChannel( maskBitmapData, new Rectangle( 0, 0, 320, 320 ), new Point( 0, 0 ), BitmapDataChannel.ALPHA, BitmapDataChannel.ALPHA );

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

Я попробовал это с merge, copyPixels, а также просто установив свойство mask на слой рисования (я установил все в cacheAsBitmap), но безрезультатно.

Может ли кто-нибудь помочь мне здесь?

Сложение:

при попытке использовать маску я попробовал ее с

<s:BitmapImage id="mask" source="@Embed(source='...')" cacheAsBitmap="true" />

а также

[Embed("...")]
private const BodyMask:Class;
var maskBitmap:Bitmap = new BodyMask();

и присваивает их свойству mask элемента s: Group (cacheAsBitmap = true), где происходили операции с графическим объектом. Я также пытался переназначить маску после каждой операции рисования.

может быть что-то не так с этим?

Ответы [ 2 ]

1 голос
/ 10 мая 2012

У меня только что была похожая проблема, и мне удалось решить это следующим образом

maskedBitmap.fillRect(maskedBitmap.rect, 0);
bitmapData.draw( drawingLayer );
maskedBitmap.copyChannel( maskBitmap, maskBitmap.rect, new Point(), BitmapDataChannel.BLUE, BitmapDataChannel.ALPHA );
maskedBitmap.copyPixels( bitmapData, bitmapData.rect, new Point(),maskedBitmap, new Point() );

Я копирую синий канал в альфа-канал, так как мой maskBitmap имеет оттенки серого. Поскольку вы используете альфа в маске, вы должны скопировать альфа в альфа:

maskedBitmap.copyChannel( maskBitmap, maskBitmap.rect, new Point(), BitmapDataChannel.ALPHA, BitmapDataChannel.ALPHA );
0 голосов
/ 23 августа 2011

Уже давно я ничего не делал с Actionscript, но мне было интересно, почему вы пытаетесь объединить два альфа-канала.Разве вы не можете просто установить png как маску спрайта, в который вы (или пользователь) рисуете?

, как в

drawingLayer.mask = maskBitmap;
...