【C#/WPF】修改图像的DPI、Resolution

简介: 原文:【C#/WPF】修改图像的DPI、Resolution 问题: WPF中默认使用的图像的DPI是96。如果我们使用的图素的DPI不是96时(比如是72),那么WPF会把图片的DPI自动改为96,导致图像加载出来的实际大小Width和Height会比想要的大(原图显示大小会是实际图大小的72/96 = 3/4),比如图片会在Image控件内显示超框了。
原文: 【C#/WPF】修改图像的DPI、Resolution

问题:
WPF中默认使用的图像的DPI是96。如果我们使用的图素的DPI不是96时(比如是72),那么WPF会把图片的DPI自动改为96,导致图像加载出来的实际大小Width和Height会比想要的大(原图显示大小会是实际图大小的72/96 = 3/4),比如图片会在Image控件内显示超框了。

如何发现问题的:
这个问题是Debug中从Bitmap身上的HorizontalResolution、VerticalResolution属性发现的。(Resolution本应该为72,却变成了96)。Bitmap在转为BitmapImage 时,会导致原图的DPI从72变为96!

思路:想办法将DPI从96修改回设计的72。

WPF的Image控件显示图片时,控件要求的Source赋值类型为ImageSource,该类型及其子类都可以用于给Image控件设置图片,继承关系:

BitmapImage --> BitmapSource --> ImageSource

即使用以上三种的任一类型都可以给Image控件赋值图源。选择根据实际需求,因为还要考虑到类型间的转换。
由于这些类型不通用(BitmapImage 类暂时只看到WPF在用到),现在要改用通用的Bitmap类型。即操作Bitmap类型,最后再转型为BitmapImage (或BitmapSource / ImageSource)给前台Image控件使用。(可以写一个XAML的转换器,或者Controller层转型)。

想通过代码动态修改每张图片的DPI,发现BitmapImage类身上与DPI相关的属性基本上都是只读的。而Bitmap类身上的HorizontalResolution和VerticalResolution属性是只读的,但有一个SetResolution()方法。可以使用该方法修改Resolution了。

还有一种比较另类的方法。BitmapImage身上DecodePixelWidth和DecodePixelHeight可读可写,而且该属性也会影响到图像显示的真实宽高。那么可以在不改变DPI的情况下,改变这两个属性来实现图像的缩放。代码如下:

public static void ModifyBitmapImageDecodePixel(BitmapImage bi, System.Drawing.Bitmap bitmap)
{
    double scale = 72.0 / 96.0; // 因为Bitmap转BitmapImage时,DPI从96变成了72,导致图像变大。
    bi.DecodePixelWidth = (int)(bitmap.Width * scale);
    bi.DecodePixelHeight = (int)(bitmap.Height * scale);
}

小结:修改DPI或Resolution最终都可以修改图像的真实显示大小。

本文仅是记录一下WPF有这么一个默认图像DPI是96的坑。

目录
相关文章
|
2月前
|
数据采集 JavaScript C#
C#图像爬虫实战:从Walmart网站下载图片
C#图像爬虫实战:从Walmart网站下载图片
C# WPF 中 外部图标引入iconfont,无法正常显示问题 【小白记录】
本文介绍了在C# WPF应用程序中引入外部iconfont图标时可能遇到的显示问题及其解决方法:1) 检查资源路径和引入格式是否正确,确保字体文件引用格式为“#xxxx”,并正确指向字体文件位置;2) 确保图标资源被包含在程序集中,通过设置字体文件的生成操作为Resource(资源)来实现。
C# WPF 中 外部图标引入iconfont,无法正常显示问题 【小白记录】
|
2月前
|
编解码 C# 数据库
C# + WPF 音频播放器 界面优雅,体验良好
【9月更文挑战第18天】这是一个用 C# 和 WPF 实现的音频播放器示例,界面简洁美观,功能丰富。设计包括播放/暂停按钮、进度条、音量控制滑块、歌曲列表和专辑封面显示。功能实现涵盖音频播放、进度条控制、音量调节及歌曲列表管理。通过响应式设计、动画效果、快捷键支持和错误处理,提升用户体验。可根据需求扩展更多功能。
120 3
|
3月前
|
C#
C# WPF 将第三方DLL嵌入 exe
C# WPF 将第三方DLL嵌入 exe
78 0
|
3月前
|
前端开发 C# 容器
WPF/C#:实现导航功能
WPF/C#:实现导航功能
70 0
|
3月前
|
设计模式 测试技术 C#
WPF/C#:在WPF中如何实现依赖注入
WPF/C#:在WPF中如何实现依赖注入
71 0
|
3月前
|
前端开发 C# Windows
WPF/C#:如何实现拖拉元素
WPF/C#:如何实现拖拉元素
51 0
|
3月前
|
存储 C# 索引
WPF/C#:BusinessLayerValidation
WPF/C#:BusinessLayerValidation
34 0
|
3月前
|
C#
WPF/C#:数据绑定到方法
WPF/C#:数据绑定到方法
43 0
|
3月前
|
前端开发 测试技术 C#
WPF/C#:在DataGrid中显示选择框
WPF/C#:在DataGrid中显示选择框
60 0