加载透明图片

可以被FLASH动态加载的背景透明图片大致就GIF,PNG两种

先说说GIF图片,用普通的加载方法加载GIF图片完后只能看到动态图片的第一帧,由动态图变成静态的了

所幸有达人完美解决了这个问题,并封装好类供我们使用,这就是GIFPlayer。下载地址网上搜一下很多,要找不到也可以找我要

GIFPlayer使用示例

package{
 /*
  QQ: 334973991
  */
 import flash.net.URLRequest;
 import flash.display.Sprite;
 import org.gif.events.GIFPlayerEvent;
 import org.gif.player.GIFPlayer;
 public class GIFPlayerTest extends Sprite {
  private var player:GIFPlayer;
  private var request:URLRequest;
  public function GIFPlayerTest() {
   request=new URLRequest("girl.gif");
   player = new GIFPlayer();
   startLoadImg();
   this.addChild(player);
   player.addEventListener(GIFPlayerEvent.COMPLETE,imageLoadComplete);
  }
  public function startLoadImg():void {
   player.load(request);
  }
  public function imageLoadComplete(e:GIFPlayerEvent):void {
   trace("图片加载成功");
   trace(e);
  }
 }
}

AS3传统的方法加载透明图片,看着是透明的,但鼠标事件还是会响应的。有两种解决方案

第一种:在需要的鼠标事件触发时 判断鼠标所点位置的像素是否透明,透明的话则不响应该事件

为了程序的扩展性,可以添加一些自定义事件代替原有鼠标事件

程序如下:

package king.loadAphaImage{
 /*
  QQ: 334973991
  */
 import flash.display.*;
 import flash.events.*;
 
 public class Main extends Sprite{
  private var loadImage:LoadImage;
  private var sprite:Sprite;
  public function Main(){
   loadImage=new LoadImage(completeHandler);
   loadImage.Loading("king/loadAphaImage/langfangshi.png");
  }
  private function completeHandler(events:Event):void {
   sprite=new Sprite();
   var bitmap:Bitmap=events.target.content;
   sprite.addChild(bitmap);
   DealImage.dealImage(sprite);
   sprite.addEventListener(MouseEvent.CLICK,clickHandle);
   sprite.addEventListener("IMAGE_MOUSE_CLICK",imageClickHandle);
   this.addChild(sprite);
  }
  private function clickHandle(e:MouseEvent):void{
   trace("点击到我啦CLICK事件");
  }
  private function imageClickHandle(e:MouseEvent):void{
   trace("点击到我啦IMAGE_CLICK事件");
  }
 }
}

------------------------------------------------------------------------------------

package king.loadAphaImage{
 /*
  QQ: 334973991
  */
 import flash.display.*;
 import flash.events.*;
 import flash.net.*;
 
 public class LoadImage{
  private var fun:Function;
  public function LoadImage(completeFun:Function){
   fun=completeFun;
  }
  public function Loading(url:String ){
   try {
    var loader:Loader=new Loader();
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandler);
    loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,cancel);
    loader.load(new URLRequest(url));
   } catch (error:Error) {
    trace(error);
   }
  }
  private function cancel(events:IOErrorEvent):void {
   trace(events);
  }
  private function completeHandler(events:Event):void {
   fun(events);
  }
 }
}

--------------------------------------------------------------------------------------------

