精确选择识别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;
		}
	}
}

  

原文地址:https://www.cnblogs.com/fengziwu/p/10908764.html

时间: 2024-10-09 20:00:39

精确选择识别png图片有像素的区域的相关文章

[ActionScript 3.0] 利用InteractivePNG.as类精确选择识别png图片有像素的区域

用法:如果是把png直接导入flash转换成影片剪辑,只需在影片剪辑属性中勾选为ActionScript导出(x),并把基类里的flash.display.MovieClip替换成InteractivePNG即可:如果是外部导入png,只需将存放png的类继承InteractivePNG即可: 1 package 2 { 3 import flash.display.Loader; 4 import flash.display.MovieClip; 5 import flash.display.

Python+Opencv进行识别相似图片

在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简单几句就说清,所以本文只作基本算法的科普向. 看到一篇博客是介绍这个,但他用的是PIL中的Image实现的,感觉比较麻烦,于是利用Opencv库进行了更简洁化的实现. 相关背景 要识别两张相似图像,我们从感性上来谈是怎么样的一个过程?首先我们会区分这两张相片的类型,例如是风景照,还是人物照.风景照中

精确比较页面截图图片

环境: 打开CMD窗口,输入pip install pillow安装Python图像处理库,安装结束后在CMD下进入Python交互模式,执行from PIL import Image,没有报错则安装成功. #!usr/bin/env python #-*- coding:utf-8 -*- """ @author: sleeping_cat @Contact : [email protected] """ #精确比较页面截图图片 from se

如何快速识别提取图片上的文字

我们在日常工作中,我们经常会遇到将图片上文字转换成Word文档这样的情况,要知道, 图片上的文字是不能直接复制的,这是一件令人头疼的一件事情.那么要怎样才能快速的 提取这些图片的文字呢? 快速识别提取图片上的的文字的方法--迅捷文字识别小程序 1.首先打开手机微信,在微信上搜索迅捷文字识别,这是一个可以快速识别图片上 的文字的小程序,是一个比较智能的工具. 2.找到小程序之后,点击进入小程序的主界面,点击"照片/拍照". 3.再点击"选择图片". 4.选择一张你手机

Python 实现识别弱图片验证码

目前,很多网站为了防止爬虫肆意模拟浏览器登录,采用增加验证码的方式来拦截爬虫.验证码的形式有多种,最常见的就是图片验证码.其他验证码的形式有音频验证码,滑动验证码等.图片验证码越来越高级,识别难度也大幅提高,就算人为输入也经常会输错.本文主要讲解识别弱图片验证码. 1 图片验证码强度 图片验证码主要采用加干扰线.字符粘连.字符扭曲方式来增强识别难度. 加干扰线 加干扰线也分为两种,一种是线条跟字符同等颜色,另一种则线条的颜色是五颜六色. 字符粘连 各个字符之间的间隔比较小,互相依靠,能以分割.

如何识别JPG图片转文字,简单的方法讲解

相信办公中的小伙伴们经常会遇到图片转文字的问题,需要将图片上的文字应用到别的地方去,但是图中的文字又不可以直接进行复制粘贴,接下来小编就来给大家分享一种识别JPG图片转文字的简单操作方法,大家可以以此来参考下. 辅助工具:迅捷OCR文字识别软件 操作步骤: 1:在电脑中打开接下来使用到的OCR文字识别软件,点击图片局部识别板块. 2:进入图片局部识别板块后,点击添加文件按钮选择一张所需转换的文字图片并打开. 3:图片打开后可以通过下方一排小工具来简单对图片进行"移动""放大&

根据图片的像素 手势穿透问题

新建一个UIImageView的子类. 并重写 : -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{ unsigned char pixel[1] = {0}; CGContextRef context = CGBitmapContextCreate(pixel, 1, 1, 8, 1, NULL, kCGImageAlphaOnly); UIGraphicsPushContext(context); [self.imag

win32加载图片获得像素值

在写光栅渲染器时,需要加载图片获得像素以便进行纹理插值,试了几种方法发现下面这种比价简单,效率也可以接受 Texture2D是我自己定义的类,其中m_pixelBuffer是一个动态二维数组,每个元素为ZCFLOAT3(自定义类型用来保存颜色rgb值). 1 #include "LoadBitmap.h" 2 #include <windows.h> 3 #include <gdiplus.h> 4 5 #include <iostream> 6 #

点击跳转到系统图库,然后将选择回来的图片显示到应用上

有时候需要跳转到系统图库选图,那么用以下代码实现 /**点击跳转到系统图库,然后将选择回来的图片显示到应用上*/ public class MainActivity extends Activity { private ImageView iv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.act