mfc_photo_filter - 8BitsCoding/RobotMentor GitHub Wiki



ํšŒ์ƒ‰ ํ•„ํ„ฐ ๋„ฃ๊ธฐ

// Dlg.h
CImage m_image;
BITMAP m_bmp_info;
unsigned char * mp_image_pattern;
BOOL CMFCApplication2Dlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// ์ด ๋Œ€ํ™” ์ƒ์ž์˜ ์•„์ด์ฝ˜์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์ฃผ ์ฐฝ์ด ๋Œ€ํ™” ์ƒ์ž๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ์—๋Š”
	//  ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ด ์ž‘์—…์„ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
	SetIcon(m_hIcon, TRUE);			// ํฐ ์•„์ด์ฝ˜์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
	SetIcon(m_hIcon, FALSE);		// ์ž‘์€ ์•„์ด์ฝ˜์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

	// TODO: ์—ฌ๊ธฐ์— ์ถ”๊ฐ€ ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
	m_image.Load(L"me.JPG");
	GetObject((HBITMAP)m_image, sizeof(BITMAP), &m_bmp_info);
	mp_image_pattern = (unsigned char *)m_image.GetBits();
	mp_image_pattern += m_bmp_info.bmWidthBytes - 1;


	return TRUE;  // ํฌ์ปค์Šค๋ฅผ ์ปจํŠธ๋กค์— ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด TRUE๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
}
void CMFCApplication2Dlg::OnPaint()
{
	CPaintDC dc(this); // ๊ทธ๋ฆฌ๊ธฐ๋ฅผ ์œ„ํ•œ ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค.
	if (IsIconic())
	{
        // ...
	}
	else
	{
		dc.SetStretchBltMode(COLORONCOLOR);		// ๊ทธ๋ฆผ์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ์ค„์ผ ๊ฒฝ์šฐ ์ƒ‰ ๊นจ์ง ๋ฐฉ์ง€
		m_image.Draw(dc, 0, 0, m_bmp_info.bmWidth/*/4*/,m_bmp_info.bmHeight/*/4*/);
		//CDialogEx::OnPaint();
	}
}
void CMFCApplication2Dlg::OnBnClickedGrayBtn()
{
	int dot_count = m_bmp_info.bmWidth * m_bmp_info.bmHeight;
	unsigned char * p = mp_image_pattern;
	int temp;
	for (int i = 0; i < dot_count; i++) {
		/*
		*p-- = 0;		// Red
		*p-- = 0;		// Green
		p--;			// Blue ๊ทธ๋Œ€๋กœ
		*/
		temp = (*p + *(p - 1) + *(p - 2))/3;
		*p-- = temp;
		*p-- = temp;
		*p-- = temp;
	}

	Invalidate(FALSE);
}

์ƒ‰์„ ๋ฐ๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ธฐ 1

_inline void IncFixColor(unsigned char * ap_color, int a_value)
{
	int temp = *ap_color + a_value;
	if (temp > 255) *ap_color = 255;
	else *ap_color = temp;
}

void CMFCApplication2Dlg::OnBnClickedFilter1Btn2()
{
	int dot_count = m_bmp_info.bmWidth * m_bmp_info.bmHeight;
	unsigned char * p = mp_image_pattern;
	for (int i = 0; i < dot_count; i++) {
		IncFixColor(p--, 30);
		IncFixColor(p--, 30);
		IncFixColor(p--, 30);
	}

	Invalidate(FALSE);
}

์ƒ‰์„ ๋ฐ๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ธฐ 2

_inline void IncFix2Color(unsigned char * ap_color, float a_rate)
{
	int index;
	if (*ap_color > *(ap_color - 1)) {
		if (*ap_color > *(ap_color - 2))	index = 0;	// R
		else index = 2;		// B
	}
	else {
		if (*(ap_color - 1) > *(ap_color - 2))	index = 1;	// G
		else index = 2;	// B
	}
	if (*(ap_color - index) * a_rate > 255) {	// ๊ฐ€์žฅ ํฐ ์ƒ‰์ƒ * ๋น„์œจ
		a_rate = 255.0f / *(ap_color - index);
	}
	*ap_color-- = (int)(*ap_color * a_rate);
	*ap_color-- = (int)(*ap_color * a_rate);
	*ap_color-- = (int)(*ap_color * a_rate);
}

void CMFCApplication2Dlg::OnBnClickedFilter2Btn3()
{
	int dot_count = m_bmp_info.bmWidth * m_bmp_info.bmHeight;
	unsigned char * p = mp_image_pattern;
	for (int i = 0; i < dot_count; i++) {
		IncFix2Color(p, 1.2f);		// 20% ์ •๋„ ๋ฐ๊ฒŒ ํ•ด๋‹ฌ๋ผ
		p -= 3;
	}

	Invalidate(FALSE);
}

๋ณ€๊ฒฝ์‚ฌํ•ญ ์ €์žฅ/๋ณต์› ๊ธฐ๋Šฅ ์ถ”๊ฐ€

