#actionscript #graphics
#actionscript #графика
Вопрос:
Я создаю приложение Flash CS5, в котором пользователь рисует прозрачные наложения на спрайт, размещенный поверх изображения. Пользователь должен иметь возможность удалять свои входные данные, как в MS Paint, Adobe Photoshop или GIMP. Поскольку спрайт находится поверх изображения, я не могу придумать безопасного чистого цвета для рисования над участком, который пользователь только что потер ластиком.
Как я могу выполнить или смоделировать частичную очистку графического объекта?
Ответ №1:
Действительно ли это должен быть спрайт, как в векторной графике? Может ли наложение быть растровым объектом? И вы хотите изменить цвет на уровне пикселей, как это делает кисть или ластик в MS Paint?
Если вам действительно не нужна векторная графика, я предлагаю вам вместо этого использовать растровый объект. Выполните следующие действия:
наложение спрайтов на самом деле является наложением растрового изображения, обязательно сделайте его прозрачным
var bmp : Bitmap = new Bitmap( new BitmapData(imgWidth, imgHeight, true, 0));
при создании векторной графики во временном спрайте или событии улучшается форма, потому что вам не нужно сдерживание.
var tmpVectorGraphics : Shape = new Shape();
// draw whatever you want using the graphics library functions
drawStuffInShape(tmpVectorGraphics);
теперь нарисуйте содержимое векторной графики на bitmapdata объекта Bitmap — преобразуя векторную графику в растровую графику
bmp.bitmapData.draw(tmpVectorGraphics);
// if what you've drawn in the shape containing the vector graphics is overlayed
// the same way as the bmp object, you don't need to specify a matrix object
после этого вы можете очистить tmpvectorg графика
tmpVectorGraphics.graphics.clear();
чтобы очистить пиксели, как это делает ластик в Paint, вы можете создать прозрачную фигуру и скопировать ее в определенные позиции на растровом изображении.
// create the eraser bitmap data
var eraser : BitmapData = new BitmapData(5, 5, true, 0);
// this is the location of where you want the eraser to be applied
var pos : Point = new Point (locationX, locationY);
// apply the eraser to the main bmp overlay to a specific location
bmp.bitmapData.copyPixels(eraseer, eraser.rect, pos);
Поэтому в любое время, когда вы хотите добавить какую-либо графику, вы создаете их в форме Tmpvectorg, а затем рисуете ее на растровом объекте.
Это также быстрее с точки зрения производительности, потому что чем больше графических команд вы выполнили для создания фигуры, тем дороже обходится рендеринг каждого кадра. Растровое изображение кэшируется в памяти, и не имеет значения, насколько сложной является графика в нем.
С BitmapData в actionscript можно многое сделать, и это очень дешево с точки зрения скорости обработки, поэтому я предлагаю вам поискать несколько руководств по BitmapData, потому что вы можете создать потрясающее приложение paint, если знаете, как освоить этот класс 🙂
Приветствую, Михня
Комментарии:
1. Я использую прозрачные кисти, поэтому мне нужно стереть все, что находится за кистью, прежде чем рисовать кистью, иначе кисть наложится сама на себя. Каждый метод, который я пробовал для выполнения этого удаления, оставляет артефакты вокруг кисти, стирая либо слишком много, либо слишком мало. Как я могу заставить его стереть точно за созданной мной фигурой? Моя текущая попытка создает BlendMode. АЛЬФА-растровое изображение, которое создает вырез вокруг моей кисти, но даже это не работает.