wp仿系统截图
wp上直接调用CameraCaptureTask,并没有参数设置截图大小,刚好项目需求要截成正方型,于是写了个仿系统截图的demo出来。
截图如下:
需要做的逻辑运算为:
1、初始化照片时:判断照片比例,如果相对页面比例太长或者太宽 ——>改变对图片进行缩放,使照片填充满整个截取框,并把缩放比例设置为最小缩放倍数等。
void FitImage(double h,double w)
{
////判断是否存在applicationbar
if (this.ApplicationBar != null)
{
pageheight -= ;
}
//this.pageheight = this.ActualHeight;
//this.pagewidth = this.ActualWidth; if (h / w > pageheight / pagewidth)
{
ImageY = pageheight;
ImageX = pageheight * w / h;
}
else
{
ImageX = pagewidth;
ImageY = pagewidth * h / w;
} if (h > w)
{
if (resize / pageheight > w / h)
{
//太长,需要修改Scale(scale=resize*pixh/(pageh*pw))
minscale = img_composite.ScaleX = img_composite.ScaleY = resize * h / (pageheight * w);
}
else
{
minscale = resize / ImageX;
}
}
else
{
if (resize / pagewidth > h / w)
{
//太宽,需要修改Scale
minscale = img_composite.ScaleX = img_composite.ScaleY = resize * w / (pagewidth * h);
}
else
{
minscale = resize / ImageY;
}
}
}
2、左右移动时:根据照片缩放倍数,判断照片边沿等。
private void GestureListener_DragDelta(object sender, DragDeltaGestureEventArgs e)
{ //垂直偏移
if (img_composite.TranslateY >= (ImageY * img_composite.ScaleX - resize) / -0.01)
{
img_composite.TranslateY = (ImageY * img_composite.ScaleX - resize) / ; if (e.VerticalChange < )
img_composite.TranslateY += e.VerticalChange;
}
else if (img_composite.TranslateY <= -(ImageY * img_composite.ScaleX - resize) / + 0.01)
{
img_composite.TranslateY = -(ImageY * img_composite.ScaleX - resize) / ;
if (e.VerticalChange > )
img_composite.TranslateY += e.VerticalChange;
}
else
{
img_composite.TranslateY += e.VerticalChange;
} //水平偏移
if (img_composite.TranslateX >= (ImageX * img_composite.ScaleX - resize) / - 0.01)
{
img_composite.TranslateX = (ImageX * img_composite.ScaleX - resize) / ;
if (e.HorizontalChange < )
img_composite.TranslateX += e.HorizontalChange;
}
else if (img_composite.TranslateX <= -(ImageX * img_composite.ScaleX - resize) / + 0.01)
{
img_composite.TranslateX = -(ImageX * img_composite.ScaleX - resize) / ;
if (e.HorizontalChange > )
img_composite.TranslateX += e.HorizontalChange;
}
else
{
img_composite.TranslateX += e.HorizontalChange;
} //Debug.WriteLine("TranslateY:" + img_composite.TranslateY + ",e.VerticalChange:" + e.VerticalChange);
//Debug.WriteLine((ImageY * img_composite.ScaleX - resize) / 2);
}
private void GestureListener_DragCompleted(object sender, DragCompletedGestureEventArgs e)
{
if (img_composite.TranslateY > (ImageY * img_composite.ScaleX - resize) / )
{
img_composite.TranslateY = (ImageY * img_composite.ScaleX - resize) / ;
}
else if (img_composite.TranslateY < -(ImageY * img_composite.ScaleX - resize) / )
{
img_composite.TranslateY = -(ImageY * img_composite.ScaleX - resize) / ;
} if (img_composite.TranslateX > (ImageX * img_composite.ScaleX - resize) / )
{
img_composite.TranslateX = (ImageX * img_composite.ScaleX - resize) / ;
}
else if (img_composite.TranslateX < -(ImageX * img_composite.ScaleX - resize) / )
{
img_composite.TranslateX = -(ImageX * img_composite.ScaleX - resize) / ;
}
}
3、缩放时:使照片缓慢自动回到中间,且边沿不越过裁剪框等。
private void GestureListener_PinchDelta(object sender, PinchGestureEventArgs e)
{
if (e.DistanceRatio <= && img_composite.ScaleX <= (minscale+0.000001))
{
img_composite.ScaleX=img_composite.ScaleY = minscale;
return;
}
img_composite.ScaleX = img_composite.ScaleY = initialScale * e.DistanceRatio; //缩放的同时让图片回到正中间
if (e.DistanceRatio < )
{
if (btimage.PixelHeight > btimage.PixelWidth)
{
if (resize / ImageY > btimage.PixelWidth / btimage.PixelHeight)
{
//太长,改水平偏移
img_composite.TranslateX = img_composite.TranslateX * (img_composite.ScaleX / minscale - );
//img_composite.TranslateY = initialTranslateY * e.DistanceRatio; //修改垂直偏移
if (img_composite.TranslateY >= (ImageY * img_composite.ScaleX - resize) / )
{
img_composite.TranslateY = (ImageY * img_composite.ScaleX - resize) / ;
}
else if (img_composite.TranslateY <= -(ImageY * img_composite.ScaleX - resize) / )
{
img_composite.TranslateY = -(ImageY * img_composite.ScaleX - resize) / ;
} }
}
else
{
if (resize / ImageX > btimage.PixelHeight / btimage.PixelWidth)
{
//太宽,改垂直偏移
img_composite.TranslateY = img_composite.TranslateY * (img_composite.ScaleX / minscale - );
//修改水平偏移
if (img_composite.TranslateX >= (ImageX * img_composite.ScaleX - resize) / )
{
img_composite.TranslateX = (ImageX * img_composite.ScaleX - resize) / ;
}
else if (img_composite.TranslateX <= -(ImageX * img_composite.ScaleX - resize) / )
{
img_composite.TranslateX = -(ImageX * img_composite.ScaleX - resize) / ;
}
}
} }
Debug.WriteLine("ScaleY:" + img_composite.ScaleY + ",ScaleX:" + img_composite.ScaleX);
} private void GestureListener_PinchStarted(object sender, PinchStartedGestureEventArgs e)
{
initialScale = img_composite.ScaleX;
} private void GestureListener_PinchCompleted(object sender, PinchGestureEventArgs e)
{
if (img_composite.ScaleX <= minscale)
{
img_composite.ScaleX = img_composite.ScaleY = minscale;
} //修改垂直偏移
if (img_composite.TranslateY >= (ImageY * img_composite.ScaleX - resize) / )
{
img_composite.TranslateY = (ImageY * img_composite.ScaleX - resize) / ;
}
else if (img_composite.TranslateY <= -(ImageY * img_composite.ScaleX - resize) / )
{
img_composite.TranslateY = -(ImageY * img_composite.ScaleX - resize) / ;
} //修改水平偏移
if (img_composite.TranslateX >= (ImageX * img_composite.ScaleX - resize) / )
{
img_composite.TranslateX = (ImageX * img_composite.ScaleX - resize) / ;
}
else if (img_composite.TranslateX <= -(ImageX * img_composite.ScaleX - resize) / )
{
img_composite.TranslateX = -(ImageX * img_composite.ScaleX - resize) / ;
}
}
注:由于放大缩小过程中计算到照片宽高值虽然是double类型,但也会丢失了一很小的一些数据。并不是做到绝对准确,为此,在左右移动,和缩放过程中分别加入了0.01和0.000001,的容错范围。(不加的话,会出现拖放到边沿,或者缩放到最小时出现跳动现象)
4、点击剪切时,计算所要剪辑位置,大小。通过对image的clip属性设置RectangleGeometry,直接在页面显示裁剪后的图片。并通过WriteableBitmap获取到裁剪后的图片,并保存到本地媒体库。
void ClipImage()
{
//利用Rectangle建立RectangleGeometry指定要用來裁剪的大小
RectangleGeometry geo = new RectangleGeometry(); double x; double y; x = ((ImageX * img_composite.ScaleX - resize) / - img_composite.TranslateX) / img_composite.ScaleX;
y = ((ImageY * img_composite.ScaleX - resize) / - img_composite.TranslateY) / img_composite.ScaleX;
redussize = resize / img_composite.ScaleX; geo.Rect = new Rect(x, y, redussize, redussize); // 對image進行裁剪
image.Clip = geo;
}
void WriteBitmap(Image element)
{
TranslateTransform t = new TranslateTransform();
t.X = -((ImageX * img_composite.ScaleX - resize) / - img_composite.TranslateX) / img_composite.ScaleX;
t.Y = -((ImageY * img_composite.ScaleX - resize) / - img_composite.TranslateY) / img_composite.ScaleX; WriteableBitmap wBitmap = new WriteableBitmap((int)redussize, (int)redussize);
wBitmap.Render(element, t);
wBitmap.Invalidate();
string tempJPEG = "TempJPEG.jpg"; using (var iso = IsolatedStorageFile.GetUserStoreForApplication())
{
using (var fileStream = iso.OpenFile(tempJPEG, FileMode.Create, FileAccess.Write))
{
wBitmap.SaveJpeg(fileStream, wBitmap.PixelWidth, wBitmap.PixelHeight, , );
}
using (var imageStream = iso.OpenFile(tempJPEG, FileMode.Open, FileAccess.Read))
{
MediaLibrary mediaLibrary = new MediaLibrary();
Picture pic = mediaLibrary.SavePicture("SavedLogo.jpg", imageStream);
}
}
MessageBox.Show("保存成功!", "提示", MessageBoxButton.OK);
}
备注:
1、裁剪时,设置图片的clip属性除了方便显示到页面上,还有,得到clip的RectangleGeometry的编译量坐标点,和长宽时,我们也就很简单的得到了WriteableBitmap所要设置的参数。
2、WriteableBitmap截图时要记得调用wBitmap.Invalidate();方法,进行绘制。否则得到的只是一张全是黑色像素的图。
源代码请戳:http://files.cnblogs.com/fatlin/ImageCrop.rar
参考链接:http://www.dotblogs.com.tw/pou/archive/2013/06/24/105923.aspx
wp仿系统截图的更多相关文章
- 06-模仿系统的UIImageView
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- WPF C#截图功能 仿qq截图
原文:WPF C#截图功能 仿qq截图 先上效果图 源码下载地址:http://download.csdn.net/detail/candyvoice/9788099 描述:启动程序,点击窗口butt ...
- Atitit 跨平台的系统截图解决方案
Atitit 跨平台的系统截图解决方案 1.1. Nodes js 方案desktop-screenshot进行系统截图1 1.2. Win 方案,autoit dsl,可能不跨台1 1.3. Jav ...
- 【转】Android仿QQ截图应用测试
使用过QQ的同学应该都用过QQ截图,Ctrl+Alt+A进入截图操作,通过拉伸,移动高亮区域的框体可以快速截取我们需要的图片.在android应用中,我们也经常需要截图操作,以下实现了一个类似QQ截图 ...
- android仿系统Launcher界面,实现分屏,左右滑动效果(ViewSwitcher)
ViewSwitcher代表了视图切换组件, 本身继承了FrameLayout ,可以将多个View叠在一起 ,每次只显示一个组件.当程序控制从一个View切换到另个View时,ViewSwitche ...
- WP评论系统更换小结(转)
第三方评论插件 多说 多说是一款追求极致体验的社会化评论框,可以用微博.QQ.人人.豆瓣等帐号登录并评论. 多说具备优质用户体验.速度和稳定性.社会化推荐.建站程序审核整合.垃圾评论过滤等特性. 自定 ...
- Mac改变系统截图存储路径
时间:2018年9月13日 人物:同事和我 事情:看苹果秋季新品发布会,并且想要截图下来当时的新品介绍. 问题:系统的截图默认是存储在桌面,整理的时候,不是很方便. Mac截图快捷键: 截取选中区域: ...
- WPF实现截图(仿微信截图)
WPF开发者QQ群: 340500857 | 微信群 -> 进入公众号主页 加入组织 每日一笑 肚子疼,去厕所排便,结果什么都没拉出来.看着自己坐在马桶上痛苦又努力却一无所获的样子,仿佛看到了 ...
- (转)两张Firefox OS 系统截图
锁屏图 锁屏就是一个向上的小火箭. 桌面 桌面又是另一种风格. 注意 以上为Android系统下运行b2g. 原文地址,TZone
随机推荐
- phpstorm 2016.2 的最新破解方法(截止2016-8-1)
今天刚更新了phpstorm 2016.2版本,发现网上提供的破解地址都有问题,即*.lanyus.com及*.qinxi1992.cn下的全部授权服务器已遭JetBrains封杀. 最后网上找到一个 ...
- 过滤3个字节以上的utf-8字符
/** * 过滤掉超过3个字节的UTF8字符 * @param text * @return * @throws UnsupportedEncodingException */ public stat ...
- Java多线程之DaemonThreadFactory
通过DaemonThreadFactory创建后台线程池 另外:如果是后台线程创建的线程,将都是后台线程. package wzh.daemon; import java.util.concurren ...
- Python进阶01 词典
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 基础教程介绍了基本概念,特别是对象和类. 进阶教程对基础教程的进一步拓展,说明Py ...
- HTTP Response中的Status-Code
1XX : 通知信息.请求被接收,继续处理2XX : 成功.请求动作被成功接收.理解和接受3XX : 重定向.需要其他的动作来完成这个请求4XX : 客户端错误.请求包含错误的语法或者缺少语法5XX ...
- NodeJS学习历程 - (一)工具篇
后端工具 1.express:开发框架 npm install express 2.mongoose:MongoDB的处理插件 npm install mongoose 教程一:Mongoose全面理 ...
- C++学习15 继承权限和继承方式
C++继承的一般语法为: class 派生类名:[继承方式] 基类名{ 派生类新增加的成员 }; 继承方式限定了基类成员在派生类中的访问权限,包括 public(公有的).private(私有的)和 ...
- 关于Servlet中的HttpServletRequest和HttpServletResponse
1.HttpServletRequest 方 法 说 明 getAttributeNames() 返回当前请求的所有属性的名字集合 getAttribute(String name) 返回 ...
- Heka–>Elasticsearch 索引数据过程的优化
Heka 的参数配置跟Elasticsearch的参数没有关系,Heka只负责按照配置发送数据,所以索引的优化主要在 Elaticsearch端来完成. 下面是Elasticsearch的一些相关概念 ...
- C# 泛型List用法
C# List Examples by Sam Allen - Updated September 6, 2009 Problem. You have questions about the List ...