PDA

Просмотр полной версии : кривые --> Bitmap (Возможно?)


CREDO
25.02.2007, 00:29
Есть изображение с многочисленными кривыми. При публикации клипа, сильно загружается процессор. Можно ли как нибудь преобразовать графику в bitmapData и даст ли это толк?

miramax
25.02.2007, 00:35
Даст, толк = количество сплайнов / размер битмапДаты.
См. bitmapData.draw();

this.create
25.02.2007, 01:09
This class lets you separate bitmap rendering operations from the Flash Player internal display updating routines. By manipulating a BitmapData object directly, you can create very complex images without incurring the per-frame overhead of constantly redrawing the content from vector data.
Как раз для этих случаев изобрели BitmapData.

CREDO
25.02.2007, 01:46
import flash.display.BitmapData;
var myBitmapData:BitmapData = new BitmapData();
myBitmapData.draw(ripples_mc);

Этого будет достаточно? Как проверить преобразовались кривые в bitmap?

this.create
25.02.2007, 01:48
Удалите мувик с ними.

etc
25.02.2007, 01:48
Битмап без параметров не задают, все четыре параметра конструктора обязательны.

CREDO
25.02.2007, 01:52
import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.geom.Matrix;
import flash.geom.ColorTransform;
var myBitmapData:BitmapData = new BitmapData();
var myMatrix:Matrix = new Matrix();
myMatrix.rotate(Math.PI/2);
var translateMatrix:Matrix = new Matrix();
translateMatrix.translate(70, 15);
myMatrix.concat(translateMatrix);
var myColorTransform:ColorTransform = new ColorTransform(0, 0, 1, 1, 0, 0, 255, 0);
var blendMode:String = "normal";
var myRectangle:Rectangle = new Rectangle(0, 0, 100, 80);
var smooth:Boolean = true;
myBitmapData.draw(ripples_mc, myMatrix, myColorTransform, blendMode, myRectangle, smooth);



Как проверить?

Woozle
25.02.2007, 01:57
на счет этого есть интересная вещь http://www.bytearray.org/?p=67

this.create
25.02.2007, 01:59
Вот вы создаете экземпляр класса BitmapData. И создаете его неправильно. Посмотрите в help как надо создавать объекты BitmapData.

CREDO
25.02.2007, 02:04
import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.geom.Matrix;
import flash.geom.ColorTransform;

var myBitmapData:BitmapData = new BitmapData(100, 80, false, 0x00CCCCCC);

var mc_1:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
mc_1.attachBitmap(myBitmapData, this.getNextHighestDepth());

var mc_2:MovieClip = createRectangle(50, 40, 0xFF0000);
mc_2._x = 101;

var myMatrix:Matrix = new Matrix();
myMatrix.rotate(Math.PI/2);

var translateMatrix:Matrix = new Matrix();
translateMatrix.translate(70, 15);

myMatrix.concat(translateMatrix);

var myColorTransform:ColorTransform = new ColorTransform(0, 0, 1, 1, 0, 0, 255, 0);
var blendMode:String = "normal";

var myRectangle:Rectangle = new Rectangle(0, 0, 100, 80);
var smooth:Boolean = true;

mc_1.onPress = function() {
myBitmapData.draw(mc_2, myMatrix, myColorTransform, blendMode, myRectangle, smooth);
}

function createRectangle(width:Number, height:Number, color:Number):MovieClip {
var depth:Number = this.getNextHighestDepth();
var mc:MovieClip = this.createEmptyMovieClip("mc_" + depth, depth);
mc.beginFill(color);
mc.lineTo(0, height);
mc.lineTo(width, height);
mc.lineTo(width, 0);
mc.lineTo(0, 0);
return mc;
}





Вот из helpa/ Всё равно не пойму.

etc
25.02.2007, 02:10
attachBitmap, читай про этот метод.

CREDO
25.02.2007, 02:19
import flash.display.*;
var Screen:MovieClip;
Screen = ripples_mc;
Bitmap = new BitmapData();
Screen.attachBitmap(Bitmap, 0);


так?

По подобию вроде так, но впечатление будто в клип загружаем пустой битмап.

CREDO
25.02.2007, 02:35
Не понятно, attachBitmap, по идее атачит уже битмап в клип, а задача: преобразовать клип с кривыми в битмап (или клип с битмапом).

this.create
25.02.2007, 02:50
Создаете пустой мувиклип. Создаете экземпляр класса BitmapData(new BitmapData). Присоединяете экземпляр класса BitmapData к пустому мувику(attachBitmap). Создаете в экземпляре BitmapData копию вышего векторного рисунка(draw). Как цель для создания копии указываете мувиклип в котором лежит ваш векторный рисунок. Проверяете, удаляя мувик где создали векторный рисунок.

etc
25.02.2007, 11:39
import flash.display.*;
var Screen:MovieClip;
Screen = ripples_mc;
Bitmap = new BitmapData();
Screen.attachBitmap(Bitmap, 0);


так?

