C#DrawImage画出来的Image变大了

在C#中使用Graphics.DrawImage方法绘制图像时,由于DPI不匹配导致图像被拉伸。解决方案包括设置Image的分辨率或指定DrawImage的宽度和高度参数。然而,问题的根本在于窗体大小包含了边框,去除边框后才能正确显示全图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题来源:

使用  

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);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值