如何检测图形是否会抖动?

时间:2009-08-12 09:37:15

标签: c# .net winforms graphics

我们的应用程序在缩略图下绘制阴影。它通过创建位图,使用Graphics获取Graphics.FromImage对象,然后使用Graphics.DrawImage覆盖图像来实现此目的。我今天第一次在远程桌面上使用它,它看起来很糟糕,因为阴影正在抖动。我不知道这是在覆盖期间还是在RDP客户端中发生的。有没有办法通过查看图像,图形对象或屏幕设置来确定最终图像是否会抖动,所以我可以省略阴影?

1 个答案:

答案 0 :(得分:1)

您可以使用System.Windows.Forms.SystemInformation.TerminalServerSession变量来检测您是否处于RDP模式并相应地降级。

我不知道如何检测RDP客户端是否进行抖动,或者桌面颜色深度是否与其匹配,但您可以通过GetDeviceCaps函数检测后者:

using System.Runtime.InteropServices;

public class DeviceCaps
{
    private const int PLANES = 14;
    private const int BITSPIXEL = 12;
    [DllImport("gdi32", CharSet = CharSet.Ansi, 
        SetLastError = true, ExactSpelling = true)]
    private static extern int GetDeviceCaps(int hdc, int nIndex);
    [DllImport("user32", CharSet = CharSet.Ansi, 
        SetLastError = true, ExactSpelling = true)]
    private static extern int GetDC(int hWnd);
    [DllImport("user32", CharSet = CharSet.Ansi, 
        SetLastError = true, ExactSpelling = true)]
    private static extern int ReleaseDC(int hWnd, int hdc);
    
    public short ColorDepth()
    {
        int dc = 0;
        try 
        {
            dc = GetDC(0);
            var nPlanes = GetDeviceCaps(dc, PLANES);
            var bitsPerPixel = GetDeviceCaps(dc, BITSPIXEL);
            return nPlanes * bitsPerPixel;                 
        }
        finally
        {
            if (dc != 0)
                ReleaseDC(0, dc);
        }
    }
}

基于颜色深度的渲染优于通过假设用户因RDP而进行推测性降级,但对您来说可能就足够了。