package king.loadAphaImage{
 /*
  QQ: 334973991
  */
 import flash.display.*;
 import flash.events.*;
 
 public class DealImage{
  public static function dealImage(sprite:Sprite){
   sprite.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandle);
   sprite.addEventListener(MouseEvent.MOUSE_MOVE,mouseMoveHandle);
   sprite.addEventListener(MouseEvent.MOUSE_OUT,mouseOutHandle);
   sprite.addEventListener(MouseEvent.MOUSE_OVER,mouseOverHandle);
   sprite.addEventListener(MouseEvent.MOUSE_UP,mouseUpHandle);
   sprite.addEventListener(MouseEvent.CLICK,mouseClickHandle);
  }
  private static function mouseDownHandle(events:MouseEvent):void {
   var sprite:Sprite=events.currentTarget as Sprite;
   if(checkIsApha(events))sprite.dispatchEvent(new MouseEvent("IMAGE_MOUSE_DOWN"));
  }
  private static function mouseMoveHandle(events:MouseEvent):void {
   var sprite:Sprite=events.currentTarget as Sprite;
   if(checkIsApha(events))sprite.dispatchEvent(new MouseEvent("IMAGE_MOUSE_MOVE"));
  }
  private static function mouseOutHandle(events:MouseEvent):void {
   var sprite:Sprite=events.currentTarget as Sprite;
   if(checkIsApha(events))sprite.dispatchEvent(new MouseEvent("IMAGE_MOUSE_OUT"));
  }
  private static function mouseOverHandle(events:MouseEvent):void {
   var sprite:Sprite=events.currentTarget as Sprite;
   if(checkIsApha(events))sprite.dispatchEvent(new MouseEvent("IMAGE_MOUSE_OVER"));
  }
  private static function mouseUpHandle(events:MouseEvent):void {
   var sprite:Sprite=events.currentTarget as Sprite;
   if(checkIsApha(events))sprite.dispatchEvent(new MouseEvent("IMAGE_MOUSE_UP"));
  }
  private static function mouseClickHandle(events:MouseEvent):void {
   var sprite:Sprite=events.currentTarget as Sprite;
   if(checkIsApha(events))sprite.dispatchEvent(new MouseEvent("IMAGE_MOUSE_CLICK"));
  }
  private static function checkIsApha(events:MouseEvent):Boolean{
   var sprite:Sprite=events.currentTarget as Sprite;
   if((sprite.getChildAt(0) as Bitmap).bitmapData.getPixel32(events.localX,events.localY)){
    return true;
   }
   return false;
  }
 }
}

第二种方法是把这种图片里的像素重新处理,只有不透明的像素才留下来

原图san.png

因为图片上传网站的原因把图片透明背景处理成淡蓝色的了

private function copyImagExtendTransparent(bit:BitmapData):Sprite{
   var _width:uint=bit.width;
   var _height:uint=bit.height;
   var ht:Sprite=new Sprite();
            for(var x:uint=0;x<_width;x++){
                for(var y:uint=0;y<_height;y++){
                    if(bit.getPixel32(x,y)){
                     var aphaValue:uint=bit.getPixel32(x,y) >> 24 & 0xFF;
                     ht.graphics.beginFill(bit.getPixel(x,y),aphaValue/255);
      ht.graphics.drawRect(x,y,1,1); 
      ht.graphics.endFill();
     }
                }
            }
   return ht;
  }

处理完的图片效果和原图一样 不过在透明位置不会效应鼠标事件,图片的宽高也不包括透明位置

------------------------------------------------------------------

private function getImageBorder(bit:BitmapData):Sprite{
   var _width:uint=bit.width;
   var _height:uint=bit.height;
   var ht:Sprite=new Sprite();
   ht.graphics.beginFill(0);
   for(var x:uint=0;x<_width;x++){
                for(var y:uint=0;y<_height;y++){
                    if(bit.getPixel32(x,y)){
      if(!bit.getPixel32(x-1,y)||!bit.getPixel32(x,y-1)||!bit.getPixel32(x+1,y)||!bit.getPixel32(x,y+1)){
       ht.graphics.drawRect(x,y,1,1); 
      }
     }
                }
            }
    ht.graphics.endFill();
   return ht;
  }

获取图片的边框

--------------------------------------------------------------------------------------------

