Просмотр полной версии : Перенос 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)
}
}
}
}
}
}
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)
}
}
}
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;
у 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, видны в любом месте кода, не суть важно.
можно просто:
Можно, но тоже не суть важно.
Координаты всех какого-то цвета пикселей нужны?
В данном случае я ищу черные пиксели нанесенные мышкой и как только кнопка мыши отпускается, должен сработать поиск этих пикселей.
Всем спасибо. Проблема осталось не решенной, цикл не ищет пиксели.
В качестве предположения. Сделайте толщину линий 10, чисто для теста.
Я допускаю, что черных пикселей просто нет. Тонкие линии сглаживаются, битмапдата изначально белая, и черный цвет при сглаживании смешивается с белым, так что значения 0х000000 может реально не быть на рисунке.
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++) {
И внутренний цикл выполняется ровно один раз. Устанавливайте начальные значения переменным в заголовке цикла. И вообще, избегайте декларации переменных без их инициализации в той же строке.
то о чем я говорил, попробуйте:
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)
}
}
}
}
}
}
Можно создавать отдельные экземпляры Shape для каждого "штриха" чтобы не заниматься рекогнишином всяких линий в симбиозном битмапе.
В подписи "ответ прост: be || !be == true" есть ненужное ==
По умолчанию конечно же public
Вообще-то internal. Это так, к слову.
может вам проще разобрать Шейп с помощью определённой библиотеки и взять координаты оттуда?
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);
}
}
}
}
}
}
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.