精确选择识别png图片有像素的区域
/**
*
* *---------------------------------------*
* | ***精确选择识别png图片有像素的区域*** |
* *---------------------------------------*
**
* 编辑修改收录:fengzi(疯子、wu341、wgq341)
*
* 不会写代码,我是代码搬运工。
*
* 联系方式:QQ(493712833)。
*
* 随 笔: https://www.cnblogs.com/fengziwu/
*
* 版权协议:请自觉遵守LGPL协议,欢迎修改、复制、转载、传播给更多需要的人。
* 免责声明:任何因使用此软件导致的纠纷与软件/程序开发者无关。
* 日 期: 2019.05.08
*
*/ package fengzi.bmd
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.geom.Rectangle; public class InteractivePNG extends MovieClip
{ // -== Public Properties ==-
public function get interactivePngActive():Boolean
{
return _interactivePngActive;
} public function get alphaTolerance():uint
{
return _threshold;
}
public function set alphaTolerance(value : uint):void
{
_threshold = Math.min(255,value);
} // Excluded from documentation for simplicity, a note is provided under disableInteractivePNG. override public function set hitArea(value : Sprite):void
{
if (value!=null && super.hitArea==null)
{
disableInteractivePNG();
}
else if (value==null && super.hitArea!=null)
{
enableInteractivePNG();
}
super.hitArea = value;
} // Excluded from documentation for simplicity, a note is provided under disableInteractivePNG. override public function set mouseEnabled(enabled : Boolean):void
{
// indicates that mouse has entered clip bounds.
if (isNaN(_buttonModeCache)==false)
{
disableInteractivePNG();
}
super.mouseEnabled = enabled;
} // -== Private Properties ==- protected var _threshold:uint = 128; protected var _transparentMode:Boolean = false; protected var _interactivePngActive:Boolean = false; protected var _bitmapHit:Boolean = false; protected var _basePoint:Point; protected var _mousePoint:Point; protected var _bitmapForHitDetection:Bitmap; protected var _buttonModeCache:Number = NaN; // -== Public Methods ==- public function InteractivePNG():void
{
super();
_basePoint = new Point();
_mousePoint = new Point();
enableInteractivePNG();
} public function drawBitmapHitArea(event:Event=null):void
{
var isRedraw:Boolean = (_bitmapForHitDetection != null);
if (isRedraw)
{
try
{
removeChild(_bitmapForHitDetection);
}
catch (e:Error)
{
}
}
var bounds:Rectangle = getBounds(this);
var left:Number = bounds.left;
var top:Number = bounds.top;
var b:BitmapData = new BitmapData(bounds.width,bounds.height,true,0);
_bitmapForHitDetection = new Bitmap(b); // (So that it is not a mystery if the displaylist is being inspected!)
_bitmapForHitDetection.name = "interactivePngHitMap";
_bitmapForHitDetection.visible = false;
var mx:Matrix = new Matrix();
mx.translate(-left, -top);
b.draw(this, mx);
addChildAt(_bitmapForHitDetection, 0);
_bitmapForHitDetection.x = left;
_bitmapForHitDetection.y = top;
} public function disableInteractivePNG():void
{
deactivateMouseTrap();
removeEventListener(Event.ENTER_FRAME, trackMouseWhileInBounds);
try
{
removeChild(_bitmapForHitDetection);
}
catch (e:Error)
{
}
_bitmapForHitDetection == null;
super.mouseEnabled = true;
_transparentMode = false;
setButtonModeCache(true);
_bitmapHit = false;
_interactivePngActive = false;
} public function enableInteractivePNG():void
{
disableInteractivePNG();
if (hitArea!=null)
{
return;
}
activateMouseTrap();
_interactivePngActive = true;
} // -== Private Methods ==- protected function activateMouseTrap():void
{ //useCapture=true, priority=high, weakRef=true
addEventListener(MouseEvent.ROLL_OVER, captureMouseEvent, false, 10000, true);
addEventListener(MouseEvent.MOUSE_OVER, captureMouseEvent, false, 10000, true);
addEventListener(MouseEvent.ROLL_OUT, captureMouseEvent, false, 10000, true);
addEventListener(MouseEvent.MOUSE_OUT, captureMouseEvent, false, 10000, true);
addEventListener(MouseEvent.MOUSE_MOVE, captureMouseEvent, false, 10000, true);
} protected function deactivateMouseTrap():void
{
removeEventListener(MouseEvent.ROLL_OVER, captureMouseEvent);
removeEventListener(MouseEvent.MOUSE_OVER, captureMouseEvent);
removeEventListener(MouseEvent.ROLL_OUT, captureMouseEvent);
removeEventListener(MouseEvent.MOUSE_OUT, captureMouseEvent);
removeEventListener(MouseEvent.MOUSE_MOVE, captureMouseEvent);
} protected function captureMouseEvent(event : Event):void
{
if (! _transparentMode)
{
if (event.type == MouseEvent.MOUSE_OVER || event.type == MouseEvent.ROLL_OVER)
{
// The buttonMode state is cached then disabled to avoid a cursor flicker
//buttonMode状态被缓存,然后被禁用以避免光标闪烁。
// at the movieclip bounds. Reenabled when bitmap is hit.
//在移动边界。点击位图时重新启用。
setButtonModeCache();
_transparentMode = true;
super.mouseEnabled = false;
// activates bitmap hit & exit tracking
//激活位图命中和退出跟踪
addEventListener(Event.ENTER_FRAME, trackMouseWhileInBounds, false, 10000, true);
// important: Immediate response, and sets _bitmapHit to correct state for event suppression.
//重要提示:立即响应,并将“位图命中”设置为事件抑制的正确状态。
trackMouseWhileInBounds();
}
} if (! _bitmapHit)
{
event.stopImmediatePropagation();
}
} protected function trackMouseWhileInBounds(event:Event=null):void
{
if (bitmapHitTest() != _bitmapHit)
{
_bitmapHit = ! _bitmapHit; // Mouse is now on a nonclear pixel based on alphaTolerance. Reenable mouse events.
//鼠标现在位于基于alphatolerance的非清晰像素上。重新启用鼠标事件。
if (_bitmapHit)
{
deactivateMouseTrap();
setButtonModeCache(true, true);
_transparentMode = false;
// This will trigger rollOver & mouseOver events
//这将触发滚动和鼠标悬停事件
super.mouseEnabled = true;
}
else if (!_bitmapHit)
{
// Mouse is now on a clear pixel based on alphaTolerance. Disable mouse events but .
//鼠标现在位于基于alphatolerance的清晰像素上。禁用鼠标事件。
_transparentMode = true; // This will trigger rollOut & mouseOut events
//这将触发卷展栏和鼠标输出事件
super.mouseEnabled = false;
}
} // When mouse exits this MovieClip's bounds, end tracking & restore all.
//当鼠标退出movieclip的边界时,结束跟踪并全部恢复。
var localMouse:Point = _bitmapForHitDetection.localToGlobal(_mousePoint);
if (hitTestPoint( localMouse.x, localMouse.y)==false)
{
removeEventListener(Event.ENTER_FRAME, trackMouseWhileInBounds);
_transparentMode = false;
setButtonModeCache(true);
super.mouseEnabled = true;
activateMouseTrap();
}
} protected function bitmapHitTest():Boolean
{
if (_bitmapForHitDetection==null)
{
drawBitmapHitArea();
}
_mousePoint.x = _bitmapForHitDetection.mouseX;
_mousePoint.y = _bitmapForHitDetection.mouseY;
return _bitmapForHitDetection.bitmapData.hitTest(_basePoint, _threshold, _mousePoint);
} protected function setButtonModeCache(restore:Boolean=false, retain:Boolean=false):void
{
if (restore)
{
if (_buttonModeCache==1)
{
buttonMode = true;
}
if (! retain)
{
_buttonModeCache = NaN;
}
return;
}
_buttonModeCache = (buttonMode==true ? 1 : 0);
buttonMode = false;
}
}
}
精确选择识别png图片有像素的区域的更多相关文章
- 精确选择识别png图片有像素的区域(使用方法)
/** * * *---------------------------------------* * | ***精确选择识别png图片有像素的区域*** | * *----------------- ...
- [ActionScript 3.0] 利用InteractivePNG.as类精确选择识别png图片有像素的区域
用法:如果是把png直接导入flash转换成影片剪辑,只需在影片剪辑属性中勾选为ActionScript导出(x),并把基类里的flash.display.MovieClip替换成Interactiv ...
- Canvas识别相似图片
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 以API方式调用C# dll,使用OneNote2013 sp1实现OCR识别本地图片
http://www.cnblogs.com/Charltsing/p/OneNoteOCRAPI.html OneNote2013 OCR API调用使用说明2019.4.17 使用说明:1.安装干 ...
- 用Delphi直接获取bmp图片的像素
用Delphi直接获取bmp图片的像素,并存储显示出.(此像素主要用在LED上显示).希望高手能给出代码啊!! function getImagePixels(f: string): Integer; ...
- iOS图片的伪裁剪(改变图片的像素值)
0x00 原理 利用一张图片事先画好的图片(以下称为蒙板),盖在要被裁剪的的图片上,然后遍历蒙板上的像素点,修改被裁剪图片对应位置的像素的色值即可得到一些我们想要的不规则图片了(比如人脸) 0x01 ...
- Android实现OCR扫描识别数字图片之图片扫描识别
[Android实例] Android实现OCR扫描识别数字图片之图片扫描识别 Android可以识别和扫描二维码,但是识别字符串呢? google提供了以下解决方案用的是原来HP的相关资料. 可以吧 ...
- win32加载图片获得像素值
在写光栅渲染器时,需要加载图片获得像素以便进行纹理插值,试了几种方法发现下面这种比价简单,效率也可以接受 Texture2D是我自己定义的类,其中m_pixelBuffer是一个动态二维数组,每个元素 ...
- Android 从 Android 本地图库选择多个图片
原文地址 本文说明如何从 Android 本地图库选择多个图片.作者考虑很多解决方案. 演示从 Android 本地图库选择多个图片,有两个方法可以实现从图库中选择多个图片: 用 Intent 获取多 ...
随机推荐
- vue 把后端返回的图片和url链接生成的二维码用canvas 合成一张图片
H5 页面在做某个活动的时候,有两种分享方式,一种是链接分享,一种是图片分享. 链接分享的话,如果是在微信里,就可引导用户利用微信浏览器自带的分享,根据sdk设置分享标题简介链接缩略图即可. 图片分享 ...
- 关于集成通用mapper的Mybatis代码生成器产生的model类注解
主要是@Table.@Id.@GeneratedValue.@Column 4个注解 这四个注解都来自javax.persistence包,是Java持久层规范,单纯的Mybatis并不认识这四个注解 ...
- python学习笔记二:(python3 logging函数中format说明)
背景,在学习logging时总是遇到无法理解的问题,总结,尝试一下更清晰明了了,让我们开始吧! logging模块常用format格式说明 %(levelno)s: 打印日志级别的数值 %(level ...
- EasyExcel写入百万级数据到多sheet---非注解方式
EasyExcel是什么? 快速.简单避免OOM的java处理Excel工具 一.项目需求 从mongo库中查询数据,导出到excel文件中.但是动态导出的excel有多少列.列名是什么.有多少she ...
- 【转】Android ROM分析(1):刷机原理及方法
一.刷机原理 android系统启动的时候,首先会进行一些诸如硬件自检之类的操作,这些操作完成以后(至少它应该知道当前的机器有没有电),会检查一下当前手机按键的状态(接下来就是所谓刷机模式切换了,不同 ...
- 转:【微信公众号】微信snsapi_base静默授权与snsapi_userinfo网页授权的实现(不建议使用静默,直接用主动比较方便)
版权声明:本文为CSDN博主「小璐謌」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/qq_37462176/ ...
- hive中function函数查询
1. desc function [函数名] desc function xpath; 查询用法: 2. desc function extended [函数名] desc function exte ...
- curl 转 wget
curl 转 wget // sed -e 's@-H @--header=@g;s@^curl @wget @g;s@--compressed$@@g' $crf var curlStr = `cu ...
- Linux云主机(离线)搭建本地yum源
下载CentOS镜像 http://mirror.nsc.liu.se/centos-store/7.3.1611/isos/x86_64/ 离线yum源的配置 1.上传下载的镜像源iso 2.挂载i ...
- springboot 整合OSS
OSS 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量.安全.低成本.高可靠的云存储服务.OSS可用于图片.音视频.日志等海量文件的存储.各种终端 ...