private function copyNoAphaImag(bit:BitmapData):Sprite{
   var minx:uint=100000;
   var miny:uint=100000;
   var pointXArray:Array=new Array();
   var pointYArray:Array=new Array();
   var _width:uint=bit.width;
   var _height:uint=bit.height;
            for(var x:uint=0;x<_width;x++){
                for(var y:uint=0;y<_height;y++){
                    if(bit.getPixel32(x,y)){
      minx=minx>x?x:minx;
      miny=miny>y?y:miny;
      pointXArray.push(x);
      pointYArray.push(y);
     }
                } 
            }
   var ht:Sprite=new Sprite();
   ht.graphics.beginFill(0);
   var _length:uint=pointXArray.length;
   for(var i:uint=0;i<_length;i++){
    ht.graphics.drawRect(pointXArray[i]-minx,pointYArray[i]-miny,1,1); 
   }
   ht.graphics.endFill();

ht.x=minx;
   ht.y=miny;;
   return ht;
  }

这个方法得到图片和第一个方法外表看没有差别,但第一个图片的X,Y值是0,0.而这个X,Y值则是剔除透明区域后,图片仍在原位置时所需的X,Y值 ,更符合现实逻辑。感兴趣的同学可以分别输出他俩的宽高和X,Y值,比较一下

