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",& ...
随机推荐
- 【u207】最小值
Time Limit: 1 second Memory Limit: 128 MB [问题描述] N个数排成一排,你可以任意选择连续的若干个数,算出它们的和.问该如何选择才能使得和的绝对值最小. 如: ...
- 阿里云域名和ip绑定步骤
阿里云域名和ip绑定步骤 一.总结 一句话总结:域名转IP信息存在所在地运营商那,比如电信联通等. 1.给域名添加对应ip的过程叫做什么? 域名解析 2.域名解析中的记录代表什么意思,记录值呢? 记录 ...
- JS调用ATL COM中的C++接口的做法
作者:朱金灿 来源:http://blog.csdn.net/clever101 首先创建一个ATL COM对象,其过程参考下面文章: C#调用ATLCOM 其实给COM对象添加方法和属性可以不用界面 ...
- Golang快速入门
Go语言简介: Golang 简称 Go,是一个开源的编程语言,Go是从2007年末由 Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian L ...
- [Angular] Difference between Providers and ViewProviders
For example we have a component: class TodoList { private todos: Todo[] = []; add(todo: Todo) {} rem ...
- WPF实现射线效果动画
原文:WPF实现射线效果动画 最近的一个项目中有个需求是:从一个点向其它多个点发出射线,要求这些射线同时发出,同时到达. 我就想到了用WPF的动画来实现.WPF中有Line类用于绘制直线,但这个类中好 ...
- 开源项目学习之------AG-Admin环境搭建
原文地址: https://blog.csdn.net/u011781521/article/details/79056974 一.框架简介 AG-Admin是基于Spring Cloud微服务化开发 ...
- Zero Downtime Upgrade of Oracle 10g to Oracle 11g Using GoldenGate — 1
Source Database DB Name: zwc Schemas: HR,OE,PM Version: 10.2.0.4 RAC: ...
- WPF 开发自动开机启动程序
原文:WPF 开发自动开机启动程序 本文告诉大家如何在 WPF 开发一个可以自动启动的程序 本文使用的自动开机启动方法是通过快捷方式放在启动文件夹的方式. 创建快捷方式 /// <summary ...
- 如何将字段中带逗号的SQLite数据库数据导入到MySQL
以前在数据库导入中没有遇到过什么问题,如下这样导入 load data local infile 'D:\data.csv' into table table1 fields terminated b ...