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",& ...
随机推荐
- jquery pagination分页的两种实现方式
原文链接:http://blog.csdn.net/qq_37936542/article/details/79457012 此插件是jQuery的ajax分页插件.如果你用到此插件作分页的时候,涉及 ...
- Android 多个Fragment嵌套导致的三大BUG
Android有碎片化的问题,当然本文说的碎片化不是指的系统版本碎片化的问题,而是Fragment组件碎片化的问题. 很久之前,在Android 3.1系统发布的时候,Google推出了使用Fragm ...
- jQuery Mobile手机网站案例
jQuery Mobile手机网站案例 一.总结 一句话总结:jQuery Mobile是纯手机框架,和amazeui和bootstrap都可以做手机网站. 1.另一款文本编辑器? jd编辑器 二.j ...
- 自己动手编写一个VS插件(八)
作者:朱金灿 来源:http://blog.csdn.net/clever101 利用业余时间继续开发一个VS插件.我要开发的插件是一个代码库插件,主要是用于积累我平时要使用的代码.在之前我已经实现了 ...
- unix shell(壳)的简单实现
用户程序通过调用操作系统提供的系统调用(system call)API 来获得操作系统提供的各种服务.但使用 API 需要手动编写程序.对于不编程序.且需要与操作系统进行交互的用户,又如何使用操作系统 ...
- Hexo里如何添加广告
前期先用Hexo做个人网站,模板可以用https://github.com/828768/maupassant-hexo,关于如何加入广告,可以看一下https://sobaigu.com/hexo- ...
- 加减密 DES
/**//// <summary> /// DES /// </summary> public class DES_ { private DES mydes; public s ...
- windows 10 常用快捷键
alt + space:最大.最小.关闭: 多屏互动:win+p 仅此电脑屏幕:复制:拓展:仅第二屏幕: 0. 不同于之前版本的变化 切换输入法:shift + alt: win + space: w ...
- e.target e.currenttarget
概述 当事件穿过 DOM 时,识别事件的当前目标对象(Identifies the current target for the event, as the event traverses the D ...
- DM365 IPNC软件架构具体解释
于2013在上半场 - 年DM365.DM368的IPNC(网络摄像机)与稳定性测试工作产品结束. 1.简单介绍: TI针对TMS320DM365.DM368进行了DVR和IPNC的应用方案參考.DV ...