#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, но для вас этого может быть достаточно.