none
Bitmap类的SetResolution方法究竟会不会改变位图的实际尺寸?

    问题

  • 我在使用VB.NET开发一个软件,.NET Framework的版本是4.0。

    .NET类库的说明文档中,对Bitmap类(System.Drawing.Bitmap类)的SetResolution方法(可以改变DPI)有这句说明:“Changing the resolution of the image does not change its physical size.”

    这让我感到困惑。这里的“physical size”是指位图的实际尺寸(以英寸为单位)呢,还是指位图的像素尺寸(以像素个数为单位)呢?如果是指实际尺寸,那怎么会不变呢?我试验过,用SetResolution方法改变DPI后,位图的像素尺寸没有变,而实际尺寸等于像素尺寸除以DPI,那么,实际尺寸肯定会变呀。

    比如,对于以下代码:

    Dim bmp As Bitmap
    bmp = New Bitmap(500, 500)
    bmp.SetResolution(50, 50)
    MsgBox("Pixels : " & CStr(bmp.Width) & "x" & CStr(bmp.Height))
    bmp.SetResolution(100, 100)
    MsgBox("Pixels : " & CStr(bmp.Width) & "x" & CStr(bmp.Height))

    执行结果是,两个对话框都显示500x500,这说明位图的像素尺寸没有变。但DPI变了,那么,实际尺寸肯定要变呀。

    难道文档里的“physical size”指的就是像素尺寸?但从字面上讲,它的意思是“物理尺寸”,所以,看起来,它应该是指实际尺寸呀。


    • 已编辑 zdprogrammer 2017年3月4日 10:40 修正了实际尺寸、像素尺寸和DPI之间的关系的错误
    2017年3月4日 10:15

全部回复

  • Hi,

    感谢在MSDN论坛发帖。

    像素和实际物理尺寸是没固定的关系的。

    像素的大小是依赖屏幕显示器和显示屏的像素决定的,所以说图片的物理尺寸不会随着DPI的改变而改变。

    但是为什么会有DPI呢?

    因为我们要显示字体在屏幕上面,这个问题肯定要被解决。

    所以就出现了逻辑单位. 72point 被定义成一个逻辑英寸高端,然后这个逻辑英寸被转换成像素。

    很多年以前,微软就提出 一个逻辑英寸单位等于96像素,72point 就等于96像素。

    下面就是换算公式

    12 points = 12/72 logical inch = 1/6 logical inch = 96/6 pixels = 16 pixels。

    This scaling factor is described as 96 dots per inch (DPI).

    96就是默认的DPI值。

    如果设置DPI等于144. 72 point 就是144.

    关于什么是point 单位,你可以看这个文档。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年3月7日 9:33
    版主
  • 不对吧?

    根据微软的文档,Bitmap类的Width和Height属性都是以像素,而不是你所说的point,为单位的。根据我的试验,在调用SetResolution方法后Width和Height属性的值都没有变。那么,实际物理尺寸怎么会不变呢?

    我想,DPI、实际物理尺寸(这里指长度而非面积,单位为英寸),和像素数满足如下的关系:

    像素数 = DPI * 实际物理尺寸

    因为,DPI是每1英寸的像素数,实际物理尺寸是以英寸为单位的长度,因此,DPI乘实际物理尺寸等于像素数,因此,像素数等于DPI乘实际物理尺寸。

    对吧?

    如果对的话,那么,当DPI不为零时,有:

    实际物理尺寸 = 像素数 / DPI

    对吧?

    如果对的话,那么:

    假如调用SetResolution方法前,Width的值为500,那么,水平方向的像素数就是500,对吧?再假设这时的水平方向的DPI为50,那么,这时,实际物理尺寸就是10英寸。

    假如调用SetResolution方法后,水平方向的DPI为100,而Width的值还是500,那么,水平方向的像素数就是500,那么,这时的实际物理尺寸就是5英寸。

    实际物理尺寸怎么会不变呢?

    2017年3月21日 12:48
  • Hi,

    我们显示器是有固定的物理尺寸,还有显示器的分辨率,分辨率是可以改变的,这个改变我认为是和DPI有关系。

    我们的图片,他是有固定的像素大小,我们是没有办法改变,当然可以通过PS工具修改。 当一个图片被显示在显示器上面。图片会根据显示器的分辨率进行显示,这个屏幕的分辨率是不会改变图片的实际物理尺寸。

    所以实际物理尺寸是不会改变。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年3月23日 8:43
    版主