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

原文:【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的坑。

原文地址:https://www.cnblogs.com/lonelyxmas/p/9473443.html

时间: 2024-08-02 10:28:47

【C#/WPF】修改图像的DPI、Resolution的相关文章

wpf 修改控件Background

以TextBox 控件为例 一  Brushes.颜色 textBoxName.Background = Brushes.Blue; 二 背景色值#FFD2D2D2 1 .textBoxName.Background=new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FFD2D2D2")); 2.textBoxName.Background = new SolidColorBrush(Colors.White);

借助Photoshop,Illustrator等设计软件进行WPF图形图像的绘制

原文:借助Photoshop,Illustrator等设计软件进行WPF图形图像的绘制 本文所示例子是借助第三方设计软件,制作复杂的矢量图形,转成与XAML酷似的SVG,再转换成xaml而实现的. 这是原图: 使用Photoshop处理后的二值图片:为何处理成黑白的二值图片呢,是方便使用Illustrator中的自动描路径工具进行图片的轮廊(路径)处理.这是制作后得到的XAML效果图片: 这是XAML代码: <Viewbox Width="343.8" Height="

WPF 修改图片颜色

原文:WPF 修改图片颜色 本文告诉大家如何修改图片的颜色,如去掉图片的蓝色 在 WPF 可以使用很多图片处理的方法,本文告诉大家的是一个图片处理,可以把处理的图片保存在文件. 在阅读本文,我假设大家是熟悉 WPF 的,至少了解 C# ,也知道图片的格式. 在 WPF 可以使用 ARBG 数组表示图片,本文修改图片颜色的方法就是使用 ARBG 数组的方法修改,修改里面的元素的值. 如我需要去掉图片的蓝色,就可以通过修改 ARBG 数组的元素,设置所有蓝色为 0 ,去掉蓝色. 读取图片 首先找到一

5.使用std的迭代器访问并修改图像

void Test_ColorReduceByIterator() { Mat g_srcImage=imread("D:\\OpenCV Projects\\OpenCV_Test_Image\\6.jpg"); Mat g_tmpImage; g_tmpImage=g_srcImage.clone(); Mat_<Vec3b>::iterator it_start=g_tmpImage.begin<Vec3b>(); Mat_<Vec3b>::i

android手动修改density(dpi)的方法

Android系统中会根据屏幕分辨率范围,制定默认的density,既320(xhdpi),那么我们也可以手动修改density. 修改的方式在system.prop中修改ro.sf.lcd_density的值: 例如ro.sf.lcd_density=480: 我们可以使用adb命令查询该属性: adb shell getprop ro.sf.lcd_density

WPF | 修改鼠标停留在Button上时的Style

这里用到属性触发器,当Button的IsMouseOver属性值为True时,我们对其样式进行修改,这里以修改Button背景色为例. 首先是启动后未触发时的效果图: 我一开始想到的就是直接修改其Background属性,代码如下: <Button Height="30" Width="150" BorderBrush="{x:Null}" BorderThickness="0"> <Button.Style

修改图像分辨率

由于项目需要,在android开发过程中切图的使用时必不可少的,目前正在独立开一款App,由于一些切图分辨率的问题,总是频繁的找美工, 其实也不是美工不行,就是切图没有一个标准,使用到项目中不是大了就是小了,砸机子的冲动都有!后来想了想,图都有了,是不是有 什么办法可以修改分辨率不就可以了吗,本人才疏学浅,以前学过一段时间的PS,看到界面设计或者图片处理就反胃的我,表示不适合做设计. 摸索着有没有简单的方法,后来发现windows自带工具可以解决这些问题,写点小记录和大家分享. 当前的图片分辨率

Qt 5.3 下OpenCV 2.4.11 开发(8)查表法直方图修改图像

接着上节内容,本节添加两个方法 stretch() 方法和 applyLookUp() 方法.第一个方法用于拉伸直方图的准备工作,即排除直方图中没有像素值存在的项:第二个方法用查表法拉伸图像.现在贴出完整代码,Histogram1D.h 代码段如下: #ifndef HISTOGRAM1D_H #define HISTOGRAM1D_H #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #

JS学习实践(1) JavaScript 修改图像灯泡

修改灯泡 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body> <script> function changeImage() { element=document.getElementById('myimage') if (eleme