WPF如何判断PNG中的点是透明的
最近想用WPF做个空战游戏,其中就要解决子弹是否击中飞机的问题。这里面飞机用了PNG图片,大家都知道飞机是不规则图案,如何判断子弹碰撞成了一个难题。
好在我在网上找到了一个可以获取bitmap像素点颜色的方法。获取图像的ARGB 其中A就是透明度 当A等于0的时候就是透明
剩下的问题就是如何把ImageSource转成bitmap以及如何计算Image控件中的点对应的像素点坐标问题了。
废话不多说 直接上代码好了 相信大家是能看懂的。
/// <summary>
/// 获取Image控件上点对应图像的点是否是透明的
/// </summary>
/// <param name="p">相对Image控件的点</param>
/// <param name="Image_Main">Image控件</param>
/// <returns>是否透明</returns>
public static Boolean IsPointTransparent(System.Windows.Point p, System.Windows.Controls.Image Image_Main)
{
if (Image_Main.Source == null) {
return true;
}
BitmapSource m = (BitmapSource)Image_Main.Source;
using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(m.PixelWidth, m.PixelHeight, System.Drawing.Imaging.PixelFormat.Format32bppPArgb))
{ System.Drawing.Imaging.BitmapData data = bmp.LockBits(
new System.Drawing.Rectangle(System.Drawing.Point.Empty, bmp.Size), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
m.CopyPixels(Int32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride); bmp.UnlockBits(data);
int x = -;
int y = -;
double dx = ;
double dy = ;
System.Drawing.Point ImagePoint = new System.Drawing.Point(x, y); #region 获取实际图像点 switch (Image_Main.Stretch)
{
case Stretch.Fill:
dx = bmp.Width / Image_Main.ActualWidth;
dy = bmp.Height / Image_Main.ActualHeight;
x = int.Parse((p.X * dx).ToString("F0"));
y = int.Parse((p.Y * dy).ToString("F0"));
ImagePoint.X = x;
ImagePoint.Y = y;
break;
case Stretch.None:
x = int.Parse(p.X.ToString("F0"));
y = int.Parse(p.Y.ToString("F0"));
ImagePoint.X = x;
ImagePoint.Y = y;
break;
case Stretch.Uniform:
if (Image_Main.ActualWidth > Image_Main.ActualHeight)
{
dx = bmp.Width / Image_Main.ActualWidth;
dy = (bmp.Height / bmp.Width) * dx;
}
else
{
dy = bmp.Height / Image_Main.ActualHeight;
dx = (bmp.Width / bmp.Height) * dy;
}
x = int.Parse((p.X * dx).ToString("F0"));
y = int.Parse((p.Y * dy).ToString("F0"));
ImagePoint.X = x;
ImagePoint.Y = y;
break;
case Stretch.UniformToFill:
if (Image_Main.ActualWidth > Image_Main.ActualHeight)
{
dx = bmp.Width / Image_Main.ActualWidth;
dy = dx;
}
else
{
dx = bmp.Height / Image_Main.ActualHeight;
dy = dx;
}
x = int.Parse((p.X * dx).ToString("F0"));
y = int.Parse((p.Y * dy).ToString("F0"));
ImagePoint.X = x;
ImagePoint.Y = y;
break;
default: break;
} #endregion if (p.X < || p.Y < )
{
return true;
}
else
{
byte A = GetARGB(bmp, ImagePoint.X, ImagePoint.Y);
if ((int)A == )
{
return true;
}
else
{
return false;
}
}
}
} /// <summary>
/// 获取图像对应点的透明度
/// </summary>
/// <param name="bmp">图像</param>
/// <param name="x">x坐标</param>
/// <param name="y">y坐标</param>
/// <returns>透明度</returns>
private static byte GetARGB(Bitmap bmp, int x, int y)
{
System.Drawing.Color pixelColor = bmp.GetPixel(x, y);
//像素点颜色的 Alpha 值
byte alpha = pixelColor.A;
//颜色的 RED 分量值
byte red = pixelColor.R;
//颜色的 GREEN 分量值
byte green = pixelColor.G;
//颜色的 BLUE 分量值
byte blue = pixelColor.B;
return alpha;
}
看看 其实很简单把
主要是网上大部分都是模糊碰撞 思路基本都是大概框一下 然后算交集
这个方法适合判断点碰撞 如果是面碰撞应该也可以 就是需要继续加算法了
如果喜欢本文请留下你的脚印哦
本文版权归本作者所有 未经允许禁止用于商业目的 转载请注明出处!
WPF如何判断PNG中的点是透明的的更多相关文章
- WPF老矣,尚能饭否——且说说WPF今生未来(中):策略
本文接上文<WPF老矣,尚能饭否——且说说WPF今生未来(上):担心>继续. “上篇”中部分精彩的点评: 虽然WPF不再更新了,但是基于WPF的技术还是在发展着,就比如现在的WinRT,只 ...
- jQuery判断网页中的id是否有重复的
From:http://blog.csdn.net/china_skag/article/details/6915323判断网页中的ID是否有重复的:指定ID判断 $(function(){ $(&q ...
- 如何判断js中的数据类型?
js六大数据类型:number.string.object.Boolean.null.undefined string: 由单引号或双引号来说明,如"string" number: ...
- 如何判断js中的数据类型
如何判断js中的数据类型:typeof.instanceof. constructor. prototype方法比较 如何判断js中的类型呢,先举几个例子: var a = "iamstri ...
- Jquery判断数组中是否包含某个元素$.inArray()的用法
判断数组里面是否包含某个元素可以使用 $.inArray("元素(字符串)",数组名称) 进行判断 ,当存在该元素(字符串)时,返回该元素在数组的下标,不存在时返回 -1 示例代码 ...
- Ifvisible.js – 判断网页中的用户是闲置还是活动状态
ifvisible.js 是一个跨浏览器.轻量级的方式,用户检查用户在浏览页面或正在与它进行交互.它可以处理活动状态,如在页面上空闲或活跃.您还可以使用 ifvisible.js 智能设置您的间隔,如 ...
- PHP判断字符串中是否包含指定字符串,支持中文哦
RT,随手写的 /** * 判断字符串中是否包含指定字符串 * @var source 源字符串 * @var target 要判断的是否包含的字符串 * @return bool */ functi ...
- [转]如何判断js中的数据类型
原文地址:http://blog.sina.com.cn/s/blog_51048da70101grz6.html 如何判断js中的数据类型:typeof.instanceof. constructo ...
- JS判断数组中是否有重复元素的方法
判断数组中是否有重复元素,最容易想到的方法是使用2重循环,逐个遍历,比较,但是这个是最慢,最笨的方法,百度得出了更好的方法. var ary = new Array("111",& ...
随机推荐
- [Angular] Create a custom pipe
For example we want to create a pipe, to tranform byte to Mb. We using it in html like: <div> ...
- java类中属性优先执行顺序
1.父类静态代码块 ( java虚拟机加载类时,就会执行该块代码,故只执行一次) 2 .子类静态代码块 ( java虚拟机加载类时,就会执行该块代码,故只执行一次) 3. 父类属性对象初始化 4. ...
- 设置非ARC
设置非ARC: 在build phase 设置中compile sources 选择非arc文件,设置键值为-fno-objc-arc
- 检索06 - Oracle MySql SqlSever之间的区别和优缺点
三者之间区别 历史 1 Oracle:中文译作甲骨文,这是一家传奇的公司,有一个传奇的大老板Larry Ellision. Ellision 32岁还一事无成,读了三个大学,没得到一个学位文凭,换了十 ...
- 基于Linux应用层的6LOWPAN物联网网关及实现方法
本发明涉及一种基于Linux应用层的6LOWPAN物联网网关及实现方法,所述物联网网关包括开发平台以及无线射频模块,其实现方法是:所述6LOWPAN物联网网关的以太网网口收到访问6LOWPAN无线传感 ...
- win32命令行小程序获取指定文件夹或者目录下面的所有文件大小,文件数量,目录数量
#include <Windows.h> #include <stdio.h> #include <tchar.h> LARGE_INTEGER lgA ...
- 《Facebook效应》
前两年风靡了一阵子的电影<社交网络>毕竟是电影,一种艺术的方式的表达.虽然无法完全的印证<Facebook 效应>一书中记载的正确性,但其细节足以给人启示. 电影中,主人公炫酷 ...
- 编译freetype 的dll
因需要给python使用freetype库,so需要一个freetype的dll 2 steps 1. 在VC中设置输出为动态链接库 2. 修改ftoption.h 在284行增加2行代码即可 /** ...
- Robot Framework 快速入门_英文版
Copyright © Nokia Siemens Networks 2008 Licensed under the Apache License, Version 2.0 Table of Cont ...
- Fiddler教程(Web调试工具)
转载地址:写得很不错的fildder教程 http://kb.cnblogs.com/page/130367/ Fiddler的基本介绍 Fiddler的官方网站: www.fiddler2.c ...