随着数字存储技术的飞速发展,个人照片的存储和分享方式也发生了翻天覆地的变化。过去,人们习惯于将照片整理成实体剪贴簿,但这种方式在数字领域并没有得到很好的延续。用户不再满足于将图片右键另存为到本地电脑,然后使用非专业的软件(如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电脑的大触摸屏上工作得很好。