Что нового

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Меня мучает один вопрос? Есть такая 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
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
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,716
VladUs

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
VladUs сказал(а):
Вот этот вопрос не понял...

На графике.

lut1.png


lut2.png
 
Автор
Yashied

Yashied

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

VladUs

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

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

Yashied

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

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

lut-apple.png


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

CreatoR

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

 
Автор
Yashied

Yashied

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

Я не знаю. Наверное поднята яркость... Как выглядит кривая?
 

VladUs

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