PDA

Просмотр полной версии : Перенос shape в bitmapdata?


SpetZ_Naz
01.11.2012, 17:21
Доброго времени суток!

Прошу помочь разобраться с проблемкой:
Хочу нарисовать на экземпляре Shape'а произвольные линии, далее эти линии загнать в BitmapData и выполнить поиск по цвету с определением координат. Привожу ниже состряпаный мною код. Линии рисует, но вот поиск не осуществляется... Думаю проблема в моем не умении загонять данные Shape'а в BitmapData.


import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.MovieClip;
import flash.display.Shape;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;

public class PaintBall extends MovieClip
{
var child:Shape = new Shape();
var bmd:BitmapData = new BitmapData (200, 200);

public function PaintBall()
{
addChild(child);
stage.addEventListener(MouseEvent.MOUSE_DOWN, onMD);
stage.addEventListener(MouseEvent.MOUSE_UP, onMU);
}

public function onMD (e:MouseEvent):void{
var to_x = e.localX;
var to_y = e.localY;
child.graphics.lineStyle(2, 0x000000, 100, true, "normal", "none");
child.graphics.moveTo(to_x,to_y)
stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}

function enterFrameHandler(event:Event):void {
var m_x:Number = stage.mouseX;
var m_y:Number = stage.mouseY;
if((m_x>5 && m_x<200) && (m_y>5 && m_y<200)){
child.graphics.lineTo(child.mouseX, child.mouseY);
}
}
function onMU(event:MouseEvent):void {
stage.removeEventListener("enterFrame", enterFrameHandler);

bmd.draw(child);
var coords:Point = null;

for (var i:uint; i<bm.height; i++){
for (var j:uint; j<bm.width; j++){

if (bmd.getPixel(i,j) == 0x000000){
coords = new Point(i, j);
trace('черный цвет найден по адресу:' + coords)
}
}
}
}
}
}

Hauts
01.11.2012, 19:22
BitmapData.getColorBoundsRect вам не поможет?

А вообще можно попробовать цикл поменять чуток:

for (var i:int = 0; i<bmd.width; i++){
for (var j:int = 0; j<bmd.height; j++){

if (bmd.getPixel(i,j) == 0x000000){
coords = new Point(i, j);
trace('черный цвет найден по адресу:' + coords)
}
}
}

amesqit
01.11.2012, 19:27
1.
for (var i:uint; i<bm.height; i++){
for (var j:uint; j<bm.width; j++){

if (bmd.getPixel(i,j) == 0x000000){
coords = new Point(i, j);
trace('черный цвет найден по адресу:' + coords)
}
}
}
переменная bm не определена
2. при отрисовывании шейпа размер битмапдаты остается тот, что был указан изначально 200x200, лучше определять размеры битмапдаты перед отрисовыванием шейпа.

Molecula
01.11.2012, 20:48
Ух ты, а как такое скомпилировалось?
var child:Shape = new Shape();
var bmd:BitmapData = new BitmapData (200, 200);
Где модификаторы доступа?

var coords:Point = null;
можно просто:
var coords:Point;

