mfc_Paint_6 - 8BitsCoding/RobotMentor GitHub Wiki
ํน์ ์์ญ์ ์ ํํ๋ฉด ์ ์ฑ์ฐ๊ธฐ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ณ ์ ํ๋ค.
// Dlg.h
// OnBnClickedFillRadio()
m_draw_wnd.SetDrawType(FILL_MODE);
// LBUTTONDOWN
if(m_draw_type == FILL_MODE) {
int w = m_image.GetWidth(), h = m_image.GetHeight();
COLORREF check_color = m_image_dc.GetPixel(point); // ๋ง์ฐ์ค๋ฅผ ํด๋ฆญํ ์ง์ ์ ์์
if(check_color == m_brush_color) return;
m_image_dc.SetPixel(point, m_brush_color);
ChangeColor(check_color, point.x, point.y, w, h);
Invalidate();
} else {
m_is_clicked = 1;
m_prev_point = point;
SetCapture();
}
// ChangeColor(COLORREF a_check_color, int a_x, int a_y, int a_width, int a_height)
{
if(a_y - 1 >= 0) {
if(m_image_dc.GetPixel(a_x, a_y - 1) == a_check_color) {
m_image_dc.GetPixel(a_x, a_y - 1, m_brush_color);
ChangeColor(a_check_color, a_x, a_y - 1, a_width, a_height);
}
}
if(a_x + 1 >= 0) {
if(m_image_dc.GetPixel(a_x + 1, a_y) == a_check_color) {
m_image_dc.GetPixel(a_x + 1, a_y, m_brush_color);
ChangeColor(a_check_color, a_x + 1, a_y, a_width, a_height);
}
}
if(a_y + 1 >= 0) {
if(m_image_dc.GetPixel(a_x, a_y + 1) == a_check_color) {
m_image_dc.GetPixel(a_x, a_y + 1, m_brush_color);
ChangeColor(a_check_color, a_x, a_y + 1, a_width, a_height);
}
}
if(a_x - 1 >= 0) {
if(m_image_dc.GetPixel(a_x - 1, a_y) == a_check_color) {
m_image_dc.GetPixel(a_x - 1, a_y, m_brush_color);
ChangeColor(a_check_color, a_x - 1, a_y, a_width, a_height);
}
}
}
ํ๋ก๊ทธ๋จ์ด ์ฃฝ๋ ํ์์ด ๋ฐ์
์ฌ๊ทํธ์ถ ์ค ์คํ (๋๋ฒ๊ทธ ๋ชจ๋ ์ 1MB) ์ค๋ฒํ๋ก๊ฐ ๋๋ค.
1ํฝ์ ์ 4๋ฐ์ดํธ * 1920 * 1080 FHD๋ผ๋ฉด ... ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๊ณ ์ํด์ผํ๋ค.
์คํ ์ค๋ฒํ๋ก ๋๋ฌธ์ ์ฌ๊ทํธ์ถ๋ง๊ณ ๋ฐ๋ณต๋ฌธ์ ์จ๋ณด์.
// LBUTTONDOWN
if(m_draw_type == FILL_MODE) {
int w = m_image.GetWidth(), h = m_image.GetHeight();
COLORREF check_color = m_image_dc.GetPixel(point); // ๋ง์ฐ์ค๋ฅผ ํด๋ฆญํ ์ง์ ์ ์์
if(check_color == m_brush_color) return;
FillData * p_pixel_data = new FillData[w*h];
memset(p_pixel_data, 0, sizeof(FillData)*w*h);
m_image_dc.SetPixel(point, m_brush_color);
FillData * p, * p_start = p_pixel_data, *p_add = p_pixel_data;
p_add->x = (short)point.x;
p_add->y = (short)point.y;
p_add++;
while(p_start != p_add) {
p = p_start;
while(p < p_add) {
if(p->is_completed == 0) {
if(p->y - 1 >= 0) {
if(m_image_dc.GetPixel(p->x, p->y - 1) == check_color) {
m_image_dc.GetPixel(p->x, p->y - 1, m_brush_color);
p_add->x = p->x;
p_add->y = p->y - 1;
p_add++;
}
}
if(p->x + 1 >= 0) {
if(m_image_dc.GetPixel(p->x + 1, p->y) == check_color) {
m_image_dc.GetPixel(p->x + 1, p->y, m_brush_color);
p_add->x = p->x + 1;
p_add->y = p->y;
p_add++;
}
}
if(p->y + 1 >= 0) {
if(m_image_dc.GetPixel(p->x, p->y + 1) == check_color) {
m_image_dc.GetPixel(p->x, p->y + 1, m_brush_color);
p_add->x = p->x;
p_add->y = p->y + 1;
p_add++;
}
}
if(p->x - 1 >= 0) {
if(m_image_dc.GetPixel(p->x - 1, p->y) == a_check_color) {
m_image_dc.GetPixel(p->x - 1, p->y, m_brush_color);
p_add->x = p->x - 1;
p_add->y = p->y;
p_add++;
}
}
p->is_completed = 1;
}
p++;
}
while(p_start < p_add) {
if(p_start->is_completed == 0) break;
p_start++;
}
}
// ChangeColor(check_color, point.x, point.y, w, h);
delete[] p_pixel_data;
Invalidate();
} else {
m_is_clicked = 1;
m_prev_point = point;
SetCapture();
}
struct FillData
{
char is_completed;
short x, y;
};
๋จ์ ์ ์๋๊ฐ ๋งค์ฐ ๋๋ฆฌ๋ค...
์๋๋ฅผ ๊ฐ์ ํด๋ณด์.
// LBUTTONDOWN
if(m_draw_type == FILL_MODE) {
int w = m_image.GetWidth(), h = m_image.GetHeight();
BITMAP bmp_info;
GetObject((HBITMAP)m_image, sizeof(BITMAP), &bmp_info);
unsigned int * p_image = (unsigned int *)m_image.GetBits(), *p_check;
p_image += bmp_info.bwWidthBytes / 4 - 1;
// ๊ฐ์ฅ ๋ง์ง๋ง ์ ์ผ๋ก ์ด๋
unsigned int check_color = *(p_image - point.y * w - (w - point.x - 1));
// ์ ๋จ์๋ก ์์ ์ป๋๋ค.
unsigned int new_color = ((m_brush_color << 16) & 0x00FF0000) | (m_brush_color & 0x0000FF00) | (m_brush_color >> 16 & 0x000000FF);
// Red์ Blue์ ์์์ ๋ณ๊ฒฝ
// RGB ์นผ๋ฌ์ CImage ์ปฌ๋ฌ๋ฅผ ๋ง์ถ๋ ๊ณผ์
// ๊ทธ๋ฆผ์ ์ฝ์ผ๋ฉด ํฌ๋ช
๋๊ฐ 0xFF
// Create ํจ์๋ก ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๋ฉด ํฌ๋ช
๋๊ฐ 0x00
new_color = new_color | (check_color & 0xFF000000);
*(p_image - point.y * w - (w - point.x - 1)) = new_color;
if(check_color == new_color) return;
// COLORREF check_color = m_image_dc.GetPixel(point); // ๋ง์ฐ์ค๋ฅผ ํด๋ฆญํ ์ง์ ์ ์์
// if(check_color == m_brush_color) return;
FillData * p_pixel_data = new FillData[w*h];
memset(p_pixel_data, 0, sizeof(FillData)*w*h);
m_image_dc.SetPixel(point, m_brush_color);
FillData * p, * p_start = p_pixel_data, *p_add = p_pixel_data;
p_add->x = (short)point.x;
p_add->y = (short)point.y;
p_add++;
while(p_start != p_add) {
p = p_start;
while(p < p_add) {
if(p->is_completed == 0) {
p_check - p_image - p->y * w - (w - p->x - 1);
if(p->y - 1 >= 0) {
if(*(p_check + w) == check_color) {
*(p_check + w) = new_color;
p_add->x = p->x;
p_add->y = p->y - 1;
p_add++;
}
}
if(p->x + 1 >= 0) {
if(*(p_check - 1) == check_color) {
*(p_check - 1) = new_color;
p_add->x = p->x + 1;
p_add->y = p->y;
p_add++;
}
}
if(p->y + 1 >= 0) {
if(*(p_check - w) == check_color) {
*(p_check + w) = new_color;
p_add->x = p->x;
p_add->y = p->y + 1;
p_add++;
}
}
if(p->x + 1 >= 0) {
if(*(p_check - 1) == check_color) {
*(p_check - 1) = new_color;
p_add->x = p->x - 1;
p_add->y = p->y;
p_add++;
}
}
p->is_completed = 1;
}
p++;
}
while(p_start < p_add) {
if(p_start->is_completed == 0) break;
p_start++;
}
}
// ChangeColor(check_color, point.x, point.y, w, h);
delete[] p_pixel_data;
Invalidate();
} else {
m_is_clicked = 1;
m_prev_point = point;
SetCapture();
}
ํฝ์ ์ ์ง์ ์ ์ดํจ์ผ๋ก์ ์๋๋ฅผ ํ์คํ๊ฒ ๊ฐ์ ํ ์ ์๋ค.