精确选择识别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 获取多 ...
随机推荐
- 3-ESP8266 SDK开发基础入门篇--点亮一个灯
https://www.cnblogs.com/yangfengwu/p/11072834.html 所有的源码 https://gitee.com/yang456/Learn8266SDKDevel ...
- cyyz: Day 6 平衡树整理
一.平衡树 知识点: ,并且左右两个子树都是一棵平衡二叉树.平衡二叉树的常用实现方法有红黑树.AVL.替罪羊树.Treap.伸展树等. 最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n- ...
- AGC028 E - High Elements
AGC028 E - High Elements 有一个排列\(p\),你要分成两个子序列\(A,B\),满足\(A,B\)的LIS长度相等.设\(S\)是一个\(01\)序列,\(S_i=0\)当且 ...
- 【dp】P1064 金明的预算方案
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元钱就行”. ...
- C博客作业00——我的第一篇博客
1.你对网络专业或计算机专业了解是怎样? 初看字眼,便觉得是理工性很强的专业,所以需要较强的开拓思维,创新精神,探索未知事物的勇气,才能掌握并且熟练应用相关知识.计算机类专业都需要学习计算机语言,而计 ...
- win10 无法使用内置管理员账户打开应用
运行gpedit.msc 启用两项 如何登陆 win 10 账户? 进入 win 10 应用商店,下载一个软件,然后登陆即可
- clion下批量删除断点
- hotspot编译
"AA=="1",==", /usr/bin/make -s VERBOSE="-s" LOG_LEVEL="warn" ...
- Predictive Analysis in Network Function Virtualization
摘要 网络功能虚拟化(NFV)体系结构的最新部署获得了极大的关注.虚拟化虽然带来了诸如降低成本和简化网络功能部署之类的好处,但它增加了附加层,从而降低了较低层故障的透明度.为了改善虚拟网络功能(VNF ...
- ESXi6.5上的Ubuntu虚机在远程SSH时宕机
情况是这样的, 有一个ESXi6.5上跑的Ubuntu虚机, 版本是18.04.1, 今天升级成18.04.2后, 就发现远程连接SSH不对劲, 在本地登录和操作都好好的, 只要远程SSH一连接, 服 ...