ํ์ ํํฐ ๋ฃ๊ธฐ
// 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);
}