Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Общие вопросы о Flash (не затрагивающие ActionScript) (http://www.flasher.ru/forum/forumdisplay.php?f=60)
-   -   Простенький графический редактор на флеше. (http://www.flasher.ru/forum/showthread.php?t=85304)

Fbor 19.09.2006 21:28

Простенький графический редактор на флеше.
 
Кто-нибудь может бросить ссылкой на исходники простенького граф. редактора?

Или может у кого есть идеи.

Суть в том, что необходим простой редактор (холст и один инструмент - карандаш). Итоговую картинку надо разобрать попиксельно (точнее сжать с помощью LZW). Палитра предопределена.

Я пока что-то смутно представляю каким образом это можно сделать во флеше (редактор, с LZW все понятно). То, как я себе представляю, имхо, весьма накладно и будет тормозить, возможно для этого есть некие спец. вещи во флеше?

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

D12 20.09.2006 00:22

Еще раз , можно уточнить что должен делать редактор ??

Насчет карондоша понятно , дальше нет , ты хочешь изменять каждый пиксель на картинке ??? тогда БитмапДата флешь 8 не ниже .

Dendroid 20.09.2006 00:43

Уже то, что надо разобрать попиксельно - значит, что надо использовать bitmapData. И лучше сразу 9-й плеер, чтобы побыстрее шевелилось...
Кстати, и сам LZW можно легко сделать в том же actionscript 3.0, ZIP ведь уже реализовали, не так уж сильно тормозит, а LZW должен ещё побыстрее кодировать... :)

Fbor 20.09.2006 12:05

Спасибо за ответы.

Dendroid
LZW как раз у меня не вызывает опасения. Тем более, что при предопределенной палитре все должно получиться весьма просто.

Вопрос именно в рисовании.

Уточню, что должен уметь редактор. А уметь он должен немного.
Должен быть всего один инструмент - карандаш, у которого можно выбрать диаметр и цвет из предопределенной палитры. И этим карандашом надо рисовать на холсте (битмапдата, как я понимаю вы советуете).
Затем рисинок я сожму с помощью LZW и все.
В общем.. интересует именно вопрос рисования карандашом на "холсте".
Как это реализовать лучше?
Ну там... обрабатывать события движения мыши поверх битмапдаты (если такое есть) и вычисляя диаметр карандаша закаршивать пикселы.
Или есть для этого что-то специальное?

Fbor 20.09.2006 12:11

P.S. И где можно почитать про BitmapData. В яндексе мало ссылок.. видать не очень популярная это тема :)

iNils 20.09.2006 12:33

В хелпе.

Хемуль 20.09.2006 12:57

2 Fbor:
Пользуйтесь Google.

etc 20.09.2006 13:36

Цитата:

Сообщение от Fbor
P.S. И где можно почитать про BitmapData. В яндексе мало ссылок.. видать не очень популярная это тема :)

http://livedocs.macromedia.com/flash.../00001942.html
Текст по ссылке можно обнаружить при нажатии кнопки F1. А вы не знали? :bye:
В Яндексе потому и мало ссылок, потому что не нужны, когда есть волшебная кнопка F1, которой, некоторые, до сих пор не научились пользоваться и ждут ответа на свои вопросы часами.

Хемуль 20.09.2006 14:39

запрос "flash BitmapData":
yandex.ru : 467 страниц;
google.com : ~214 000 страниц.
^_^

Fbor 21.09.2006 14:03

А вам не приходила мысль в голову, что волшебной кнопочки F1 может не быть под рукой, а точнее не быть самого Flash-а?
Доки я привык читать на работе в свободное время а флеша там нет и не будет. Поэтому и спросил. Развели тут демагогию :)

etc 21.09.2006 14:11

Цитата:

Сообщение от Fbor
А вам не приходила мысль в голову, что волшебной кнопочки F1

Волшебная кнопочка продублирована онлайн-хелпом, между прочим:
http://livedocs.macromedia.com/flash/8/main/index.html

Так что отсутствие самого флэша — дешевые отмазки.

Fbor 21.09.2006 16:37

да я понял :)
спасибо! :)

Fbor 21.09.2006 16:55

Я так понимаю BitmapData не позволяет реализовать "карандаш" т.к. рисовать на ней (окромя как попиксельно) можно только с помощью fillrect, а нечто типа fillcircle нет?

etc 21.09.2006 17:02

copyPixels

Fbor 21.09.2006 19:13

copyPixels(sourceBitmap:BitmapData, sourceRect:Rectangle, destPoint:Point, [alphaBitmap:BitmapData], [alphaPoint:Point], [mergeAlpha:Boolean]) : Void

Тут тоже sorceRect. Да и что собственно копировать?
Я так понимаю.. данный метод берет кучу пикселов заданную прямоугольником и копирует куда мне надо. А как с его помощью моделировать карандаш определенного радиуса?

Fbor 21.09.2006 19:15

Кстати, а как можно отловить событие перемещения мыши по битмапДате?
Там в мануале ни одного event-а не описано.... или события ловятся контейнером битмапдаты (клипом я так понимаю) ?