1. package 2. { 
3.     import flash.display.BitmapData; 4.     import flash.display.DisplayObject; 5.     import flash.display.Sprite; 6.     import flash.events.Event; 7.     import flash.geom.Matrix; 
8.     import flash.utils.setTimeout; 9.        
10.    import mx.controls.Image; 11.    /** 
12.     * 自定义Image类,使之忽略PNG透明区域  13.     * @author L4cd.Net 14.     */   
15.    public class MyImage extends Image 16.    { 
17.        private varht:Sprite = new Sprite(); 18.        public function MyImage() 19.        { 
20.            addChild(ht); 21.            hitArea = ht; 
22.            //指定hitArea为ht对象 23.            ht.visible = false; 
24.            ht.mouseEnabled = false; 25.            mouseChildren = false; 
26.            addEventListener(Event.COMPLETE,complete,false,
99,true); 
27.            setTimeout(update,50) 28.        } 
29.        private function complete(e:Event):void 30.        { 
31.            setTimeout(update,50) 32.        } 
33.        private function update():void 34.        { 
35.            if(!content)return; 
36.            varloader:DisplayObject = content.parent as 
DisplayObject; 
37.            varbit:BitmapData = new 
BitmapData(loader.width,loader.height,true,0x00000000); 38.            varmat:Matrix = new Matrix(); 
39.            mat.scale(loader.scaleX,loader.scaleY); 40.            bit.draw(loader,mat); 41.            //重绘图象到bit

42.            ht.graphics.clear(); 
43.            ht.graphics.beginFill(0); 
44.            for(var x:uint=0;x<bit.width;x++) 45.            { 
46.                for(var y:uint=0;y<bit.height;y++) 47.                { 
48.                    if(bit.getPixel32(x,y))ht.graphics.draw
Rect(x,y,1,1); 49.                } 50.            } 
51.            //以graphics画出bit的无透明区域 52.            ht.graphics.endFill(); 53.        } 54.    } 55.}

复制去Google翻译翻译结果

时间: 2024-10-08 08:53:37

加载透明图片的相关文章

MFC加载PNG图片并实现双缓冲

因为PNG包含Alpha通道,所以不同于BITMAP,在MFC中使用CImage类对其进行处理,通常使用load和draw成员函数. 所以标题的论述可以进一步解释为,使用CImage实现双缓冲. 通常的双缓冲方法为(首先将消息函数afx_msg BOOL OnEraseBkgnd(CDC* pDC)的函数体改为return TRUE): CDC memDC; CBitmap bmp; bmp.CreateCompatibleBitmap(pDC,WINDOW_WIDTH,WINDOW_HEIGH

vc++加载透明png图片方法——GDI+和CImage两种

vc++加载透明png图片方法——GDI+和CImage两种 在加载png时遇到了麻烦,后来用了两个方法解决了.一个是用GDI+,另外就是用vs.net MFC自带的CImage. 先看看GDI+的方法 方法1: 1.GDI+画透明图层(alpha)的png图片 stdafx加入如下: #include <comdef.h>//初始化一下com口 #include "GdiPlus.h" using namespace Gdiplus; #pragma comment(li

有效解决Android加载大图片时内存溢出的问题

首先解析一下基本的知识: 位图模式,bitmap颜色位数是1位 灰度模式,bitmap颜色位数是8位,和256色一样 RGB模式,bitmap颜色位数是24位 在RGB模式下,一个像素对应的是红.绿.蓝三个字节 CMYK模式,bitmap颜色位数是32位  在CMYK模式下,一个像素对应的是青.品.黄.黑四个字节 图像文件的字节数(Byte) = 图像分辨率*颜色深度/8(bit/8) 例如:一幅640*480图像分辨率.RGB色一般为24位真彩色,图像未经压缩的数据容量为:640X480X24

Qt 使用QMovie加载gif图片实现动态等待窗口

有时候要进行某项后台处理,但后台处理时间很长,需要提示用户等待,不妨做一个动态等待窗口.具体实现过程如下: 1 自定义窗口类DlgWait (1) 在资源中添加动态的gif图片,记住它的大小. 我添加的是一个“loading.gif”图片,大小是100x100,如下: (2)添加一个窗口界面类DlgWait 窗口大小比gif稍大即可,如150x150 在界面上添加2个QLabel: 第一个用来显示gif,名为lbl_gif,text为空,大小为100x100 第二个在下,用来显示提示信息,名为l

win32用GDI+加载png图片作为背景图

#include <windows.h> #include <gdiplus.h> /* GDI+ startup token */ ULONG_PTR gdiplusStartupToken; /* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); // UpdateLayeredWindow Defination typedef BOOL(*UP

图片预加载与图片懒加载的区别与实现

预加载与懒加载,我们经常经常用到,这些技术不仅仅限于图片加载,我们今天讨论的是图片加载: 一.什么是图片预加载与懒加载: 图片预加载:顾名思义,图片预加载就是在网页全部加载之前,提前加载图片.当用户需要查看时可直接从本地缓存中渲染,以提供给用户更好的体验,减少等待的时间.否则,如果一个页面的内容过于庞大,没有使用预加载技术的页面就会长时间的展现为一片空白,这样浏览者可能以为图片预览慢而没兴趣浏览,把网页关掉,这时,就需要图片预加载.当然这种做法实际上牺牲了服务器的性能换取了更好的用户体验. 图

[android] 加载大图片到内存

默认情况下,android程序分配的堆内存大小是16,虚拟机上面的VM Heep就是设置它的 一个图片所占的内存,比如1920*2560像素的图片需要,1920*2560*3至少这些的内存byte 找到ImageView控件对象 调用BitmapFactory对象的decodeFile(pathName)方法,来获取一个位图对象,参数:pathName是String类型的图片路径 把图片导入到手机的sdcard目录下面 调用ImageView对象的setImageBitmap(bitemap)方

iOS面试题之加载单张图片到底会不会崩溃?

今天,一哥们去某公司面试iOS职位.其中一道题目问,加载一张图片,到底会不会崩溃呢? 我拿到这个问题,当时以为是获取网络图片,那还是可能崩溃的,但实际问题,还有半句,图片是本地的... 这问题,加载本地的怎么会崩溃呢?写这么久加载图片也没遇到如此问题. =================================================== 原来,iPhone毕竟是手持设备,它所占有的内存是有限的,当图片过大的时候会引起内存导致的崩溃现象. 后来,我又查了下,发现,原来还有这么大学

图片--Android有效解决加载大图片时内存溢出的问题

Android有效解决加载大图片时内存溢出的问题 博客分类: Android Android游戏虚拟机算法JNI 尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存. 因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView