purebasic.info

PureBasic forum
Текущее время: Ср янв 22, 2020 9:01 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Яркость экрана (гамма)
СообщениеДобавлено: Вт янв 07, 2020 12:41 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2328
Откуда: Russia — Belarus
Благодарил (а): 7 раз.
Поблагодарили: 75 раз.
Пункты репутации: 11
Есть такая старая программа, Gamma Panel:
Изображение

Так вот, хотелось бы научиться через PB (WinAPI) менять "гамму" экрана (верхний ползунок) точно так же, как делает эта программа.
Есть вот такой код (в самом низу страницы), но он меняет нечто иное, не так, как эта программа, всё как бы пересвечено.

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Яркость экрана (гамма)
СообщениеДобавлено: Вт янв 07, 2020 3:26 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пт янв 27, 2012 7:12 pm
Сообщений: 886
Откуда: Кустанай
Благодарил (а): 27 раз.
Поблагодарили: 13 раз.
Пункты репутации: 7
https://www.youtube.com/watch?v=MgN4r1YufcI&feature=emb_title
Не совсем то но тоже интересно


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Яркость экрана (гамма)
СообщениеДобавлено: Вт янв 07, 2020 4:28 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6581
Благодарил (а): 32 раз.
Поблагодарили: 222 раз.
Пункты репутации: 59
АПИ искать по SetDeviceGammaRamp

Для Пурика найдется такой код:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Procedure.s ShowAPIError(CustomError=#False, ErrorCode=0)
  Protected Buffer.s
  Protected NumberOfChars
 
  If Not CustomError
    ErrorCode=GetLastError_()
  EndIf
 
  Buffer.s=Space(4096)
  NumberOfChars=FormatMessage_(#FORMAT_MESSAGE_FROM_SYSTEM,0,ErrorCode,0,Buffer.s,Len(Buffer.s),0)
 
  ProcedureReturn Left(Buffer.s,NumberOfChars-2)
EndProcedure
 
Dim MyGammaRamp.w(2,255)
 
Debug GetDeviceGammaRamp_(GetDC_(0),@MyGammaRamp())
 
value = 64
 
Dim iGammaRamp.w(2,255)
 
For i = 0 To 255
 iArrayValue = i * (value + 128)
 
 If iArrayValue > 65535
    iArrayValue  = 65535
 EndIf
 
 iGammaRamp(0,i) = iArrayValue
 iGammaRamp(1,i) = iArrayValue
 iGammaRamp(2,i) = iArrayValue  
 
Next
 
Debug SetDeviceGammaRamp_(GetDC_(0),@iGammaRamp())
 
Delay(8000)
 
Debug SetDeviceGammaRamp_(GetDC_(0),@MyGammaRamp())
 
Debug ShowAPIError()
 
Repeat
  Delay(1)
ForEver
 
 


_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Яркость экрана (гамма)
СообщениеДобавлено: Вт янв 07, 2020 4:39 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6581
Благодарил (а): 32 раз.
Поблагодарили: 222 раз.
Пункты репутации: 59
Вот ещё наглядный примерчик корректировки гаммы
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
Global DISPLAY_GAMMA.d, USER_GAMMA.d, result
#STANDARD_GAMMA = 2.2 ; DE-FACTO STANDARD
USER_GAMMA = #STANDARD_GAMMA
Global Dim iGammaRamp.w(3,255)
 
Procedure SetDisplayGamma()
 
DISPLAY_GAMMA.d = USER_GAMMA / #STANDARD_GAMMA
 
; If DISPLAY_GAMMA < 0.9 Or DISPLAY_GAMMA > 1.1
;   MessageRequester("Error", "Display gamma must be not less than 0.9 and not more than 1.1.")
;   End
; EndIf
 
DISPLAY_GAMMA.d = 1/DISPLAY_GAMMA
For ct = 0 To 255
  iValue.d =  (Pow(ct, DISPLAY_GAMMA) * 257)
If iValue > 65535: iValue = 65535: EndIf
iGammaRamp(0,ct) = iValue
iGammaRamp(1,ct) = iGammaRamp(0,ct)
iGammaRamp(2,ct) = iGammaRamp(0,ct)
;GIVE R G AND B CHANNELS THE SAME GAMMA VALUE
Next
 
;REWRITE THE GAMMA TABLE
result = SetDeviceGammaRamp_(GetDC_(0),@iGammaRamp())
EndProcedure
 
Procedure DrawWindow()
SetDisplayGamma()
StartDrawing(WindowOutput(1))
For ct = 0 To 10
  Box((ct * 74)+25, 250, 75, 100, RGB(ct * 25, ct*25,ct*25))
Next
 
DrawText(160, 100, "Gamma = " + StrD(1/DISPLAY_GAMMA * #STANDARD_GAMMA, 2),#White)
; If result = #True
; DrawText(50, 100, "Success",#White)
; EndIf
StopDrawing()
EndProcedure
 
OpenWindow(1, 0, 0, 930, 500, "Gamma", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
TrackBarGadget(1, 50, 145, 300, 20, 199, 242)
SetGadgetState(1, 220)
 
DrawWindow()
 
Repeat
  event = WaitWindowEvent()
 
  If event = #PB_Event_CloseWindow:
   
    If USER_GAMMA <> 2.2
    message = MessageRequester("Restore gamma?", "Restore gamma to default (2.2)?", #PB_MessageRequester_YesNo)
   
    If message = #PB_MessageRequester_Yes: USER_GAMMA = 2.2: DrawWindow(): End: ;EndIf
  Else
    End
  EndIf
Else
  End
EndIf
 
ElseIf event = #PB_Event_Gadget
    Select EventGadget()
      Case 1
        USER_GAMMA = GetGadgetState(1) / 100
        DrawWindow()
 
  EndSelect  
   
  ElseIf event = #PB_Event_Repaint: DrawWindow()
   
  EndIf
ForEver


_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Яркость экрана (гамма)
СообщениеДобавлено: Вт янв 07, 2020 5:14 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2328
Откуда: Russia — Belarus
Благодарил (а): 7 раз.
Поблагодарили: 75 раз.
Пункты репутации: 11
Я видел эти примеры (первый), это не как Gamma в Gamma Panel, эти примеры слишком сильно высветляют светлые части.

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Яркость экрана (гамма)
СообщениеДобавлено: Вт янв 07, 2020 5:58 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11569
Благодарил (а): 4 раз.
Поблагодарили: 478 раз.
kvitaliy писал(а):
Для Пурика найдется такой код
На него ссылка в первом сообщении.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Яркость экрана (гамма)
СообщениеДобавлено: Вт янв 07, 2020 6:16 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6581
Благодарил (а): 32 раз.
Поблагодарили: 222 раз.
Пункты репутации: 59
qpAHToMAS писал(а):
это не как Gamma в Gamma Panel, эти примеры слишком сильно высветляют светлые части.

Понятно, что это не клон программы Gamma Panel. Ты просил API, и это именно то, что использует программа Gamma Panel, реверс не врёт:
Изображение
А уж какие параметры подобрать? чтобы не высветляло, и как использовать эту API - тебе решать.

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Яркость экрана (гамма)
СообщениеДобавлено: Пн янв 13, 2020 3:22 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2328
Откуда: Russia — Belarus
Благодарил (а): 7 раз.
Поблагодарили: 75 раз.
Пункты репутации: 11
kvitaliy писал(а):
qpAHToMAS писал(а):
это не как Gamma в Gamma Panel, эти примеры слишком сильно высветляют светлые части.

Понятно, что это не клон программы Gamma Panel. Ты просил API, и это именно то, что использует программа Gamma Panel, реверс не врёт:
Изображение
А уж какие параметры подобрать? чтобы не высветляло, и как использовать эту API - тебе решать.

Понял.

Тогда может быть у кого есть мысли, как в коде сформировать график гаммы как на первом скриншоте?
Как я понял, у нас есть такой массив:
Код:
1
Dim iGammaRamp.w(2,255)


Т.е. три массива (RGB?) по 256. Как понять вот эту магию:
Код:
1
iArrayValue = i * (value + 128)


Зачем умножать и плюсовать 128?

В целом я думаю, что график по X (иксу) это массив от 1 до 256, а высота его (Y) это яркость освещения, т.е. высота кривой графика, но непонятны лимиты этой кривой, хотя вроде понятен (максимум 65535, из кода).

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Яркость экрана (гамма)
СообщениеДобавлено: Пн янв 13, 2020 4:13 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6581
Благодарил (а): 32 раз.
Поблагодарили: 222 раз.
Пункты репутации: 59
Я сейчас уже не помню, как там точно и что, но вроде как на Делфях был в интернетах код понятный, может и на других языках есть что.

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB