数字时代的传统艺术:Ultra Scrapbook应用介绍

随着数字存储技术的飞速发展,个人照片的存储和分享方式也发生了翻天覆地的变化。过去,人们习惯于将照片整理成实体剪贴簿,但这种方式在数字领域并没有得到很好的延续。用户不再满足于将图片右键另存为到本地电脑,然后使用非专业的软件(如Word、PowerPoint、Paint等)进行裁剪、调整大小和组合。Ultra Scrapbook应用的构想正是为了将传统的剪贴簿艺术带入数字照片的新时代。

应用概述

Ultra Scrapbook是一个让用户能够从他们依赖的流行服务中查看和导入照片的应用。用户可以在画布上组装照片,调整它们的位置和大小。相册可以有多页,每一页都包含照片和文字说明。

这款应用特别针对新一代的一体机(AIO),它们拥有大尺寸且色彩鲜艳的触摸屏。Intel Core处理器是驱动这款图形密集型应用的完美解决方案,为用户提供流畅且无抖动的体验。这款应用将吸引不同年龄段的用户,因为当今AIO的大屏幕非常适合全家人一起制作剪贴簿。多点触控界面让最年轻和最年长的成员都能直观地与应用互动。

使用Facebook凭证登录

查看并导入与在Facebook上相关的照片

在画布上添加、排列和调整照片大小

将画布输出为JPEG或PDF格式

项目保存在云中(Azure),并与Facebook凭证关联

与Microsoft、Google、Twitter等其他服务集成,允许混合来自多个服务的照片。

将签到信息与剪贴簿关联,使用户能够创建时间线类型的故事。

使用代码

该应用将使用C#编写,使用WPF。用户资料和项目数据将存储在通过Azure托管的Web服务上。该应用将通过REST调用摄取数据。Web服务本身将是一个ASP.NET MVC 4项目,它使用Graph API与Facebook通信。

对于Facebook,使用Facebook SDK for .NET。通过在NuGet Manager中搜索"Facebook"将其添加到项目中。以下是获取与用户相关联的前25张照片的调用。注意,使用"me"代替用户ID来引用登录用户。

var client = new Facebook.FacebookClient("yourAccessToken"); dynamic response = client.Get("me/photos", new { limit = 25, offset = 0 });

Get调用返回给一个动态对象,实际上是一个JSON对象。为了解析它,检查它是否包含一个名为"data"的键,然后遍历它的子项。定义了一个Picture类来表示图片。设置了一个"SocialProvider"属性,以帮助将来添加其他服务。

List<Picture> list = new List<Picture>(); if (response.ContainsKey("data")) { foreach (var result in response["data"]) { Picture item = new Picture(); item.Id = null; item.SourceId = result.id; item.Name = result.name; item.Link = result.link; item.ImageUrl = result.picture; item.BigImageUrl = result.source; item.Date = DateTime.Parse(result.created_time); item.Provider = SocialProvider.Facebook; list.Add(item); } }

Facebook在动态结果中的result.images数组中存储了每张图片的几种不同分辨率。在应用中,图片只能与一个源URL关联。因此,当用户调整图片大小时,希望获取最佳分辨率。但不想只获取最高可能的分辨率,所以寻找基于调整后的尺寸的下一个最高分辨率。使用图片的ID,可以做一个狭窄的查询,只查询那张照片。

dynamic response = client.Get(picture.SourceId); List<KeyValuePair<Size, string>> sizes = null; if (response.ContainsKey("images")) { sizes = new List<KeyValuePair<Size, string>>(); foreach (var result in response["images"]) { sizes.Add(new KeyValuePair<Size, string>(new Size(Convert.ToInt32(result.width), Convert.ToInt32(result.height)), result.source)); } } if (sizes != null) { // Figure out the best width and height. Basically the best width is equal to actual width, or one level higher. Same for height. Size bestWidth = new Size(); Size bestHeight = new Size(); string value = picture.ImageUrl; foreach (var item in sizes) { if (bestWidth.Width == 0 || (bestWidth.Width < picture.Width && bestWidth.Width < item.Key.Width) || (bestWidth.Width > picture.Width && bestWidth.Width > item.Key.Width && item.Key.Width > picture.Width)) { bestWidth = item.Key; } if (bestHeight.Height == 0 || (bestHeight.Height < picture.Height && bestHeight.Height < item.Key.Height) || (bestHeight.Height > picture.Height && bestHeight.Height > item.Key.Height && item.Key.Height > picture.Height)) { bestHeight = item.Key; } } // Set the optimal size to which ever size is the greatest. Size optimalSize = bestWidth.Width * bestWidth.Height > bestHeight.Width * bestHeight.Height ? bestWidth : bestHeight; return sizes.Find(p => p.Key.Equals(optimalSize)).Value; }

当进一步开发时,计划发布更多关于客户端WPF应用程序和Azure托管的Web服务之间通信的代码。将利用Azure免费的20MB SQL数据库配额来存储有关用户剪贴簿和图片的信息。这将允许用户在任何W8电脑上加载他们的项目。

还将展示如何使用捏合缩放和拖动来调整大小和定位图片。这将在AIO电脑的大触摸屏上工作得很好。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485