ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – WinRT:如何确保在Canvas上以像素完美的方式绘制图像?

2019-05-20 09:05:03  阅读:257  来源: 互联网

标签:c image canvas windows-runtime winrt-xaml


我在Windows运行时环境中将Image实例添加到Canvas,并且在140和180刻度分辨率显示时,我的图像不断放大,它在刻度分辨率100中看起来很完美.我尝试创建3个PNG图像,每个刻度尺寸一个:100 ,140,180但它仍然可以扩展它们,它们看起来很模糊.我在青色背景上创建了一个带有4个黑色像素的测试图像,我从模拟器中截取了一个截图,看看图像是如何模糊的,我的原始图像只有4个完美的黑色像素:

我尝试更改我的Image对象的拉伸模式,但它什么也没做.我正在使用此代码在运行时添加图像:

var bitmapImage = new BitmapImage();
StorageFile bitmapFile = await StorageFile.GetFileFromApplicationUriAsync(imageUri);
await bitmapImage.SetSourceAsync(await bitmapFile.OpenReadAsync());

Image image = new Image{ Source = bitmapImage};
image.SetValue(Canvas.LeftProperty, x);
image.SetValue(Canvas.TopProperty, y);
canvas.Children.Add(image);

如何让图像在画布中完美地绘制像素,而不进行缩放和我想要的精确x / y坐标?

解决方法:

我想我有一个解决方法,但它需要两个步骤:

首先,我必须使用更加标准的方式加载图像,而不涉及获取文件路径.

var bitmapImage = new BitmapImage(imageUri);

不知何故,这必须在内部保留更多信息,该图像来自具有当前显示的相应ResolutionScale的文件.因此,当它被画布绘制时,它根本不会缩放.然而,这只能解决问题的一半.

下一个问题是用于指定图像绘制位置的x,y坐标正在缩放,因此图像绘制在错误的位置,比我想要的更远.我唯一想做的就是首先将它们放大,如下所示:

var resScale = DisplayInformation.GetForCurrentView().ResolutionScale;
Image image = new Image{ Source = bitmapImage};
image.SetValue(Canvas.LeftProperty, (x * 100.0) / (int)resScale);
image.SetValue(Canvas.TopProperty, (y * 100.0) / (int)resScale);
canvas.Children.Add(image);

整个事情看起来有点疯狂,但它似乎到目前为止工作……任何人都有更好的解决方案或解释为什么这一切都是必要的?看起来像Canvas类需要一个不缩放的模式,不会弄乱不同分辨率显示器上的图像或坐标.

更新:这不能很好地工作,使用double来存储值会导致精度损失,有时会出现抗锯齿伪像.如果你想要像素完美的图形,这是不可接受的.我仍然在寻找一个完美的解决方案.

标签:c,image,canvas,windows-runtime,winrt-xaml
来源: https://codeday.me/bug/20190520/1141515.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有