首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何将WPF大小转换为物理像素?

WPF(Windows Presentation Foundation)是一种用于创建用户界面的框架,它使用设备无关的矢量图形来呈现界面元素。在WPF中,界面元素的大小通常使用逻辑单位(逻辑像素)来表示,而不是物理像素。要将WPF大小转换为物理像素,可以使用以下步骤:

  1. 获取屏幕的DPI(每英寸像素数)。可以使用System.Windows.SystemParameters类中的DpiXDpiY属性获取水平和垂直DPI值。
  2. 将逻辑单位(逻辑像素)转换为物理单位(物理像素)。WPF中的逻辑单位是设备独立的,通常以96 DPI为基准。可以使用以下公式将逻辑单位转换为物理单位:

物理像素 = 逻辑像素 * (实际DPI / 96)

其中,实际DPI是从步骤1中获取的屏幕DPI值。

下面是一个示例代码,演示如何将WPF大小转换为物理像素:

代码语言:csharp
复制
using System;
using System.Windows;

public static class WpfUtils
{
    public static double ConvertToPhysicalPixels(double logicalPixels)
    {
        PresentationSource source = PresentationSource.FromVisual(Application.Current.MainWindow);
        if (source != null)
        {
            double dpiX = 96.0 * source.CompositionTarget.TransformToDevice.M11;
            return logicalPixels * (dpiX / 96.0);
        }
        return logicalPixels;
    }
}

class Program
{
    static void Main(string[] args)
    {
        double wpfSize = 100; // 逻辑像素大小
        double physicalSize = WpfUtils.ConvertToPhysicalPixels(wpfSize);
        Console.WriteLine("物理像素大小: " + physicalSize);
    }
}

在上面的示例中,ConvertToPhysicalPixels方法接受一个逻辑像素大小,并返回对应的物理像素大小。通过PresentationSource类获取当前应用程序的主窗口的CompositionTarget,然后使用TransformToDevice属性获取DPI转换矩阵,从而计算出物理像素大小。

这种转换可以帮助在WPF应用程序中正确处理不同DPI的屏幕,以确保界面元素在不同设备上的显示一致性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

win10 uwp 如何将像素数组 png 文件

堆栈的小伙伴好奇他有一个数组,数组里面是 BGRA 的像素,他需要将这个数组转换为 PNG 文件 在 UWP 可以使用 BitmapEncoder 将像素数组加密为文件 在使用 BitmapEncoder...之前需要要求有像素数组,像素数组的规律有要求,按照 BGRA 按照顺序的数组,同时要求知道像素的原图的像素宽度。...因为存放像素数组使用的是一维的数组,如果不知道图片宽度,那么就不知道这个图片的像素是对应数组哪个 通过下面方法可以转换像素数组到文件 private async Task ByteToPng...ByteToPng(byteList, width, height, stream); } } 通过这个方法,可以传入数组和图片的宽度和高度,保存的文件,就可以将像素数组保存到

