none
GDI+中Bitmap保存图形文件时,如何保存分辨率信息? RRS feed

  • 问题

  • 我觉得总是有些地方不太妥。

    使用Bitmap内存位图,通过Bitmap.SetResolution(x,y)后,然后Bitmap.Save(string filename,ImageType format)保存位图到磁盘文件。

    这样修改分辨率后,通过GDI+再次读取这个文件时,读取的分辨率是对的,示例

    Bitmap bmp=(Bitmap)Bitmap.FromFile(@"D:\123.png")

    float xResolution=bmp.HorizontalResolution,这样的话,读取出来的分辨率固然对。

    问题所在:

    这个套路保存的位图文件,在文件夹中查看图片文件属性时,看不见分辨率的信息;通过windows画板打开图片文件,查看属性,属性上dpi却是96.

    我觉得Bitmap.SetResolution(300,300)后,通过windows画板查看dpi,应该也是300吧。

    请问我哪里理解错了?

    问题2:

    graphics的drawImage(image,point)和drawImageUnscale(image,point)两个函数有么子区别,看msdn文档都是说以图形原始物理大小绘制啊

    2014年5月20日 7:40

答案

  • 你好:

    请问你的系统是什么?我在Win8.1 X64上通过VS2013 Ultimate执行以下代码:

    using (Bitmap bitmap = new Bitmap(100, 100))
                {
                    using (Graphics g = Graphics.FromImage(bitmap))
                    {
                        g.DrawString("HelloWorld", new Font("times", 30),Brushes.Red,new PointF(0,0));
                    }
                    bitmap.SetResolution(300, 300);
                    bitmap.Save("D:\\test.jpg", ImageFormat.Jpeg);
                }

    画出来的图片无论是在文件属性还是在MS Paint画板中查看都是300dpi:

    MS Paint在创建新图片的时候默认的dpi确实是96. 我觉得有可能是你看到的是你屏幕的dpi而不是图像实际的dpi,你可以使用一些专业的图像处理工具比如PhotoShop来查看一下是否也是相同结果。

    Update:

    刚查询了一下,发现在Windows 画板中除去JPEG格式的图像其他都显示DPI有问题,有说法是Windows画板并不是可靠的图片处理工具,它会错误的显示其他格式的图片分辨率。所以我还是建议你使用PhotoShop等专业一点的图像处理工具查看。参考:Bitmap resolution

    另外关于DrawImage和DrawImageUnscaled这两个方法,如果你看一下他们的源代码的话就会发现其实他们没什么区别,可能是由于一些特殊的原因才分成两个方法。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.




    2014年5月21日 3:12
    版主

全部回复

  • 你好:

    请问你的系统是什么?我在Win8.1 X64上通过VS2013 Ultimate执行以下代码:

    using (Bitmap bitmap = new Bitmap(100, 100))
                {
                    using (Graphics g = Graphics.FromImage(bitmap))
                    {
                        g.DrawString("HelloWorld", new Font("times", 30),Brushes.Red,new PointF(0,0));
                    }
                    bitmap.SetResolution(300, 300);
                    bitmap.Save("D:\\test.jpg", ImageFormat.Jpeg);
                }

    画出来的图片无论是在文件属性还是在MS Paint画板中查看都是300dpi:

    MS Paint在创建新图片的时候默认的dpi确实是96. 我觉得有可能是你看到的是你屏幕的dpi而不是图像实际的dpi,你可以使用一些专业的图像处理工具比如PhotoShop来查看一下是否也是相同结果。

    Update:

    刚查询了一下,发现在Windows 画板中除去JPEG格式的图像其他都显示DPI有问题,有说法是Windows画板并不是可靠的图片处理工具,它会错误的显示其他格式的图片分辨率。所以我还是建议你使用PhotoShop等专业一点的图像处理工具查看。参考:Bitmap resolution

    另外关于DrawImage和DrawImageUnscaled这两个方法,如果你看一下他们的源代码的话就会发现其实他们没什么区别,可能是由于一些特殊的原因才分成两个方法。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.




    2014年5月21日 3:12
    版主
  • 你好:

    请问你的系统是什么?我在Win8.1 X64上通过VS2013 Ultimate执行以下代码:

    using (Bitmap bitmap = new Bitmap(100, 100))
                {
                    using (Graphics g = Graphics.FromImage(bitmap))
                    {
                        g.DrawString("HelloWorld", new Font("times", 30),Brushes.Red,new PointF(0,0));
                    }
                    bitmap.SetResolution(300, 300);
                    bitmap.Save("D:\\test.jpg", ImageFormat.Jpeg);
                }

    画出来的图片无论是在文件属性还是在MS Paint画板中查看都是300dpi:

    MS Paint在创建新图片的时候默认的dpi确实是96. 我觉得有可能是你看到的是你屏幕的dpi而不是图像实际的dpi,你可以使用一些专业的图像处理工具比如PhotoShop来查看一下是否也是相同结果。

    Update:

    刚查询了一下,发现在Windows 画板中除去JPEG格式的图像其他都显示DPI有问题,有说法是Windows画板并不是可靠的图片处理工具,它会错误的显示其他格式的图片分辨率。所以我还是建议你使用PhotoShop等专业一点的图像处理工具查看。参考:Bitmap resolution

    另外关于DrawImage和DrawImageUnscaled这两个方法,如果你看一下他们的源代码的话就会发现其实他们没什么区别,可能是由于一些特殊的原因才分成两个方法。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.




    谢谢你,解了我的心头疑惑。

    我用的windows7 x86系统。昨天也刚发现,保存的图像在photoshop里看dpi,是正确的,在mspaint里看dpi,是显示成96.一直都没有想清什么原因,原来是mspaint本身的问题。

    2014年5月21日 23:09