/
GammaCorrection.cpp
65 lines (54 loc) · 1.77 KB
/
GammaCorrection.cpp
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
#include "StdAfx.h"
#include "GammaCorrection.h"
//Ôèëüòð "Ãàììà-êîððåêöèÿ"
//Ïàðàìåòðû:
// hDC DC íàçíà÷åíèÿ
// lW Øèðèíà DC
// lH Âûñîòà DC
// dblGamma Ñòåïåíü ãàììû. Äîïóñòèìûå çíà÷åíèÿ: îò 0.1 äî 1.9
// pRC Óêàçàòåëü íà ñòðóêòóðó RECT, îïðåäåëÿþùóþ îáëàñòü èçîáðàæåíèÿ äëÿ èçìåíåíèÿ
// hWndCallback Îêíî óâåäîìëåíèé î õîäå ðàáîòû (îïöèîíàëüíî)
//Âîçâðàùàåìîå çíà÷åíèå: TRUE â ñëó÷àå óñïåõà, FALSE â ñëó÷àå îøèáêè
BOOL GammaCorrection(HDC hDC, ULONG lW, ULONG lH, double dblGamma, LPRECT pRC, HWND hWndCallback)
{
LPBYTE pPixels = NULL;
ULONG lBytesCnt = 0;
LPBITMAPINFO pBMI = NULL;
ULONG lColor, lR, lG, lB;
LONG i, j;
volatile ONPROGRESSPARAMS ONPP = {};
if (!GetImagePixels(hDC, lW, lH, &pPixels, &lBytesCnt, &pBMI)) {
if (pPixels)
delete[] pPixels;
if (pBMI)
delete pBMI;
return FALSE;
}
for (j = pRC->top; j < pRC->bottom; j++)
{
for (i = pRC->left; i < pRC->right; i++)
{
lColor = GetPixel(pPixels, pBMI, i, j);
lR = R_BGRA(lColor);
lG = G_BGRA(lColor);
lB = B_BGRA(lColor);
lR = (ULONG)CheckBounds((LONG)((255.0 * pow((double)lR / 255.0, 1.0 / dblGamma))
+ 0.5), (LONG)0, (LONG)255);
lG = (ULONG)CheckBounds((LONG)((255.0 * pow((double)lG / 255.0, 1.0 / dblGamma))
+ 0.5), (LONG)0, (LONG)255);
lB = (ULONG)CheckBounds((LONG)((255.0 * pow((double)lB / 255.0, 1.0 / dblGamma))
+ 0.5), (LONG)0, (LONG)255);
SetPixel(pPixels, pBMI, i, j, BGR(lB, lG, lR));
}
if (hWndCallback)
{
ONPP.dwPercents = (DWORD)(((double)j / (double)pRC->bottom) * 100);
SendMessage(hWndCallback, WM_GRAPHICSEVENT, MAKEWPARAM(EVENT_ON_PROGRESS, 0),
(LPARAM)&ONPP);
}
}
SetImagePixels(hDC, lW, lH, pPixels, pBMI);
delete[] pPixels;
delete pBMI;
return TRUE;
}