Как настроить copyPixels на игнорирование прозрачных пикселей? - PullRequest
2 голосов
/ 18 марта 2011

У меня есть объект BitmapData с прозрачностью (параметр sourceBitmapData). Каждый раз, когда я использую copyPixels () для копирования его в другой объект BitmapData, прозрачные пиксели заменяют все, что находится под ними. Я хотел бы, чтобы функция copyPixels () просто игнорировала эти полностью прозрачные пиксели (0x00) и НЕ копировала их.

Есть идеи?

Кстати, я пытался установить для alphaMerge значение true, но это не решает проблему - весь исходный объект просто становится черным и игнорирует ВСЕ прозрачности.

EDIT:

Вот фрагменты кода;

var b:UIComponent = new UIComponent();
    b.graphics.beginFill(color, opacity);
    b.graphics.drawCircle(size * 2, size * 2, size);
    b.graphics.endFill();

    shape = new BitmapData(size * 4, size * 4, true, 0x00FFFFFF);
    shape.draw(b);
    rect = new Rectangle(0, 0, size * 4, size * 4);
    shape.applyFilter(shape, rect, new Point(0, 0), new BlurFilter(20, 20) );

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

drawBuffer.copyPixels(shape, rect, pnt, null, null, false);

После этого он применяет полученное изображение несколько раз к drawBuffer. Если для alphaMerge установлено значение true, форма выглядит как черный шарик - кажется, что вся альфа-информация просто игнорируется, а значение альфа установлено в 0xFF (примечание: это мое предположение, основанное на том, как оно выглядит, я не проверял его ). С другой стороны, если для alphaMerge установлено значение false, прозрачность есть все, кроме того, что она перезаписывает все, что находится под ним (пиксели в drawBuffer), в прозрачные пиксели.

На всякий случай, если вам нужен также код для drawBuffer:

drawBuffer = new BitmapData(bitmapData.width, bitmapData.height, true, 0);
drawCanvas.graphics.beginBitmapFill(drawBuffer, null, false, true);
drawCanvas.graphics.drawRect(0, 0, drawBuffer.width, drawBuffer.height);
drawCanvas.graphics.endFill(); 

Ответы [ 4 ]

1 голос
/ 18 марта 2011

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

Скопируйте это в пустой FLA:

var color:uint = 0xff0000;
var opacity:Number = 0.8;
var size:Number = 50;

var b:Sprite = new Sprite();
b.graphics.beginFill(color, opacity);
b.graphics.drawCircle(size * 2, size * 2, size);
b.graphics.endFill();

// draw semitransparent object from "b" to shape
var shape:BitmapData = new BitmapData(size * 4, size * 4, true, 0x00FFFFFF);
shape.draw(b);
var rect:Rectangle = new Rectangle(0, 0, size * 4, size * 4);
shape.applyFilter(shape, rect, new Point(0, 0), new BlurFilter(20, 20) );
var pnt:Point = new Point;


// create drawBuffer with yellow (to indicate transparency)
var drawBuffer:BitmapData;
drawBuffer = new BitmapData(300, 300, true, 0xffffff00);

// copy to drawBuffer (preserving transparency)
drawBuffer.copyPixels(shape, rect, pnt, null, null, true);

// using drawCanvas, put drawBuffer to screen
var drawCanvas:Sprite = new Sprite;
drawCanvas.graphics.beginBitmapFill(drawBuffer, null, false, true);
drawCanvas.graphics.drawRect(0, 0, drawBuffer.width, drawBuffer.height);
drawCanvas.graphics.endFill(); 
addChild(drawCanvas);

(Обратите внимание, что я перешел в true в copyPixels's mergeAlpha.)

1 голос
/ 18 марта 2011

Вы определенно хотите, чтобы mergeAlpha был истинным:

drawBuffer.copyPixels(shape, rect, pnt, null, null, true);

Поскольку это не работает для вас, дважды проверьте содержимое растрового изображения. Вы можете сделать это, добавив его непосредственно на сцену, гарантируя, что вы видите истинное содержание:

var b:Bitmap = new Bitmap(shape);
stage.addChild(b);

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

Также измените UIComponent на Sprite или аналогичный. Я не знаком с UIComponent, но вы, похоже, не используете его функциональность.

0 голосов
/ 27 июля 2013

В одной из ваших попыток у вас была следующая строка:

drawBuffer = новые BitmapData (300, 300, true, 0xffffff00);

Попробуйте изменить альфа-значение цветового ввода, например:

drawBuffer = новые BitmapData (300, 300, true, 0x00ffff00);

- Это небольшое изменение, но оно может привести вас туда, куда вы хотите.

-xprdq

0 голосов
/ 18 марта 2011

Возможно, я упускаю что-то очевидное, но copyPixel делает только то, что говорит - копирует пиксели. Он полностью игнорирует то, что находится снизу, поэтому любой не 100% прозрачный пиксель (с объединением, установленным в true) будет переопределен вашим пикселем. Учитывая, что у вас есть пиксель, 0xFFFF00FF (красный), если вы скопируете на его место пиксель 0x4400FF00, результат будет перезаписываться, а не рисоваться - 0x4400FF00.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...