Просмотр полной версии : Не отображается объект Bitmap
Есть программка, хочу вывести попиксельно картинку,придавая каждому пикселу свою координату z,чтобы эта картинка была якобы в 3D и растянутой по поверхности нужной мне,есть массив a на 102400 элементов, в нем хранятся координаты для каждого пиксела z int. Посмотрите, может я что-то не так делаю.
var myBitmapDataObject:BitmapData = new BitmapData(1, 1);
var myImage:Bitmap = new Bitmap(myBitmapDataObject);
var imageLoader:Loader = new Loader();
imageLoader.contentLoaderInfo.addEventListener(Event.INIT,InitListener);
imageLoader.load(new URLRequest("2.jpg"));
function InitListener(e:Event): void
{
var g = 0;
var colorsOfPixels:uint = 0;
for (var i1:uint = 0; i1<320; i1++)
{
for (var j1:uint = 0; j1<320; j1++)
{
colorsOfPixels = Bitmap(imageLoader.content).bitmapData.getPixel(i1,j1);
myImage.bitmapData.setPixel(0,0,colorsOfPixels);
myImage.x = i1;
myImage.y = j1;
myImage.z = a[g];
addChild(myImage);
g++;
}
}
}
myImage в таком случае надо в каждой итерации создавать. Вы же одну и ту же картинку закрашиваете в одном и том же месте (0, 0) и потом ее же смещаете по x, y, z. Ну один пиксель Вы и видите, последний.
Тогда, как я понял, должен быть следующий код:
var myBitmapDataObject:BitmapData = new BitmapData(1, 1);
var imageLoader:Loader = new Loader();
imageLoader.contentLoaderInfo.addEventListener(Event.INIT,InitListener);
imageLoader.load(new URLRequest("2.jpg"));
function InitListener(e:Event): void
{
var g = 0;
var colorsOfPixels:uint = 0;
for (var i1:uint = 0; i1<320; i1++)
{
for (var j1:uint = 0; j1<320; j1++)
{
var myImage:Bitmap = new Bitmap(myBitmapDataObject);
colorsOfPixels = Bitmap(imageLoader.content).bitmapData.getPixel(i1,j1);
myImage.bitmapData.setPixel(0,0,colorsOfPixels);
myImage.x = i1;
myImage.y = j1;
myImage.z = a[g];
addChild(myImage);
g++;
}
}
}
Добавлено через 14 минут
А как можно еще растянуть векторную или растровую картинку (кадр) на нужную мне поверхность? есть уравнение поверхности,есть страница с флеш-роликами,надо,чтобы эта страница была растянута по нужной поверхности,притом чтобы анимация сохранилась
var myImage:Bitmap = new Bitmap(myBitmapDataObject.clone());
Иначе myImage.bitmapData.setPixel(0,0,colorsOfPixels); будет закрашивать пиксель в одной и той же битмапдате, отображаемой во всех myImage.
Возможно, дешевле было бы создавать Shape и рисовать в нем прямоугольник 1х1 с нужным цветом?))
Но для решения задачи все же лучше просчитать вершины и нанести текстуру через drawTriangles()/
если через Shape, то код будет таким,как я понимаю
function InitListener(e:Event): void
{
//this.addChild(imageLoader.content);
g = 0;
var colorsOfPixels:uint = 0;
for (var i1:uint = 0; i1<320; i1++)
{
for (var j1:uint = 0; j1<320; j1++)
{
colorsOfPixels = Bitmap(imageLoader.content).bitmapData.getPixel(i1,j1);
var imagination:Shape = new Shape();
imagination.graphics.beginFill(colorsOfPixels);
imagination.graphics.lineStyle(1,colorsOfPixels);
imagination.graphics.drawRect(i1,j1,1,1);
imagination.graphics.endFill();
imagination.x = i1;
imagination.y = j1;
imagination.z = a[g];
addChild(imagination);
trace(String(g)+','+String(colorsOfPixels)+','+String(a[g]));
g++;
}
}
Добавлено через 16 минут
при просмотре вывода этого кода выяснилось, что он проходит все элементы массива с коорлинатой z,а потом еще раз проходит 63825 элементов и,соответсвенно,выводит еще раз чуть больше половины прямоугольников.не знает кто-нибудь,что это может быть?
1. Где addChild(imagination)?
2. Зачем Вам обводка? Вы один пиксель рисуете, что собрались обводить?))) Собводкой 1 будет шейп 2х2 пикселя.
3. Зачем Вы рисуете в шейпе пиксель в координатах (i1,j1), а потом этот шейп смещаете еще раз в координаты (i1,j1)? Рисуйте в (0,0).
4. Почему цикл проходит два раза? Ну, по-видимому, потому что хендлер вызывается два раза, то есть Событие ловится дважды. Поставьте трейс в начале хендлера и проверьте.
Добавлено через 3 минуты
А, еще.
colorsOfPixels = Bitmap(imageLoader.content).bitmapData.getPixel(i1,j1);Никогда так не делайте. Сохраните Bitmap(imageLoader.content).bitmapData в переменной типа BitmapData еще до начала цикла, не заставляйте плеер искать не только пиксель, но и Лоадер, его контент, приводить его к Битмап и вытаскивать из него битмапдату. Пожалейте компьютер пользователя и его время.
а если как-нибудь по-другому растянуть кадр на сферу изнутри?кроме этой моей идеи. подскажите направление и приблизительный код
Добавлено через 1 час 58 минут
проверил,действительно,вызывается дважды,только не могу понять,почему происходит еще раз данное событие. ниже весь мой скромный код:
import flash.net.URLRequest;
import flash.display.*;
import flash.events.Event;
var a:Array = new Array(25600);
var g:int = 0;
for (var i:int=-160;i<160;i++)
{
for (var j:int=-160;j<160;j++)
{
a[g] = uint(Math.sqrt(32400-i*i-j*j));
g++;
}
}
var imageLoader:Loader = new Loader();
imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,CompleteListener);
imageLoader.load(new URLRequest("2.jpg"));
function CompleteListener(e:Event): void
{
g = 0;
var colorsOfPixels:uint = 0;
var imageLoaderBitmapData: BitmapData = Bitmap(imageLoader.content).bitmapData;
for (var i1:uint = 0; i1<320; i1++)
{
for (var j1:uint = 0; j1<320; j1++)
{
colorsOfPixels = imageLoaderBitmapData.getPixel(i1,j1);
var imagination:Shape = new Shape();
imagination.graphics.beginFill(colorsOfPixels);
imagination.graphics.drawRect(0,0,1,1);
imagination.graphics.endFill();
imagination.x = i1;
imagination.y = j1;
imagination.z = a[g];
addChild(imagination);
trace(String(g)+','+String(colorsOfPixels)+','+String(a[g]));
g++;
}
}
}
может у кого-то будет мысль,почему дважды срабатывает событие
Добавлено через 2 часа 0 минут
import flash.net.URLRequest;
import flash.display.*;
import flash.events.Event;
var a:Array = new Array(25600);
var g:int = 0;
for (var i:int=-160;i<160;i++)
{
for (var j:int=-160;j<160;j++)
{
a[g] = uint(Math.sqrt(32400-i*i-j*j));
g++;
}
}
var imageLoader:Loader = new Loader();
imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,CompleteListener);
imageLoader.load(new URLRequest("2.jpg"));
function CompleteListener(e:Event): void
{
g = 0;
var colorsOfPixels:uint = 0;
var imageLoaderBitmapData: BitmapData = Bitmap(imageLoader.content).bitmapData;
for (var i1:uint = 0; i1<320; i1++)
{
for (var j1:uint = 0; j1<320; j1++)
{
colorsOfPixels = imageLoaderBitmapData.getPixel(i1,j1);
var imagination:Shape = new Shape();
imagination.graphics.beginFill(colorsOfPixels);
imagination.graphics.drawRect(0,0,1,1);
imagination.graphics.endFill();
imagination.x = i1;
imagination.y = j1;
imagination.z = a[g];
addChild(imagination);
trace(String(g)+','+String(colorsOfPixels)+','+String(a[g]));
g++;
}
}
}
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.