`

监听Image 动态加载的完成,加入馬賽克效果

    博客分类:
  • Flex
阅读更多

需求為:動態加載圖片 Image后,使用 馬賽克 特效。

問題:new Image 后,馬上取不到圖片數據,沒辦法做馬賽克處理,需要等待圖片加載完成.

 

發現直接使用如下代碼的話,讀取不到圖片數據.

private function init():void
{
	var image:Image = new Image();
	image.source = "image/water.jpg";
	addChild(image);
	trace(image.width + ":" + image.height);
}

 結果顯示 0:0

 

發現需要等待圖片加載完成后,才可以取得到數據,於是修改為

private function init():void
{
	var image:Image = new Image();
	image.source = "image/water.jpg";
	image.addEventListener(Event.COMPLETE, complete);
	addChild(image);
	trace(image.width + ":" + image.height);
}
	
private function complete(event:Event):void {
	var image:Image = event.target as Image;
	trace(image.width + ":" + image.height);
}

 結果仍然顯示 0:0

 

搞不明白那個Event.COMPLETE,到底幹嘛去了。

 

於是花費我大量時間,經過一番徹底研究(google了半小時),終於發現,不能監聽Event.COMPLETE,正確的做法應該是監聽 Event.RESIZE

代碼修改如下:

private function init():void
{
	var image:Image = new Image();
	image.source = "image/water.jpg";
	image.addEventListener(Event.RESIZE, complete);
	addChild(image);
}
	
private function complete(event:Event):void {
	var image:Image = event.target as Image;
	trace(image.width + ":" + image.height);
}

 結果顯示 502:750

 

讀取到大小了。圖片應該是加載完了。

 

接下來需要做的是,將圖片加上馬賽克效果:

private function init():void
{
	var image:Image = new Image();
	image.source = "image/water.jpg";
	image.addEventListener(Event.RESIZE, complete);
	addChild(image);
}
	
						
private function complete(event:Event):void {
	var image:Image = event.target as Image;
	trace(image.width + ":" + image.height);
	var bmpData:BitmapData = DisplayObjectFilter.mosaicFilter2( image, 0.2 );
	var bmp:Bitmap = new Bitmap( bmpData );
	var image2:Image = new Image();
	image2.source = bmp;
	removeChild(image);
	addChild(image2);
}

 運行結果 502:750, 圖片的大小是可以讀到了,但是加入馬賽克效果的圖片沒有顯示,或顯示為空。

 

猜測可能是圖片的 內容數據 還沒載入。於是試著測試監聽別的事件看看,后來發現使用Event.RENDER,可以使圖片顯示,但是圖片大小值,仍然為 0:0,而且在加入馬賽克效果時,有異常,查看后發現異常是 圖片大小為 0:0 引起的。

 

private function init():void
{
	var image:Image = new Image();
	image.source = "image/water.jpg";
	image.addEventListener(Event.RENDER, render);
	addChild(image);
}
	
			
private function render(event:Event):void {
	var image:Image = event.target as Image;
	trace("render:" + image.width + ":" + image.height);
	var bmpData:BitmapData = DisplayObjectFilter.mosaicFilter2( image, 0.2 );
	var bmp:Bitmap = new Bitmap( bmpData );
	var image2:Image = new Image();
	image2.source = bmp;
	removeChild(image);
	addChild(image2);
}

 

運行結果:

render:0:0
ArgumentError: Error #2015: 无效的 BitmapData。
 at flash.display::BitmapData()
 at cn.riahome.filters::DisplayObjectFilter$/mosaicFilter2()[E:\pengranxiang\flex_workspace\Demo\src\cn\riahome\filters\DisplayObjectFilter.as:212]
 at Demo/render()[E:\pengranxiang\flex_workspace\Demo\src\Demo.mxml:47]

 

停掉程序后,發現頁面上有加上馬賽克效果的圖片出現。不停掉程序的話,頁面一直會卡住,看不到圖片。

檢查后發現異常由於 圖片的大小 0:0 引起。所以修改如下:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application 
	xmlns:mx="http://www.adobe.com/2006/mxml" 
	layout="absolute"
    	minWidth="350"
   	minHeight="136"
    	backgroundColor="#ffffff"
    	creationComplete="init();"
	>
	
<mx:Script>

<![CDATA[

	import cn.riahome.filters.DisplayObjectFilter;
	import mx.controls.Image;

	private function init():void
	{
		var image:Image = new Image();
		image.source = "image/water.jpg";
		image.addEventListener(Event.RESIZE, complete);
		addChild(image);
	}
	
			
	private function complete(event:Event):void {
		var image:Image = event.target as Image;
		trace(image.width + ":" + image.height);
		image.addEventListener(Event.RENDER, render);
	}
			
	private function render(event:Event):void {
		var image:Image = event.target as Image;
		trace("render:" + image.width + ":" + image.height);
		var bmpData:BitmapData = DisplayObjectFilter.mosaicFilter2( image, 0.2 );
		var bmp:Bitmap = new Bitmap( bmpData );
		var image2:Image = new Image();
		image2.source = bmp;
		removeChild(image);
		addChild(image2);
	}

]]>

</mx:Script>
</mx:Application>

 改為以上代碼后,程序運行正常,馬賽克效果圖片顯示正常。

 

順便發一下馬賽克處理用的圖片處理的包, 很好用, 有用法實例和源代碼。

這裡是源碼包

這裡是用法教程 

  • 大小: 445.9 KB
2
0
分享到:
评论

相关推荐

    jquery马赛克图片切换效果

    总的来说,"jQuery马赛克图片切换效果"是一种利用JavaScript和jQuery创建的互动图片展示技术,通过模拟马赛克效果和动态切换,为用户带来独特的视觉体验。通过调整JavaScript代码和CSS样式,开发者可以根据自己的...

    马赛克颗粒感天空Canvas特效.rar

    可以使用`new Image()`创建一个图像对象,然后设置其`src`属性并监听`onload`事件,确保图像加载完成后才进行Canvas绘图。 总的来说,"马赛克颗粒感天空Canvas特效"是一个结合了图像处理、像素操作、随机数生成和...

    图片js代码

    使用`new Image()`创建图片对象,设置`src`属性为图片URL,预加载完成后可以触发回调函数。 5. **图片裁剪与缩放**:JavaScript配合`canvas`元素可以实现图片的裁剪和缩放,常用于上传头像或制作缩略图。`toDataURL...

    canvas实现图片马赛克的示例代码

    首先,要实现马赛克效果,我们需要获取到`canvas`的2D绘图上下文,这是通过调用`getContext('2d')`方法完成的。一旦获取到`CanvasRenderingContext2D`对象,我们就可以开始在画布上进行绘图操作。 1. `drawImage()`...

    重新整理过的10个用JavaScript实现的图片特效

    JavaScript可以监听鼠标事件,同时结合CSS变换来完成这一过程。 3. **图片滑动门(Sliding Panels)**:图片以门滑开的方式展示,可以用于创建有趣的导航菜单。这需要JavaScript处理点击事件,改变图片容器的宽度或...

    jQuery全屏图片放大缩小切换特效

    3. **马赛克透明背景**:在图片下方可能有一个马赛克效果的透明背景,这通常是通过CSS的`background-image`属性和`opacity`属性实现,使得背景具有一定的视觉吸引力,同时不会分散用户对主图的注意力。 4. **图片...

    jQuery全屏图片放大缩小代码

    在这个示例中,我们使用了`$(document).ready()`来确保在DOM加载完成后执行代码。`#fullScreenImg`是我们要操作的图片元素,通过CSS设置其位置和大小。`on('wheel'...`部分监听鼠标的滚动事件,`on('mousedown'...`...

Global site tag (gtag.js) - Google Analytics