// Dlg.h
CImage m_image, m_commit_image;
BITMAP m_bmp_info;
unsigned char * mp_image_pattern, *mp_commit_pattern;
BOOL CMFCApplication2Dlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// ์ด ๋Œ€ํ™” ์ƒ์ž์˜ ์•„์ด์ฝ˜์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์ฃผ ์ฐฝ์ด ๋Œ€ํ™” ์ƒ์ž๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ์—๋Š”
	//  ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ด ์ž‘์—…์„ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
	SetIcon(m_hIcon, TRUE);			// ํฐ ์•„์ด์ฝ˜์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
	SetIcon(m_hIcon, FALSE);		// ์ž‘์€ ์•„์ด์ฝ˜์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

	// TODO: ์—ฌ๊ธฐ์— ์ถ”๊ฐ€ ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
	m_image.Load(L"me.JPG");
	GetObject((HBITMAP)m_image, sizeof(BITMAP), &m_bmp_info);
	mp_image_pattern = (unsigned char *)m_image.GetBits();
	mp_image_pattern += m_bmp_info.bmWidthBytes - 1;

	m_commit_image.Create(m_bmp_info.bmWidth, m_bmp_info.bmHeight, 24);
	mp_commit_pattern = (unsigned char *)m_commit_image.GetBits();
	mp_commit_pattern += m_bmp_info.bmWidthBytes - 1;

	int image_size = m_bmp_info.bmWidth * m_bmp_info.bmHeight * 3;
	memcpy(mp_commit_pattern - image_size + 3, mp_image_pattern - image_size + 3, image_size );

	return TRUE;  // ํฌ์ปค์Šค๋ฅผ ์ปจํŠธ๋กค์— ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด TRUE๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
}
void CMFCApplication2Dlg::OnBnClickedRestoreBtn()
{
	int image_size = m_bmp_info.bmWidth * m_bmp_info.bmHeight * 3;
	memcpy(mp_image_pattern - image_size + 3,  mp_commit_pattern - image_size + 3, image_size);

	Invalidate(FALSE);
}


void CMFCApplication2Dlg::OnBnClickedCommitBtn()
{
	int image_size = m_bmp_info.bmWidth * m_bmp_info.bmHeight * 3;
	memcpy(mp_commit_pattern - image_size + 3,  mp_image_pattern - image_size + 3, image_size);

	Invalidate(FALSE);
}

ํด๋ฆญ๋œ ์ง€์  ๋ถ€๋ถ„์ ์œผ๋กœ ๋ฐ๊ฒŒํ•˜๊ธฐ

void CMFCApplication2Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	if (point.x < 50) {
		point.x = 50;
	}
	else if (point.x + 50 >= m_bmp_info.bmWidth/*/4*/) {
		point.x = m_bmp_info.bmWidth /*/4*/ - 51;
	}

	if (point.y < 50) {
		point.y = 50;
	}
	else if (point.y + 50 >= m_bmp_info.bmHeight/*/4*/) {
		point.y = m_bmp_info.bmHeight /*/4*/ - 51;
	}

	int pos = -(point.y /*/4*/)*m_bmp_info.bmWidth * 3 - (m_bmp_info.bmWidth - (point.x/*/4*/)) * 3;
	unsigned char * p = mp_image_pattern + pos;	// ์›์˜ ์ค‘์‹ฌ์ 
	unsigned char * p_commit = mp_commit_pattern + pos;

	if(*p == *p_commit)		IncFix2Color(p, 1.2f);

	double radian,x ,y;
	for (int degree = 0; degree < 360; degree++) {
		radian = degree * 3.141592 / 180.0;
		x = sin(radian);
		y = cos(radian);
		for (int radius = 1; radius < 50; radius++) {
			int pos = -(point.y /*/4*/-(int)(y*radius))*m_bmp_info.bmWidth * 3 - 
				(m_bmp_info.bmWidth - (point.x/*/4*/)-(int)(x*radius)) * 3;
			p = mp_image_pattern + pos;
			p_commit = mp_commit_pattern + pos;
			if (*p == *p_commit) IncFix2Color(p, 1.2f);
		}
	}


	CDialogEx::OnLButtonDown(nFlags, point);
}

๋ธ”๋Ÿฌํšจ๊ณผ ์ฃผ๊ธฐ

void CMFCApplication2Dlg::OnBnClickedBlureBtn()
{
	int dot_count = m_bmp_info.bmWidth * m_bmp_info.bmHeight, temp;
	unsigned char *p, *p_temp;
	unsigned int avr_r, avr_g, avr_b;

	for (int y = 1; y < m_bmp_info.bmHeight - 2; y++) {
		p = mp_image_pattern - y * m_bmp_info.bmWidth * 3;
		for (int x = 1; x < m_bmp_info.bmWidth - 2; x++) {
			p_temp = p + m_bmp_info.bmWidth * 3 + 3;
			avr_r = *p_temp + *(p_temp - 3) + *(p_temp-6);
			avr_g = *(p_temp-1) + *(p_temp - 4) + *(p_temp - 7);
			avr_b = *(p_temp-2) + *(p_temp - 5) + *(p_temp - 8);

			p_temp = p + 3;
			avr_r += *p_temp + *(p_temp - 3) + *(p_temp - 6);
			avr_g += *(p_temp - 1) + *(p_temp - 4) + *(p_temp - 7);
			avr_b += *(p_temp - 2) + *(p_temp - 5) + *(p_temp - 8);

			p_temp = p - m_bmp_info.bmWidth * 3 + 3;
			avr_r += *p_temp + *(p_temp - 3) + *(p_temp - 6);
			avr_g += *(p_temp - 1) + *(p_temp - 4) + *(p_temp - 7);
			avr_b += *(p_temp - 2) + *(p_temp - 5) + *(p_temp - 8);

			*p = avr_r / 9;
			*(p - 1) = avr_g / 9;
			*(p - 2) = avr_b / 9;

			p -= 3;
		}
	}

	Invalidate(FALSE);
}