Как мне определить, будет ли графика искажена?

#c# #.net #winforms #graphics

#c# #.net #winforms #графика

Вопрос:

Наше приложение рисует тени под эскизами. Это достигается путем создания растрового изображения, получения Graphics объекта с помощью Graphics.FromImage , а затем наложения изображений с помощью Graphics.DrawImage . Сегодня я впервые использую его на удаленном рабочем столе, и это выглядит ужасно, потому что тени искажаются. Я не знаю, происходит ли это во время наложения или в клиенте RDP. Есть ли у меня способ определить, будет ли искажено конечное изображение, либо посмотрев на изображение, графический объект, либо настройки экрана, чтобы я мог опустить тень?

Ответ №1:

вы можете использовать эту Систему.Windows.Формы.Системная информация.Переменная 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, но для вас этого может быть достаточно.