Stone 21.09.2006 19:41

ActionScript classes > BitmapData (flash.display.BitmapData) > hitTest (BitmapData.hitTest method)

etc 21.09.2006 20:28

Цитата:

Сообщение от Fbor
Там в мануале ни одного event-а не описано....

Вы его и не открывали.

Fbor 21.09.2006 21:37

Stone
Спасибо. Вроде оно.

__etc
Откуда такое желание заниматься графоманством?

Dendroid 21.09.2006 22:33

рисуем векторно на скрытом объекте: lineTo(), moveTo(), при этом можно задавать любые стили для линии, толщину, цвет, все изменения копируем на битмап, используя draw(), для реалистичности можно добавлять noise. И не забыть включить прозрачность! :)

Fbor 25.09.2006 12:50

Попробовал я дополнить пример тем, что мне надо. Вот что получилось.
Жирным выделена суть - момент рисования так сказать.
Попробуйте запустите.. видно что ни о каком рисовании речи не идет.. точки успевают рисоваться одна через 10.
Видать надо идти другим путем... каким?

Код:

import flash.display.BitmapData;
import flash.geom.Point;

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(1, 1, 0xFF0000);

var destPoint:Point = new Point(myBitmapData.rectangle.x, myBitmapData.rectangle.y);
var currPoint:Point = new Point();

mc_1.onEnterFrame = function() {
    currPoint.x = mc_2._x;
    currPoint.y = mc_2._y;
    if(myBitmapData.hitTest(destPoint, 255, currPoint)) {
                myBitmapData.setPixel(currPoint.x, currPoint.y, 0x00222222);
    }
}

mc_2.startDrag(true);

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;
}


Fbor 25.09.2006 12:52

Dendroid
А.. эээ.. а как с помощью lineTo можно к примеру овал нарисовать?
Можете дать ссылочку на пример. Просто насколько я понимаю.. таким образом я смогу рисовать только прямые линии... или нет?

AlexSol 25.09.2006 13:49

для переноса на битмап лучше использовать совет от Dendroid (пост 20)

пример рисования фигур вы можете найти у себя (flash8)
C:\Program Files\Macromedia\Flash 8\Samples and Tutorials\Samples\ActionScript\DrawingAPI

Fbor 25.09.2006 14:06

Кстати, вот примерно то, что мне надо
http://www.webmastera.org/painter.php/
только мне надо попроще :)

Пошел смотреть пример "у себя" :)

Fbor 25.09.2006 14:21

Глянул пример из C:\Program Files\Macromedia\Flash 8\Samples and Tutorials\Samples\ActionScript\DrawingAPI
Там же лишь фигуры... а кривые это немного иное... или они аналогично создаются?

Fbor 25.09.2006 14:23

По идее, наверное действительно... можно на маусдаун начинать по ентерфрейм рисовать линии от начальной до текущей точки... если они отличаются... в итоге если быстро мышкой не елозить то будет плавная линия, а если быстро, то и в видимых мною до этого редакторах она становится ломаной.
Это нормальный подход?

AlexSol 25.09.2006 14:44

вы спрашивали про овал, и ответ про него получили. кривые рисуются спомощью MovieClip.curveTo().

AlexSol 25.09.2006 14:52

я уже не помню, в чем была проблема но вот самый простой код наверно

Код:

var down:Boolean = false;
_root.onMouseDown = function() {
        down = true;
        _root.lineStyle(3, Number(Math.round(Math.random()*16777215)));
        _root.moveTo(_xmouse, _ymouse);
};
_root.onMouseMove = function() {
        if (down) {
                _root.lineTo(_xmouse, _ymouse);
        }
};
_root.onMouseUp = function() {
        down = false;
};

и и на onMouseUp делать draw() в битмапдата

Fbor 25.09.2006 15:18

Во блин! Оно. Вот это мне и надо :) По сути.. здесь так и есть... как я предположил.. на маусдаун начинаем циклично (правда здесь не на ентерфрейм, а на маусмув, что логичнее) рисовать прямые до текущей точки :)
Все намного проще, чем я думал :)
Спасибо всем :)

AlexSol 25.09.2006 15:28

забавно выходит если заменить
_root.lineStyle(3, Number(Math.round(Math.random()*16777215)));

на

_root.lineStyle(Math.random()*5, Number(Math.round(Math.random()*16777215)));
--------------
пиши на мыло если нужно еще что-то из параметров подогнать, я щас тоже рисовалкой занимаюсь.

KUZEN 25.09.2006 18:57

Ну рисовать програмно проще сначало в векторе а потом с помощью draw всё кидать в BitmapData ... вот тут немного о рисовании

Fbor 25.09.2006 19:57

to AlexSol:
Ага.. еще 5-чку заменить на 15 :)
Напишу, если что :) Спасибо :)
Правда.. основной вопрос у меня был именно в том, как рисовать... я даже не представлял как это делать. Оказалось все неимоверно просто :)
А как к остальному подойти вроде представляю.

to KUZEN
Так и предполагаю сделать. За ссылку спасибо, пойду почитаю.


Часовой пояс GMT +4, время: 15:09.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.