16
2011
04

解决C#加载外部图片时大小变化的问题

关键字:C# BitmapImage 切片 图片变大 图片DPI

        今天在写图片切片功能。思路是利用OpenFileDialog选择一张图片,然后用BitmapImage来存储。根据BitmapImage的大小Width,Height和切片的大小SectionWidth,SectionHeight,计算切片数量,然后利用CroppedBitmap循环切下图片,用FolderBrowserDialog选择位置,利用文件流FileStream和PngBitmapEncoder保存为png格式切片。

        在所有代码完成后,进行调试,经常出现异常,主要的代码在于var croppedBitmap = new CroppedBitmap(m_source, rect);

        我的图片(m_source)是1280*960的,切片大小300*300。而当rect为0,900,300,300时就会异常。从数据上看,的确应该会出现异常,因为我900+300已经大于图片的高度960。但是,我在调试的时候,发现m_source的Height=1280,Width=1706.66,这让我感到奇怪。因为我的思路里,我使用的是BitmapImage的Width,Height属性,所以出现了这个错误。设置断点,查看BitmapImage的所有属性发现它的PixelHeight=960,PixelWidth=1280,这才是和图片大小一样的。果断对逻辑进行修正,果然正常。

        上网查看Height和PixelHeight的区别:

height 返回高度   带单位
posHeight   不带单位的数字
pixelHeight 转换成像素后的数字   不带单位

        但是,这个结果显然不足以给人很大的帮助。通过google搜索的结果,看来若干文章http://msdn.microsoft.com/zh-cn/library/1bttkazd(v=vs.80).aspx后知道这可能是DPI造成的。

        右键我的源图片,选择属性,点击详细信息,终于发现图片的DPI为72,果然是这个问题(如图)。

        所以,在加载外部图片的时候,一定要注意图片的DPI,或者我们直接使用pixelHeight 和pixelWidth属性。

2011.4.16 瀛洲海客(原创)


« 上一篇下一篇 »