![]() |
|
||||||||||
|
|||||
|
ПРИВЕТ... Есть вопрос , если сможете помогите плиз, есть такой эффект во флеше - растеризация картинки - по типу - http://www.templatemonster.com/flash...ates/8366.html
там появляется девочка так... сначала квадратики и из них картинка, если кто знает каким образом это можно осуществить с помощью ActionScript для любой картинки объясните плизз, спасибо большое. |
|
|||||
|
Регистрация: Oct 2004
Сообщений: 149
|
Как по мне, этот эффект прорисован покадорво, специально делали такую анимацию, переходя от квадратов в растровую картинку.
|
|
|||||
|
спасибо... это очевидно, но мне и нужен эффект который бы скриптом растрировал изображения... допустим как в FireFox-е когда картинка подгружается... если кто знает как - ответьте плиз... СПАСИБО!
|
|
|||||
|
Регистрация: May 2004
Адрес: Москва
Сообщений: 76
|
Думаю с помощью bitmapData - возможно реализовать данный эффект.
__________________
Улыбка - понятие растяжимое... |
|
|||||
|
ответ по существу...
только вот как? в этом весь вопрос... |
|
|||||
|
Регистрация: Sep 2006
Адрес: Zaporozhye, Ukraine
Сообщений: 141
|
Тормозить будет, это надо разбить на квадраты и подсчитать преобладающий цвет для каждого. Пусть не каждый пиксел, но все равно много надо перебрать, для правдоподобия. Потом отрисовать квадраты в битмапдату, увеличить количество квадратов и повторить процедуру, и это раза четыре как минимум. А потом подсунуть настоящую картинку. Решение в лоб. Может можно придумать что нибудь изящнее.
|
|
|||||
|
4AM Games
|
Я делал это вот так в ActionScript 3.0
class Pixilate.as package effects
{
import flash.events.EventDispatcher;
import flash.events.TimerEvent;
import flash.utils.Timer;
import flash.display.BitmapData;
import flash.filters.BlurFilter;
import flash.filters.BitmapFilterQuality;
import flash.geom.Point;
import flash.display.Bitmap;
import flash.geom.Rectangle;
public class Pixilate extends EventDispatcher
{
/**
* @private
*/
protected var _originalImage:BitmapData;
/**
* @private
*/
protected var _bluredImage:BitmapData;
/**
* @private
*/
protected var _currentStep:uint;
/**
* @private
*/
protected var _totalSteps:uint;
public function Pixilate(originalImage:BitmapData)
{
_originalImage = originalImage;
}
public function get originalImage():BitmapData
{
return _originalImage;
}
public function createPixelatedImage(pixelSize:uint):BitmapData
{
var result:BitmapData = new BitmapData(_originalImage.width, _originalImage.height);
var vPixelsAmmount:uint = Math.ceil(result.height/pixelSize);
var hPixelsAmmount:uint = Math.ceil(result.width/pixelSize);
var halfPixel:Number = Math.ceil(pixelSize/2);
for (var h:uint = 0; h < vPixelsAmmount ; h++)
{
for (var w:uint = 0; w < hPixelsAmmount ; w++)
{
trace("drawing");
var currentX:Number = w*pixelSize;
var currentY:Number = h*pixelSize;
var color:uint = _originalImage.getPixel32(currentX+halfPixel, currentY+halfPixel);
var rect:Rectangle = new Rectangle(currentX, currentY, pixelSize, pixelSize);
trace(color);
result.fillRect(rect, color);
}
}
return result;
}
/**
* @private
*/
protected function blurImage(blurCoof:uint):void
{
var blur:BlurFilter = new BlurFilter(blurCoof, blurCoof, BitmapFilterQuality.LOW);
_bluredImage = new BitmapData(_originalImage.width, _originalImage.height);
_bluredImage.draw(_originalImage);
_bluredImage.applyFilter(_bluredImage, _originalImage.rect, new Point(0, 0), blur);
}
}
}
package {
import flash.display.Sprite;
import flash.display.Loader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.display.Bitmap;
import flash.display.LoaderInfo;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import effects.Pixilate;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.events.MouseEvent;
public class PixilateExample extends Sprite
{
private var pixilate:Pixilate;
private var bitmap:Bitmap;
public function PixilateExample()
{
initStage();
var loader:Loader = new Loader();
loader.load(new URLRequest("3.jpg"));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded);
stage.addEventListener(MouseEvent.CLICK, startPixilate);
}
private function onImageLoaded(event:Event):void
{
var image:DisplayObject = (event.target as LoaderInfo).loader.content;
var bmpd:BitmapData = new BitmapData(image.width, image.height);
bmpd.draw(image);
pixilate = new Pixilate(bmpd);
bitmap = addChild(new Bitmap()) as Bitmap;
bitmap.bitmapData = bmpd;
}
private function startPixilate(event:MouseEvent):void
{
if(pixilate != null)
{
var timer:Timer = new Timer(20, 10);
timer.addEventListener(TimerEvent.TIMER, onTimerTick);
timer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
timer.start();
}
}
private function onTimerTick(event:TimerEvent):void
{
trace("tick");
bitmap.bitmapData = pixilate.createPixelatedImage((event.target as Timer).currentCount*3);
}
private function onTimerComplete(event:TimerEvent):void
{
}
private function initStage():void
{
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
}
}
}
__________________
Я перестал переписывать, начал редактировать, еще лет 15 и я стану писателем ^_^ |
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
|
Набросок
import flash.display.BitmapData;
import flash.geom.*;
//// сама функция
function mosaic (mcDraw:MovieClip, mcIn:MovieClip, mcOut:MovieClip, cellSize:Number) {
cellSize = Math.floor (cellSize);
if (cellSize > 0) {
bmp.fillRect (bmp.rectangle, 0x00000000);
mcOut._xscale = mcOut._yscale = 100;
mcIn._xscale = mcIn._yscale = 100 / cellSize;
bmp.draw (mcDraw);
mcOut._xscale = mcOut._yscale = 100 * cellSize;
mcIn._xscale = mcIn._yscale = 100;
}
}
//// объекты
var bmp:BitmapData = new BitmapData (200, 200, true, 0x0);
var mc:MovieClip = this.createEmptyMovieClip ("mc", this.getNextHighestDepth ());
var mcImage:MovieClip = this.createEmptyMovieClip ("mcI", this.getNextHighestDepth ());
var mcGradient:MovieClip = mcImage.createEmptyMovieClip ("mc", 0);
//// вспомогательная ерунда
mc.attachBitmap (bmp, 0);
mcI._x = mcI._y = 100;
mc._x = 400;
mc._y = 100;
with (mcGradient) {
colors = [0x000000, 0xFF0000];
fillType = "linear";
alphas = [100, 100];
ratios = [0, 0xFF];
matrix = new Matrix ();
matrix.createGradientBox (200, 200, Math.PI / 4, 0, 0);
beginGradientFill (fillType, colors, alphas, ratios, matrix);
moveTo (0, 0);
lineTo (0, 200);
lineTo (200, 200);
lineTo (200, 0);
lineTo (0, 0);
endFill ();
}
//// вызываем функцию
var cx:Number = 1;
setInterval(function () {
mosaic (mcImage, mcGradient, mc, cx++);
}, 500);
mosaic (mcImage, mcGradient, mc, cx++);
|
|
|||||
|
Пользовался этим неоднократно, как помне удобно.
__________________
Счастье - это хорошее здоровье и плохая память |
![]() |
![]() |
Часовой пояс GMT +4, время: 21:22. |
|
|
« Предыдущая тема | Следующая тема » |
|
|