问题来源:
使用
graphics.DrawImage(image,0,0);
this.Size = new Size(image.Width , image.Height );//让窗体大小和图片大小一致
结果发现屏幕上显示的图像被拉伸变大了,图像显示不全。
第一张 调试结果,第二张 原图(以下两图在一起时都是上为调试,下为原图)
对比发现窗体大小和原图一致,但是显示却不全。
原因:
原来,DrawImage是与设备相关的函数,也就是,DrawImage会把屏幕的参数带上!!!
所以,它绘制图像的DPI基本都是96。而我们的图片是一般是72DPI的。
例如,假定一个 Image 对象的宽度为 216 像素,而存储的水平分辨率值为 72 点/英寸。因为 216 除以 72 等于 3,所以 DrawImage 将缩放该图像,使其在
96 点/英寸的分辨率下的宽度为 3 英寸。也就是说,DrawImage 将显示一个宽度为 96x3 = 288 像素的图像,图像被拉伸变大。
解决办法:
1:第一种 image.SetResolution(96, 96) ;//设置SetResolution,使其按96 点/英寸(当然有的人的电脑就不是96,一般是你自己更改了)的分辨率显示 这个要写上using System.Drawing;
2:第二种graphics.DrawImage(image, 0, 0, image.Width, image.Height) ;//加上原图的宽度和高度就OK了
第一种和第二种方法的结果如下:图片依旧没显示全,最下面没显示出来
我的问题 用这两种方法依然没有解决(其实解决了,只是我忽略了一个东西,您继续往下look),
起初我依旧认为是图片被拉伸了,为此浪费了很多时间。。。。。。
答案是窗体的size是把他的边框也算进去了,所以我们的窗体的大小不应只是图片的长宽还应该包含边框的宽度。
为此我把窗体的边框去掉,具体操作如下:
调试结果
问题全部都搞清了。
下面给大家分享一下我解决问题时了解到的一些知识。
知识一:如何通过鼠标操作电脑查看自己的DPI并修改(Win7)
控制面板->个性化->左侧窗口显示->“设置自定义文本大小”
自定义DPI设置选项窗口弹出,在缩放为正常大小的百分比之后选择一个满意的缩放选项,正常为100%,如果有视力方面障碍的话可以选择更高的缩放比率;
知识二:如何在visual studio中用C#语言获取本机Dpi
需要写上using System.Win32;
public static float getLogPiex()
{
float returnValue = 96;
try
{
RegistryKey key = Registry.CurrentUser;
RegistryKey pixeKey = key.OpenSubKey("Control Panel\\Desktop");
if (pixeKey != null)
{
var pixels = pixeKey.GetValue("LogPixels");
if (pixels != null)
{
returnValue = float.Parse(pixels.ToString());
}
pixeKey.Close();
}
else
{
pixeKey = key.OpenSubKey("Control Panel\\Desktop\\WindowMetrics");
if (pixeKey != null)
{
var pixels = pixeKey.GetValue("AppliedDPI");
if (pixels != null)
{
returnValue = float.Parse(pixels.ToString());
}
pixeKey.Close();
}
}
}
catch(Exception ex)
{
returnValue = 96;
}
return returnValue;
}
知识三:如何获取图片的dpi
图片文件的属性就可以查看。
代码的话,就是image对象的HorizontalResolution ,VerticalResolution属性
知识四:Visual Studio中如何实现转换图片DPI且图片质量不损(PS也行)
//C#如何实现转换图片DPI且图片质量不损?
if (this.pbMain.Image.VerticalResolution <200||this.pbMain.Image.HorizontalResolution < 200)
{
//System.Drawing.Image img = System.Drawing.Image.FromHbitmap(((Bitmap)this.images[0]).GetHbitmap());
//float x = img.VerticalResolution;
//float y = img.HorizontalResolution;
int width = ((Bitmap)this.images[0]).Width;
int height = ((Bitmap)this.images[0]).Height;
if (height > width)
{
height = 2338;
width = 1653;
}
else if (width > height)
{
height = 1653;
width = 2338;
}
Bitmap bmpSource = new Bitmap(((Bitmap)this.images[0]), width, height);
//Bitmap bmpSource = new Bitmap(((Bitmap)this.images[0]));
int iSourceWidth = bmpSource.Width;
int iSourceHeight = bmpSource.Height;
float fSourceHorResolution = bmpSource.HorizontalResolution;
float fSourceVerResolution = bmpSource.VerticalResolution;
//图象dpi
float fTargetHorResolution = 200;
float fTargetVerResolution = 200;
Bitmap bmpTarget = new Bitmap(width, height);
Graphics g = Graphics.FromImage(bmpTarget);
g.DrawImage(bmpSource, 0, 0, iSourceWidth, iSourceHeight);
bmpTarget.SetResolution(fTargetHorResolution, fTargetVerResolution);
bmpTarget = TiffManager.KiSharpen(bmpTarget, (float)0.7);
bmpTarget = TiffManager.ConvertTo1bbpIndexed(bmpTarget, (float)0.8);
bmpTarget.Save(filename, info, ep);
}