По подобию вроде так, но впечатление будто в клип загружаем пустой битмап.
Ну я же писал выше, что параметры надо обязательно указывать при создании BitmapData. А у тебя ни ширины/высоты, ни цвета, ни прозрачности не указано.

CREDO
25.02.2007, 12:16
Ну я же писал выше, что параметры надо обязательно указывать при создании BitmapData. А у тебя ни ширины/высоты, ни цвета, ни прозрачности не указано.

Вот пример из help. Не все праметры обязательны.


import flash.display.BitmapData;

var width:Number = 100;
var height:Number = 80;
var transparent:Boolean = true;
var fillColor:Number = 0xFFFFFFFF;

var bitmap_1:BitmapData = new BitmapData(width, height, transparent, fillColor);

trace(bitmap_1.width); // 100
trace(bitmap_1.height); // 80
trace(bitmap_1.transparent); // true

var bitmap_2:BitmapData = new BitmapData(width, height);

trace(bitmap_2.width); // 100
trace(bitmap_2.height); // 80
trace(bitmap_2.transparent); // true

CREDO
25.02.2007, 12:38
Создаете пустой мувиклип. Создаете экземпляр класса BitmapData(new BitmapData). Присоединяете экземпляр класса BitmapData к пустому мувику(attachBitmap). Создаете в экземпляре BitmapData копию вышего векторного рисунка(draw). Как цель для создания копии указываете мувиклип в котором лежит ваш векторный рисунок. Проверяете, удаляя мувик где создали векторный рисунок.



import flash.display.*;
this.createEmptyMovieClip("clip_mc", 0)
var bitmap:BitmapData = new BitmapData(500,100);
clip_mc.attachBitmap(bitmap, 5)
bitmap.draw("lines_mc")



Теперь получилось.

miramax
25.02.2007, 12:55
2 параметра обязательны - width и height.

etc
25.02.2007, 12:59
Не все праметры обязательны.
А я сказал, что все обязательны? :)
У тебя-то вообще никаких не было.

В draw никаких кавычек, в хелпе что, написано, что там String?

CREDO
25.02.2007, 13:18
Возможно ли сразу из библиотеки кривые преобразовыватьв bitmap. Иначе получается что существуют сразу и кривые и bitmap.

Есть какие-нибудь рациональные пути решения? Или единственное решение removeMovieClip()?

miramax
25.02.2007, 14:39
Возможно ли сразу из библиотеки кривые преобразовыватьв bitmap. Иначе получается что существуют сразу и кривые и bitmap.

Есть какие-нибудь рациональные пути решения? Или единственное решение removeMovieClip()?
Познакомься с АС3, там совсем другая логика работы с "клипами".

CREDO
25.02.2007, 14:45
Да я видел. Но пока нужно AS 2.

CREDO
25.02.2007, 16:30
Хочу создать класс, который будет аттачить клипы из библиотеки и преобразовывать в bitmap по типу описанном выше.


import flash.display.BitmapData;
class CreateBitmap {
function CreateBitmap(target:MovieClip) {
MovieClip.prototype.addCreateBitmap = function() {
var position:MovieClip = this;
var target_width = target._width;
var target_height = target._height;
var bitmap:BitmapData = new BitmapData(target_width, target_height, true, 0xFFFFFF);
position.createEmptyMovieClip(target, 100);
};
}
}


Не пойму чего не нравится.

lowka
25.02.2007, 17:15
Вам что-то вроде этого нужно?

import flash.display.BitmapData;

class utils.BitmapUtils {
/**
* Метод. Создание bitmap-копии мувика.
* @param target мувик, который хотим перегнать в bitmap.
* @param depth глубина на которой будет располагаться bitmap-копия мувика.
*/
public static function movieclipToBitmap(target:MovieClip, depth:Number):Void {
if(!MovieClip(target)){
return;
}
var bitmap:BitmapData = new BitmapData(target._width, target._height, true, 0x00000000);
bitmap.draw(target);

target._parent.attachBitmap(bitmap, depth);
target.removeMovieClip();
}
}


Использование:

import BitmapUtils;

var mc:MovieClip = this.attachMovie("libraryID", "anyName", 0);
BitmapUtils.movieclipToBitmap(target, 10);

CREDO
25.02.2007, 18:01
Для чего нужен utils в utils.BitmapUtils ?

CREDO
25.02.2007, 18:19
Кажется от этого класса никакого толка нет. Проверить это можно прописав в классе:

var bitmap:BitmapData = new BitmapData(100, 100);


Изображение будет таким как в библиотеке, тобишь bitmapa нет.

CREDO
25.02.2007, 18:27
как то класс не импотрируется, при этом не ругается.

miramax
25.02.2007, 18:33
CREDO - почитай где-нибудь про именование классов и пакетов. Можно здесь - http://www.intuit.ru/department/pl/javapl/5/2.html .
Всё это применительно к as.

CREDO
25.02.2007, 18:56
BitmapUtils.as

import flash.display.BitmapData;
class BitmapUtils {
public static function movieclipToBitmap(target:MovieClip, depth:Number):Void {
if (!MovieClip(target)) {
return;
}
var bitmap:BitmapData = new BitmapData(100, 100);
bitmap.draw(target);
target._parent.attachBitmap(bitmap, depth);
target.removeMovieClip();
}
}