1.5K30
  • 将 UWP 的有效像素(Effective Pixels)引入 WPF

    UWP 采用有效像素(Effective Pixels)来描述尺寸,这是才是能够自圆其说的一套尺寸描述;WPF 的尺寸机制与 UWP 完全就是同一套,使用有效像素才能解释 WPF 尺寸变化上的各种特性!...在本文中,对于尺寸,我们只说三个概念: 物理尺寸(单位:厘米) 显示器像素个数(单位:个) 有效像素(即 WPF 中最常用的那个单位;在本文结束之前,这应该是一个未定义的概念) 如果我们说 A 按钮比...有效像素(epx)的愿景 有效像素概念的出现,就摒除了 WPF 物理尺寸相同这样荒谬而无法自圆其说的设定。...给有效像素下个定义 结合微软对有效像素的愿景,结合实际情况,我认为“有效像素”的定义应该是这样的: 在理想状态下,1 有效像素等于用户观看距离 50cm 时,观看屏幕上 1/96 英寸的物理距离所对应的视角大小...,如果用户降低了分辨率 居中点对点显示,显示完按钮宽度所用的屏幕像素个数为 96 拉伸显示,显示完按钮宽度所用的屏幕像素个数大于为 96,虚拟的系统像素个数依然等于 96 接受现实 看看按钮实际的大小

    1.5K21

    探究WPF中文字模糊的问题:TextOptions的用法

    像素对齐和抗锯齿 我们经常听到WPF具有分辨率无关性这个说法,因为WPF使用的是与设备无关的绘图系统,为字体和形状等内容指定大小或者尺寸的数值并不是真实的像素,在WPF中称之为设备无关单位。...渲染过程中,WPF会自动把设备无关单位转换为物理像素,由于设备的差异以及DPI设置不同,转换之后的像素很少是整数,然而无法使用零点几个像素点去绘制,WPF会使用抗锯齿特性进行补偿。...例如绘制一条62.4992个像素长的红线时,WPF会正常填充前62个像素,然后使用直线颜色(红色)和背景色之间的颜色为第63个像素着色,但这个补偿也会带来新的问题,在绘制直线、矩形或者具有直角的多边形时...Display:WPF4.0中引入的新的格式化文本的度量模式。它使用GDI兼容的文本度量。该模式下每个字形的宽度都是整数个像素,字形的大小和换行与基于GDI的框架相似(比如WinForm)。...这也就意味着字形的大小和换行不完全准确。 两种模式都有各自的优势和缺点,Ideal模式可以提供最佳的字形和间距,减少用户阅读疲劳,但是在较小的字体情况下,文字渲染会模糊。

    34210

    WPF 触摸屏应用需要了解的知识

    记住一个参数,在10ms内移动距离不超过xx像素。注意这个 xx 像素是因为软件里面只能知道像素,而不知道物理距离尺寸。因此需要根据具体触摸框和屏幕测试出这个像素值。...同时屏幕的大小和分辨率没有本质的联系。一个 10 寸的屏幕可以是 2k 分辨率,而一个 100 寸的屏幕可以是 1k 分辨率。而分辨率和像素相关,应用程序能控制的仅仅是像素。...因此就需要应用程序知道当前运行过程中像素物理尺寸的换算比例是多少,这部分需要应用程序和硬件配合,应用程序询问硬件当前的型号以及显示屏幕的尺寸。...同时知道当前系统的分辨率,以此进行缩放,拿到当前像素物理尺寸转换的参数。...然后和触摸框部分协议报告上来的面积的含义,以此转换为实际渲染像素 需要注意的是 WPF 默认是像素无关的,这部分想要达到更好的控制,还需要了解 DPI 和分辨率的关系等细节。

    1.6K30

    WPF 使用 Skia 绘制 WriteableBitmap 图片

    本文告诉大家如何在 WPF 中使用 SkiaSharp 调用 Skia 这个全平台底层渲染框架,使用绘制命令在 WriteableBitmap 图片上绘制内容 谷歌提出了 Skia 全平台渲染框架,这是一个很底层的框架...那么如何在 WPF 使用 SkiaSharp 绘制出 WriteableBitmap 在 WPF 中使用?...其实 WriteableBitmap 是将一个数组里面的像素在屏幕显示,而 SKSurface 可以从一个像素数组开始创建,创建的时候需要规定这个数组对应的图片的格式,包括图片的大小以及 RGB 像素格式...BitmapPalettes.Halftone256Transparent 将会和后续的 Skia 创建相关 在 Skia 里面和 D2D 一样有 Surface 的概念,也就是可以将绘制命令输入到 Skia 绘制到 Surface 上,而绘制内容将会作为像素数组放在传入的数组里面...小伙伴是否还记得 WPF 使用不安全代码快速从数组 WriteableBitmap 的方法,其实 Skia 在 WriteableBitmap 绘制的本质就是这样 在开始绘制之前需要调用 WriteableBitmap

    2.3K20

    探讨移动端适配

    答案是否定的,我们在css中只给盒子规定了100x100的像素,而在浏览器放大两倍后盒子变成了200x200 从这里也验证了css中的像素只是一个相对单位,浏览器在对html解析时会将css像素换为物理像素在进行呈现...但是浏览器是如何将css像素换为物理像素的呢?...通过查看视口的大小就可以得出 CSS像素物理像素的比值关系 如上图视口宽度为 1280 而我们的分辨率,物理像素也是 1280 此时在浏览器窗口未发生改变和缩放时,CSS像素物理像素的比值是...我们可以通过改变视口的大小来改变CSS像素物理像素的比值 如Iphone6 的物理像素是750px这个是固定的,我们要调整像素比,只需将视口调小就可以了如 375,此时正好是1:2 通过meta设置视口大小...比如页面元素字体标注的大小是32px,转换为vw为 32/750(设计稿)*100vw 对于需要等比缩放的元素,CSS使用转换后的单位 对于不需要缩放的元素,比如边框阴影,使用固定单位 vw示例如下

    1.4K10

    dotnet 读 WPF 源代码笔记 为什么加上 BooleanBoxes 类

    WPF 框架,为什么需要定义一个 BooleanBoxes 类。为什么在 D3DImage 的 Callback 方法里面,传入的是 object 对象,却能被转换为布尔。...原因是如此方便重新转换为布尔值 使用 BooleanBoxes 的性能如何?...然而在 SetIsFrontBufferAvailable 方法里面,将此参数进行了强。...因为本来是通过布尔装箱创建的,也因此能被转换为布尔值 以上就是 WPF 为什么加上 BooleanBoxes 类的原因,以及在 D3DImage 里,使用布尔强一个 object 可以符合预期 更多逻辑...,还请阅读 WPF 源代码 当前的 WPF 在 https://github.com/dotnet/wpf 完全开源,使用友好的 MIT 协议,意味着允许任何人任何组织和企业任意处置,包括使用,复制,修改

    65210

    Web正文字体发展简史

    如何将传单或杂志广告中使用的字体磅值转换为HTML 字体尺寸?” 当然,由于像素没有通用的物理尺寸,因此无法可靠地将印刷点转换为像素。屏幕具有不同的每英寸像素比。...设备的工作不就是确保字体大小 100% 是可读的吗从理论上讲,CSS像素应该匹配一个定义为视角的“参考像素”: 参考像素是设备上一个像素的视角,像素密度为 96dpi,与阅读器的距离为一臂长。...所以,我们猜测;我们测试;我们调整: 无论在技术上是正确的还是近似的(我自己的计算显示分辨率为68dpi),72dpi分辨率允许设计师轻松地将点大小换为像素大小。...因为一英寸有72个印刷点,在 72dpi 时每个像素正好是一个点。 视网膜显示器并没有改变“每英寸系统点”的分辨率,而是将每个系统点映射到一个 2×2 平方的物理像素上。...由于 CSS px单元的工作方式类似于这些设备上的系统点,并且将物理像素分辨率提高一倍并不会影响 HTML 文本的大小,所以我跳过了讨论以物理像素(例如 320ppi)测量的分辨率。

    1.2K10

    WPF 从裸 Win 32 的 WM_Pointer 消息获取触摸点绘制笔迹

    的源代码,先将消息过来的 wparam 转换为 pointerId 参数,代码如下 var pointerId = (uint) (ToInt32(wparam) & 0xFFFF...,使用屏幕坐标系 var point = pointerInfo.ptPixelLocation; 从屏幕坐标系转换为 WPF 坐标系,代码如下 PInvoke.ScreenToClient...,和原始博客提供的程序,可以看到还是原来的笔迹更加顺滑 其核心原因在于 Pointer 消息的 ptPixelLocation 字段拿到的是丢失精度的点,像素为单位。...这里需要对后缀 Raw 作出更多的说明,在微软官方文档里面说了不带 Raw 的是预测的值,即 ptPixelLocation 是预测的像素坐标点,而 ptPixelLocationRaw 是不带预测的像素坐标点...对于咱如果是使用在笔迹上,其实更应该使用的是 ptPixelLocationRaw 是不带预测的像素坐标点。

    14010

    dotnet 读 WPF 源代码笔记 启动欢迎界面 SplashScreen 的原理

    WPF 中的启动界面,为了能让 WPF 的启动界面显示足够快,需要在应用的 WPF 主机还没有启动完成之前就显示出启动图,此时的启动图需要自己解析图片同时也需要自己创建显示窗口 从 WPF 的 src...private UnmanagedMemoryStream GetResourceStream() 在获取到启动图片的 UnmanagedMemoryStream 之后,将使用下面代码转换为指针,用于后续传入给...UnsafeNativeMethods.WIC.WICBitmapTransformOptions.WICBitmapTransformFlipVertical); // 获取图片的大小...// 创建一个 GDI 对象,对象的大小通过上面的逻辑拿到 // initialize the bitmap header MS.Win32.NativeMethods.BITMAPINFO...bmInfo, 0 /* DIB_RGB_COLORS*/, ref pBitmapBits, null, 0); // 从 WIC 解码器里面拷贝像素内容到

    1K20

    WPF 通过位处理合并图片 读取图片读取图片像素合并两张图片界面

    本文告诉大家,在使用 WPF 合并两张图片的处理,可以使用像素之间的与或和异或的方式,对三个颜色的通道进行处理。 先给大家看一下软件的界面 ?...在 WPF 修改图片颜色 已经告诉大家如何修改 WPF 的图片的颜色,但是为了叠加两张图片,还需要先读取图片的颜色 读取图片 在读取图片之前需要从文件加载图片,先在解决方案放两张图片,然后进行解析 在...WPF 如何需要读取解决方案的图片,可以使用 GetResourceStream 的方法,注意图片放在解决方案需要修改生成方式为资源 ?...,但是需要将资源转换为图片,这里转换为图片的时候因为下面需要读取图片的颜色,需要修改图片的格式为 Bgra32 的格式,这个格式就是使用 32 位的 int 存放一个像素,一个像素里的按照8位也是1个byte...通过上面的方法拿到两个图片的所有像素,然后将像素一一对应,这里我使用的两张图片的像素长度和像素宽度都是相同的,所以直接通过对应的数组下标就可以对应每个像素,如果是像素不相等的图片,具体业务是怎么处理就进行对应的方法

    2.3K20
    领券