gagaga
01.11.2012, 20:58
у Point`а есть метод setTo(x:Number, y:Number) кстати

Molecula
01.11.2012, 21:03
и выполнить поиск по цвету с определением координат
Координаты всех какого-то цвета пикселей нужны?

SpetZ_Naz
01.11.2012, 22:31
BitmapData.getColorBoundsRect вам не поможет?
Незнаю как его к коду применить, я новичок, да и пока что хочется по своему методу реализовать, пускай он и не рациональный.
А вообще можно попробовать цикл поменять чуток:
переменная bm не определена
Не помогает... Дело в том, что условие не работает или цикл не прошаривает по области 200 на 200:

for (var i:uint; i<bmd.width; i++){
for (var j:uint; j<bmd.height; j++){

if (bmd.getPixel(i,j) == 0x000000){
coords = new Point(i, j);
trace('черный цвет найден по адресу:' + coords)
}
}
}

Вроде все логично написал и должно было заработать..(
Ух ты, а как такое скомпилировалось?
var child:Shape = new Shape();
var bmd:BitmapData = new BitmapData (200, 200);
Да без проблем скомпилировалось, не понимаю, что Вас смущает.
Где модификаторы доступа?
По умолчанию конечно же public, видны в любом месте кода, не суть важно.
можно просто:
Можно, но тоже не суть важно.
Координаты всех какого-то цвета пикселей нужны?
В данном случае я ищу черные пиксели нанесенные мышкой и как только кнопка мыши отпускается, должен сработать поиск этих пикселей.

Всем спасибо. Проблема осталось не решенной, цикл не ищет пиксели.

Wolsh
01.11.2012, 23:56
В качестве предположения. Сделайте толщину линий 10, чисто для теста.
Я допускаю, что черных пикселей просто нет. Тонкие линии сглаживаются, битмапдата изначально белая, и черный цвет при сглаживании смешивается с белым, так что значения 0х000000 может реально не быть на рисунке.

maxkar
02.11.2012, 00:09
for (var i:uint; i<bmd.width; i++){
for (var j:uint; j<bmd.height; j++){

Ваш код полностью эквивалентент коду

var i:unit = 0;
var j:uint = 0;
for (;i < bmd.width; i++)
for (;j < bmd.height; j++) {

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

amesqit
02.11.2012, 00:10
то о чем я говорил, попробуйте:
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.MovieClip;
import flash.display.Shape;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;

public class PaintBall extends MovieClip
{
var child:Shape = new Shape();
//!!!!!
var bmd:BitmapData;
//!!!!!
public function PaintBall()
{
addChild(child);
stage.addEventListener(MouseEvent.MOUSE_DOWN, onMD);
stage.addEventListener(MouseEvent.MOUSE_UP, onMU);
}

public function onMD(e:MouseEvent):void
{
var to_x = e.localX;
var to_y = e.localY;
child.graphics.lineStyle(2, 0x000000, 100, true, "normal", "none");
child.graphics.moveTo(to_x, to_y)
stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}

function enterFrameHandler(event:Event):void
{
var m_x:Number = stage.mouseX;
var m_y:Number = stage.mouseY;
if ((m_x > 5 && m_x < 200) && (m_y > 5 && m_y < 200))
{
child.graphics.lineTo(child.mouseX, child.mouseY);
}
}

function onMU(event:MouseEvent):void
{
stage.removeEventListener("enterFrame", enterFrameHandler);
//!!!!!
if (child.width==0 || child.height==0) return;
bmd = new BitmapData(child.width, child.height);
//!!!!!
bmd.draw(child);
var coords:Point = null;

for (var i:uint; i < bmd.height; i++)
{
for (var j:uint; j < bmd.width; j++)
{

if (bmd.getPixel(i, j) == 0x000000)
{
coords = new Point(i, j);
trace('черный цвет найден по адресу:' + coords)
}
}
}
}
}
}

dimarik
02.11.2012, 00:16
Можно создавать отдельные экземпляры Shape для каждого "штриха" чтобы не заниматься рекогнишином всяких линий в симбиозном битмапе.

В подписи "ответ прост: be || !be == true" есть ненужное ==

TanaTiX
02.11.2012, 01:32
По умолчанию конечно же public
Вообще-то internal. Это так, к слову.

billion
02.11.2012, 06:19
может вам проще разобрать Шейп с помощью определённой библиотеки и взять координаты оттуда?

http://www.flasher.ru/forum/showthread.php?t=185940

SpetZ_Naz
02.11.2012, 19:58
Wolsh
В качестве предположения. Сделайте толщину линий 10, чисто для теста.
Попробовал, не помогло.

TanaTiX
Вообще-то internal. Это так, к слову.
Да, согласен, перепутал.. "Доступ внутри пакета".

dimarik
Можно создавать отдельные экземпляры Shape для каждого "штриха" чтобы не заниматься рекогнишином всяких линий в симбиозном битмапе.
Может Вы и правы, но с примером кода, мне бы было понятней.

maxkar
Ваш код полностью эквивалентент коду
var i:unit = 0;
var j:uint = 0;
for (;i < bmd.width; i++)
for (;j < bmd.height; j++) {
Не совсем эквивалентен, так как в моем коде ошибка, но Ваше замечание оказалось решающим: цикл должен выглядеть так:

for (var i:uint = 0; i<bmd.width; i++){
for (var j:uint = 0; j<bmd.height; j++){

Привожу рабочий код, может такому же новичку пригодится (если есть не рациональные решения, прошу поправить):
package
{
import flash.display.BitmapData;
import flash.display.Shape;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;


public class PaintBall extends MovieClip
{
var child:Shape = new Shape();
var bmd:BitmapData;

public function PaintBall()
{
addChild(child);
stage.addEventListener(MouseEvent.MOUSE_DOWN, onMD);
stage.addEventListener(MouseEvent.MOUSE_UP, onMU);
}

public function onMD (e:MouseEvent):void{
var to_x = e.localX;
var to_y = e.localY;
child.graphics.lineStyle(2, 0x000000, 100, true, "normal", "none");
child.graphics.moveTo(to_x,to_y)
stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}

public function enterFrameHandler(event:Event):void {
var m_x:Number = stage.mouseX;
var m_y:Number = stage.mouseY;
if((m_x>5 && m_x<200) && (m_y>5 && m_y<200)){
child.graphics.lineTo(child.mouseX, child.mouseY);
}
}
public function onMU(event:MouseEvent):void {
stage.removeEventListener("enterFrame", enterFrameHandler);

if (child.width==0 || child.height==0) return;

bmd = new BitmapData (200, 200);
bmd.draw(child);
var coords:Point = null;
for (var i:uint = 0; i<bmd.width; i++){
for (var j:uint = 0; j<bmd.height; j++){
if (bmd.getPixel(i,j) == 0x000000){
coords = new Point(i, j);
trace('черный цвет найден по адресу:' + coords);
}
}
}
}
}
}