*.fla

import BitmapUtils;
trace(BitmapUtils)


Что не так?

etc
25.02.2007, 18:57
А что трейсит-то?

CREDO
25.02.2007, 18:59
The class or interface 'BitmapUtils' could not be loaded.
trace(BitmapUtils)

Выводит

etc
25.02.2007, 19:53
А BitmapUtils.as лежит рядом с исходником?
Версия флеша какая, кстати?

lowka
25.02.2007, 20:01
Я там ошибся немного вместо target надо mc... И utils перед Bitmap забыл :rolleyes:

CREDO
25.02.2007, 20:01
Версия 8. Лежит рядом.

CREDO
25.02.2007, 20:05
lowka, так зачем нужен utils ?

lowka
25.02.2007, 20:15
я разместил этот класс в пакете utils (так уж вышло). В принице в данном случае можно было и без этого обойтись.

CREDO
25.02.2007, 20:16
Я там ошибся немного вместо target надо mc... И utils перед Bitmap забыл :rolleyes:

Lowka спасибо что помогаешь, но класс не рабочий.

подставь.

var bitmap:BitmapData = new BitmapData(100, 100, false, 0x00000000);


по идее должно быть изображение 100 на 100, а получается, оно просто аттачится из библиотеки.

CREDO
25.02.2007, 20:17
Это точно для AS 2?

lowka
25.02.2007, 20:52
Переделал немного.

CREDO
25.02.2007, 21:05
У меня так же не работает :(

я поставил 100 на 100, но клип всё равно полностью отображается.

CREDO
25.02.2007, 21:26
В классах применять attachMovie не возможно?

lowka
26.02.2007, 00:38
возможно.

CREDO
26.02.2007, 00:57
Отлично!!!!!!!!!!!!!!!!!!!!

CREDO
26.02.2007, 01:19
Единственный минус:
рентабельность класса.

Класс практически не упрощает преобразование.

вот пример в те же 6 сторочек, только без класса.


import flash.display.*;
this.createEmptyMovieClip("clip_mc", 0)
var bitmap:BitmapData = new BitmapData(500,100);
clip_mc.attachBitmap(bitmap, 5)
bitmap.draw("lines_mc")

CREDO
26.02.2007, 03:05
Вот более рентабельный класс!
Используется только 1 мувик.

Для вызова требуется лишь:

import BitmapUtils;
BitmapUtils.movieclipToBitmap("myMovie", ["news", _root, 50, 50, 150,20]);// *Доработав с шириной и высотой


Не получается ширину сделать необязательным параметром.

etc
26.02.2007, 11:59
Ну начнем с того, что ты в функцию передаешь только два аргумента.
И потом, как уже было сказано, ширина и высота для BitmapData являются обязательными параметрами.

CREDO
26.02.2007, 20:40
Нет. Ширина и высота не обязательные.

Я просто не пойму как написать строку которая будет присваивать значение по умолчанию.

width = undefiend ? with: 100// Это не работает.

etc
26.02.2007, 20:52
Потому что в этой строке две грамматических ошибки и одна синтаксическая.

width = (!isNaN(width) && width > 0) ? width : 100;

CREDO
24.03.2007, 20:51
Как написать, что бы по умолчанию ширина и высота битмапа была равной ширине и высоте клипа

width = (!isNaN(width) && width>0) ? width :// ?;


import flash.display.BitmapData;
class BitmapUtils {
public static function movieclipToBitmap(linkageID:String, attacher:String, target:MovieClip, position_x:Number, position_y:Number, width:Number, height:Number) {
attacher == undefined ? attacher : "bitmap_mc";
target == undefined ? target : _level;
position_x == undefined ? position_x : 0;
position_y == undefined ? position_y : 0;
width = (!isNaN(width) && width>0) ? width : //?;
height = (!isNaN(height) && height>0) ? height : //?;
var container:MovieClip = target.createEmptyMovieClip(attacher, target.getNextHighestDepth());
container._x = position_x;
container._y = position_y;
container.attachMovie(linkageID, "temp_movie", container.getNextHighestDepth());
var bitmap:BitmapData = new BitmapData(width, height, true, 0x00000000);
bitmap.draw(container);
container.attachBitmap(bitmap, 0);
}
}

etc
24.03.2007, 21:03
container._width

CREDO
24.03.2007, 21:17
target == undefined ? target : _root;Эта строка, почему-то тоже не работает

lowka
24.03.2007, 21:27
target = undefined ? target : _root;

etc
24.03.2007, 21:30
target = target==undefined ? _root : target;

Может все-таки открыть хелп и прочитать, что есть оператор «?»?

CREDO
24.03.2007, 21:34
Вот так тоже работает.
target == undefined ? target : eval("_level")
_etc , как лучше?

iNils
24.03.2007, 21:50
CREDO, я вас сейчас на неделю забаню за отсутствие тегов.

etc
24.03.2007, 22:20
CREDO, лучше проанализировать свой же код и понять, что он делает.