需求為:動態加載圖片 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
分享到:
相关推荐
监听页面加载完成监听页面加载完监听页面加载完成监听页面加载完成监听页面加载完成监听页面加载完成监听页面加载完成监听页面加载完成成
总结一下,JavaScript中监听图片加载的关键在于使用`Image`对象的`onload`和`onerror`事件。通过这些事件,我们可以在图片加载的正确或错误状态时执行相应的处理逻辑。这种技术在网页开发中非常常见,对于优化页面...
bindload是一个绑定在image组件上的事件监听器,当图片加载完成时,会触发此事件,并向监听函数传递加载完成的事件对象。事件对象中包含了图片的原始宽高信息等数据,这对于后续对图片进行尺寸调整和布局计算非常...
为了改善这种情况,开发者通常会采用动态加载效果来展示页面加载进度,让用户感知到网页正在积极加载,而不是停滞不前。本文将深入探讨如何在HTML未加载完成时实现动态加载效果,并通过实例代码进行说明。 首先,...
在Vue.js开发中,有时我们需要监听组件的加载完成状态,以便在所有组件加载完毕后执行特定的操作。在使用Vue CLI构建项目时,这个问题可以通过结合Vuex的状态管理库来解决。本文将详细介绍如何在Vue CLI项目中监听...
Angular本身并不直接提供一个内置的方法来监听DOM加载完成,但我们可以通过以下几种方式实现这一目标: 1. **生命周期钩子**: Angular提供了一组生命周期钩子,其中`ngAfterViewInit`是在组件视图及其所有子视图...
在Android中,实现马赛克效果通常通过像素操作或者使用图像滤镜库如GLSL(OpenGL Shading Language)来完成。像素操作包括对选定区域的像素进行模糊处理,可以是平均值模糊、高斯模糊等。而GLSL则允许开发者编写...
- 为了更好地控制加载过程并在文件加载完成后执行回调函数,通常会监听`script`标签的`onload`事件。 3. **组件内部结构解析** - **模板部分**:尽管此组件没有实际展示的HTML内容,但仍然保留了一个空的`...
`GlideImageView`的实现原理主要是通过对Glide的请求监听器(RequestListener)进行扩展,该接口提供了`onLoadStarted()`、`onResourceReady()`、`onLoadFailed()`等方法,分别对应图片加载开始、加载完成和加载失败...
1. **纯JavaScript实现**:通过监听图片的`load`事件,结合定时器或事件循环,每隔一定时间更换图片,并应用马赛克效果。可以使用`document.getElementById()`、`document.querySelector()`等方法获取图片元素,`src...
在`mosaicTest.fla`中,可能有一个事件监听器来触发马赛克效果的应用,例如点击按钮或加载完成后。测试场景可能还包括用于调整马赛克效果大小的用户界面元素,允许用户动态改变马赛克的粒度。 总的来说,通过...
总的来说,Spring动态加载配置文件的实现涉及到文件监听、配置文件解析、应用上下文刷新以及Web容器的协同。通过这样的机制,开发者可以在开发阶段快速响应配置的更改,提高开发效率,同时降低生产环境因重启服务...
leaflet工具类,绘制点、线、面、文本、高亮、地图监听、地图加载、事件机制
1. **等待所有iframe加载**:检查`WebBrowser.Document.Window.Frames.Count`,如果存在多个框架,我们需要监听每个框架的`DocumentCompleted`事件,确保所有框架内的页面都已完成加载。 2. **监听`ProgressChanged...
总的来说,"jQuery马赛克图片切换效果"是一种利用JavaScript和jQuery创建的互动图片展示技术,通过模拟马赛克效果和动态切换,为用户带来独特的视觉体验。通过调整JavaScript代码和CSS样式,开发者可以根据自己的...
在DOM加载完成后,我们可以通过监听这个事件来执行初始化页面等待效果的代码,如显示一个加载动画。 2. **window.onload事件**:与DOMContentLoaded不同,onload事件会在整个页面资源(包括图片、脚本等)都加载...
本项目通过结合动态加载(懒加载)、瀑布流布局以及LightBox技术,实现了一个出色的图片搜索效果。接下来,我们将深入探讨这些技术及其在实际应用中的具体实现。 1. **动态加载(懒加载)** 动态加载,也称为懒...
3. 添加事件监听器,以便在图片加载完成后执行相应操作,如将其添加到舞台上。 在本例中,描述提到了“读取XML文件动态设置最大页数”。XML是一种轻量级的数据交换格式,适合存储结构化数据。我们可以使用Flash的`...
在这个例子中,我们首先创建了一个 `Loader` 实例,然后添加了一个事件监听器,当图像加载完成时触发 `onImageLoaded` 函数。最后,通过 `load` 方法指定要加载的图像 URL。 在 `onImageLoaded` 回调函数中,我们...