Что нового

Получение LUT видеоадаптера

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Меня мучает один вопрос? Есть такая API функция GetDeviceGammaRamp(), которая позволяет получить текущую гамму... Фактически, мы получаем 3 массива из 256 значений (тип WORD) каждый для цветов R, G и B соответственно. Вот реализация этой функции:

Код:
#Include <Array.au3>
#Include <WinAPIEx.au3>

Dim $Data[256][3]

$hForm = GUICreate('Lookup Table', 256, 256)
$Pic = GUICtrlCreatePic('', 0, 0, 256, 256)

$hDC = _WinAPI_GetDC(0)
$tRamp = DllStructCreate('ushort[768]')
$Ret = DllCall('gdi32.dll', 'int', 'GetDeviceGammaRamp', 'hwnd', $hDC, 'ptr', DllStructGetPtr($tRamp))
$hMemDC = _WinAPI_CreateCompatibleDC($hDC)
$hBitmap = _WinAPI_CreateCompatibleBitmapEx($hDC, 256, 256, 0)
$hSv1 = _WinAPI_SelectObject($hMemDC, $hBitmap)
$hPen = _WinAPI_GetStockObject($DC_PEN)
$hSv2 = _WinAPI_SelectObject($hMemDC, $hPen)
_WinAPI_SetROP2($hMemDC, $R2_XORPEN)
_WinAPI_ReleaseDC(0, $hDC)
$Rgb = 0xFF0000
$Count = 1
For $i = 0 To 2
	_WinAPI_SetDCPenColor($hMemDC, BitShift($Rgb, 8 * $i))
	For $j = 0 To 255
;		$Data[$j][$i] = DllStructGetData($tRamp, 1, $Count) - $j / 255 * 65280 ; Max = 65280 ???
		$Data[$j][$i] = DllStructGetData($tRamp, 1, $Count)
		If $j Then
			_WinAPI_LineTo($hMemDC, $j + 1, Round(255 * (1 - DllStructGetData($tRamp, 1, $Count) / 65280)) - 1)
		Else
			_WinAPI_MoveTo($hMemDC, 0, Round(255 * (1 - DllStructGetData($tRamp, 1, $Count) / 65280)))
		EndIf
		$Count += 1
	Next
Next
_WinAPI_SelectObject($hMemDC, $hSv1)
_WinAPI_SelectObject($hMemDC, $hSv2)
_WinAPI_DeleteObject($hPen)
_WinAPI_DeleteDC($hMemDC)

GUICtrlSendMsg($Pic, 0x0172, 0, $hBitmap)
GUISetState()

_ArrayDisplay($Data)

Do
Until GUIGetMsg() = -3


А вопрос заключается в том, почему максимальное значения равно 65280 вместо 65535 (тип WORD)? А у вас?

Windows 7 x86, NVIDIA GeForce GTX 280
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Yashied [?]
Меня мучает один вопрос?
не знаю. мучает? ;D
Yashied [?]
почему максимальное значения равно 65280 вместо 65535
потому что начинается с нуля? ;D
это как, максимальное число int32 – 2^31 - 1, а не 2^31, только уже в векторном виде. хотя я не имею ни малейшего представления что это за числа и какое у них там ограничение.


Добавлено:
Сообщение автоматически объединено:

кстати, вот тут
Код:
_WinAPI_LineTo($hMemDC, $j + 1, Round(255 * (1 - DllStructGetData($tRamp, 1, $Count) / 65280)) - 1)

ты делишь на 65280, а не на какое-либо еще число
 

VladUs

Скриптер
Сообщения
621
Репутация
181
Ну не знаю ... у меня показывает 65535
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Yashied
У меня тоже максимум 65280:
Видеокарта: ATI MOBILITY RADEON 9000 IGP (128 Мб)
ОС: Windows XP Professional SP3 x86

И здесь 65280:
Видеокарта: ATI Mobility Radeon HD 545v (1024 Мб)
ОС: Windows 7 SP1 x86

И здесь тоже 65280:
Видеокарта: ATI Radeon HD 5700 Series (1024 Мб)
ОС: Windows 7 x64
 

VladUs

Скриптер
Сообщения
621
Репутация
181
Хм... у меня даже значения такого нет... 65280
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
VladUs

А ты монитор колибровал (одна прямая линия или нет)?
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Мда, странно все это... Может у кого-нибудь есть идеи?
 

VladUs

Скриптер
Сообщения
621
Репутация
181
Сравнил на виртуалке и на реальной машине.
На виртуалке 65280
На реальной 65535
Интересны первые значения...

Выкладываю два скрина первоночальных значений массива
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Эти значения представляют собой интенсивность светимости для каждого из 256 оттенков серого R, G и B, т.е., значение 0 соответствует черному цвету, 255 - белому. Видеоадаптер отображает цвета в соответствии с этой таблицей. Нулевое значение соответствует нулевой светимости (черный цвет), а максимальное (65535?) - максимальной (белый цвет). Максимальная яркость для каждого канала будет при максимальном значении в этой таблице. Изменяя эту таблицу, можно компенсировать нелинейность отображения оттенков серого, aka калибровка. Аналогичные действия выполняют аппаратные калибраторы, но мне еще не попадался ни один калибратор (стоимостью не больше $500), который делал бы свое дело лучше ручной (визуальной) настройки. IMHO, наиболее удобная программа для калибровки монитора - CLTest. Для тек, у кого монитор не с TN матрицей, очень советую. Увидите и узнаете много нового.

Например, для моего монитора, кривая (после калибровки) выглядит следующим образом:



Но это практически идеальный вариант (линейность говорит о том, что эти мониторы уже хорошо настроены на заводе). Для более простых мониторов все не так гладко, график скорее всего будет похож на тот, что в предыдущем ответе (первый скриншот).
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
У меня 65280.

 

VladUs

Скриптер
Сообщения
621
Репутация
181
Yashied [?]
Эти значения представляют собой интенсивность светимости для каждого из 256 оттенков
Так почему у меня первое значение не 256 а 260 ?
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
VladUs сказал(а):
Так почему у меня первое значение не 256 а 260 ?
Я не знаю. Наверное поднята яркость... Как выглядит кривая?
 

VladUs

Скриптер
Сообщения
621
Репутация
181
Да нет все по умолчанию. Может это из-за того что у меня видеокарта двухчиповая ?
 
Верх