Skip to content

Instantly share code, notes, and snippets.

@yakreved
Last active December 27, 2015 10:29
Show Gist options
  • Save yakreved/7311999 to your computer and use it in GitHub Desktop.
Save yakreved/7311999 to your computer and use it in GitHub Desktop.
kg4 ВЧ-фильтрация c++ win32
// kg4.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "kg4.h"
#define MAX_LOADSTRING 100
// Global Variables:
HINSTANCE hInst; // current instance
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name
// Forward declarations of functions included in this code module:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
void func1(HDC hdc);
COLORREF** getNeighbours(HDC hdc, int x, int y);
COLORREF brightness(COLORREF source, float k);
COLORREF** multmatr(int matr[3][3], COLORREF** matr2);
COLORREF avr( COLORREF** matr);
int matr1[3][3] = {{0,-1,0},
{-1,5,-1},
{0,-1,0}};
int matr2[3][3] = {{-1,-1,-1},
{-1,9,-1},
{-1,-1,-1}};
int matr3[3][3] = { { 1, -2, 1 },
{ -2, 5, -2 },
{ 1, -2, 1 } };
int matr4[3][3] = { { 0, -1, 0 },
{ -1, 4, -1 },
{ 1, -2, 1 } };
int matr5[3][3] = { { -1, -1, -1 },
{ -1, 8, -1 },
{ 0, -1, 0 } };
int matr6[3][3] = { { 1, -2, 1 },
{ -2, 4, -2 },
{ -1, -1, -1 } };
int matr7[3][3] = { { 1, -2, 1 },
{ -2, 3, -2 },
{ 1, -2, 1 } };
COLORREF tmp[3][3] = {{0,0,0},
{0,0,0},
{0,0,0}};
void func2(HDC hdc, int matr[3][3], int XX = 0, int YY = 0)
{
for (int x = XX; x< XX + 300; x++)
for (int y = YY; y<YY + 225; y++)
{
COLORREF color = GetPixel(hdc, x + 300, y);
COLORREF **neighbours = getNeighbours(hdc, x + 300, y);
SetPixel(hdc, x, y, avr(multmatr(matr, neighbours)));
//SetPixel(hdc,x,y, (-neighbours[0][1] - neighbours[1][0] - neighbours[2][1] - neighbours[1][2] + 5* neighbours[1][1])/5);
}
}
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// TODO: Place code here.
MSG msg;
HACCEL hAccelTable;
// Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_KG4, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_KG4));
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
//
// FUNCTION: MyRegisterClass()
//
// PURPOSE: Registers the window class.
//
// COMMENTS:
//
// This function and its usage are only necessary if you want this code
// to be compatible with Win32 systems prior to the 'RegisterClassEx'
// function that was added to Windows 95. It is important to call this function
// so that the application will get 'well formed' small icons associated
// with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_KG4));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_KG4);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassEx(&wcex);
}
//
// FUNCTION: InitInstance(HINSTANCE, int)
//
// PURPOSE: Saves instance handle and creates main window
//
// COMMENTS:
//
// In this function, we save the instance handle in a global variable and
// create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // Store instance handle in our global variable
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//
// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// PURPOSE: Processes messages for the main window.
//
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
HBITMAP bmw;
bmw=(HBITMAP) LoadImage(NULL, L"Penguins2.bmp", IMAGE_BITMAP,0,0, LR_LOADFROMFILE);
if ( NULL == bmw )
{
MessageBox(0, L"Window Handler Failed!", L"Error!", MB_ICONSTOP | MB_OK);
}
HDC memdc;
memdc=CreateCompatibleDC(hdc);
SelectObject(memdc,bmw);
HBITMAP bmw1;//pinguin original
bmw1=(HBITMAP) LoadImage(NULL, L"Penguins2.bmp", IMAGE_BITMAP,0,0, LR_LOADFROMFILE);
if ( NULL == bmw )
{
MessageBox(0, L"Window Handler Failed!", L"Error!", MB_ICONSTOP | MB_OK);
}
HDC memdc1;
memdc1=CreateCompatibleDC(hdc);
SelectObject(memdc1,bmw1);
BitBlt(hdc, 300, 0, 300, 225, memdc1, 0 , 0, SRCCOPY);
BitBlt(hdc, 0, 0, 300, 225, memdc, 0, 0, SRCCOPY);
//func1(hdc);
func2(hdc,matr7);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// Message handler for about box.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
void func1(HDC hdc)
{
for(int x =0; x< 300;x++)
for(int y =0;y<225;y++)
{
float k = 50;
COLORREF color = GetPixel(hdc, x, y);
/*BYTE red = GetRValue(color);
BYTE green = GetGValue(color);
BYTE blue = GetBValue(color);
color = RGB( ((int)((int)red +k<255?(int)red +k:255)),
((int)((int)green +k<255?(int)green +k:255)),
((int)((int)blue +k<255?(int)blue +k:255)));*/
SetPixel(hdc, x, y, brightness(color,k));
}
}
COLORREF brightness(COLORREF source, float k)
{
BYTE red = GetRValue(source);
BYTE green = GetGValue(source);
BYTE blue = GetBValue(source);
return RGB(((int)((int)red +k<255?(int)red +k:255)),
((int)((int)green +k<255?(int)green +k:255)),
((int)((int)blue +k<255?(int)blue +k:255)));
}
COLORREF** getNeighbours(HDC hdc, int x, int y)
{
COLORREF **res= new COLORREF *[3]();
for (int i = 0; i < 3; i++)
res[i] = new COLORREF [3];
for(int i=0;i<3;i++)
for(int j = 0; j<3; j++)
{
if(x+i<0 || y+j<0 || y+j>224 || x+i>299) res[i][j] = GetPixel(hdc, x, y);;
res[i][j] = GetPixel(hdc, x+i, y+j);
}
return res;
}
COLORREF** multmatr(int matr[3][3], COLORREF** matr2)
{
COLORREF **res = new COLORREF *[3]();
for (int i = 0; i < 3; i++)
res[i] = new COLORREF [3];
for(int i=0;i<3;i++)
for(int j = 0; j<3; j++)
//res[i][j] = matr[i][j] * matr2[i][j]; GetRValue(color)
res[i][j] = RGB(matr[i][j] * GetRValue(matr2[i][j]), matr[i][j] * GetGValue(matr2[i][j]), matr[i][j] * GetBValue(matr2[i][j]));
return res;
}
COLORREF avr( COLORREF** matr)
{
int sumR = 0;
int sumG = 0;
int sumB = 0;
for(int i=0;i<3;i++)
for (int j = 0; j < 3; j++)
{
sumR = sumR + GetRValue(matr[i][j]);
sumG = sumG + GetGValue(matr[i][j]);
sumB = sumB + GetBValue(matr[i][j]);
}
sumR = sumR / 9;
sumG = sumG / 9;
sumB = sumB / 9;
return RGB(sumR, sumG, sumB);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment