이중포인터배열과 포인터배열 사용하는 방법
글쓴이: shint / 작성시간: 수, 2015/11/11 - 1:47오후
이중포인터배열과 포인터배열 사용하는 방법 ★★★★★
#include <iostream>
#include <math.h>
#include <stdio.h>
#if 0
이 예제소스는 2중 포인터 배열을 사용하는 방법입니다.
비트맵 이미지의 RGB 는 4바이트를 기준으로 사용합니다.
여기서는 3바이트를 기준으로 처리하였으니. 주의하시기 바랍니다.
#endif
#define IDOK 1
class COnBilinearDlg
{
public:
COnBilinearDlg()
{
printf("COnBilinearDlg()\n");
fnInit();
}
~COnBilinearDlg()
{
printf("~COnBilinearDlg()\n");
}
void fnInit()
{
printf("fnInit()\n");
m_BilinearRate = 0.1;
}
int DoModal()
{
printf("DoModal()\n");
return 1;
}
double m_BilinearRate;
};
unsigned char** Image2DMem(int h, int w)
{
int pointer_size = 4;
unsigned char ** p = NULL;
p = (unsigned char**) new unsigned char [h* pointer_size];
int i=0;
for(i=0; i<h; i++)
{
p[i] = (unsigned char*) new unsigned char [w];
}
return p;
}
class CImageProcessing
{
public:
CImageProcessing()
{
printf("CImageProcessing()\n");
fnInit();
}
~CImageProcessing()
{
printf("~CImageProcessing()\n");
}
void fnInit()
{
printf("fnInit()\n");
m_height = 5;
m_width = 10;
m_Re_height = 0;
m_Re_width = 0;
m_Re_size = 0;
m_tempImage = NULL;
m_OutputImage = NULL;
m_InputImage = new unsigned char [m_height*m_width];
//-------------------------
printf("이중 포인터 생성과 초기화\n");
//-------------------------
int i=0;
int j=0;
int cnt=0;
printf("동적 메모리생성에 필요한. 포인터 주소에 크기 4BYTE를 사용한다.\n");
printf("가로 세로 중에 값이 적은쪽으로 생성하면 포인터로 인한. 용량을 줄일 수 있다.\n");
int pointer_size = 4;
m_tempImage = (unsigned char**) new unsigned char [m_height* pointer_size];
for(i=0; i<m_height; i++)
{
m_tempImage[i] = (unsigned char*) new unsigned char [m_width];
}
//-------------------------
printf("2중 포인터에 값 입력\n");
//-------------------------
cnt=0;
for(i=0; i<m_height; i++)
{
for(j=0; j<m_width; j++)
{
m_tempImage[i][j] = cnt;
printf("%d %d %2d\t", i, j, m_tempImage[i][j]);
cnt++;
}
printf("\n");
}
printf("----------------------\n");
//-------------------------
printf("배열에 값 입력\n");
//-------------------------
cnt=0;
for(i=0; i<m_height; i++)
{
for(j=0; j<m_width; j++)
{
m_InputImage[i*m_width+j] = cnt;
printf("%d %d %2d\t", i, j, m_InputImage[i*m_width+j]);
cnt++;
}
printf("\n");
}
printf("----------------------\n");
//-------------------------
printf("2중 포인터에 배열값을 입력\n");
//-------------------------
cnt=0;
for(i=0; i<m_height; i++)
{
for(j=0; j<m_width; j++)
{
m_tempImage[i][j] = m_InputImage[i*m_width+j];
printf("%d %d %2d\t", i, j, m_tempImage[i][j]);
cnt++;
}
printf("\n");
}
printf("----------------------\n");
//-------------------------
printf("테스트 포인터 소멸\n");
//-------------------------
delete m_InputImage;
for(i=0; i<m_height; i++)
{
delete m_tempImage[i];
}
delete m_tempImage;
}
void OnBilinear();
int m_height;
int m_width;
int m_Re_height;
int m_Re_width;
int m_Re_size;
unsigned char ** m_tempImage;
unsigned char * m_OutputImage;
unsigned char * m_InputImage;
};
#if 1
//http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=50&MAEULNO=20&no=960481&ref=960481&page=1
void CImageProcessing::OnBilinear()
{
printf("OnBilinear()\n");
printf("변수 선언\n");
int i, j, point, i_H, i_W;
unsigned char newValue;
double r_H, r_W, s_H, s_W;
double C1, C2, C3, C4;
COnBilinearDlg dlg; //다이얼로그 생성
if(dlg.DoModal() == IDOK) //띄워진 다이얼로그에서 OK 버튼 클릭한 경우
{
printf("초기값 설정\n");
m_Re_height = (int)(m_height * dlg.m_BilinearRate);
m_Re_width = (int)(m_width * dlg.m_BilinearRate);
m_Re_size = m_Re_height * m_Re_width;
m_InputImage = new unsigned char [m_height*m_width];
m_tempImage = (unsigned char**)Image2DMem(m_height, m_width);
m_OutputImage = new unsigned char[m_Re_size];
printf("RGB 값을 입력한다.\n");
for(i=0; i<m_height; i++)
{
for(j=0; j<m_width; j++)
{
m_tempImage[i][j] = m_InputImage[i*m_width+j];
printf("%d %d %2d\t", i, j, m_tempImage[i][j]);
}
printf("\n");
}
printf("\n");
printf("RGB 값을 입력한다.\n");
for(i=0; i<m_width; i++)
{
for(j=0; j<m_height; j++)
{
r_H = (double)i/ (double)dlg.m_BilinearRate; //현재의 비율을 구한다.
r_W = (double)j/(double)dlg.m_BilinearRate; //현재의 비율을 구한다.
i_H = (int)floor(r_H); //소수점 이하값을 버린다.
i_W = (int)floor(r_W); //소수점 이하값을 버린다.
s_H = r_H - (double)i_H; //비율에서의 오차를 제거 한다.
s_W = r_W - (double)i_W; //비율에서의 오차를 제거 한다.
//비율에 크기 범위를 지정한다.
if(i_H<0 || i_H>=(m_height-1) || i_W<0 || i_W>=(m_width-1) )
{
point = i*m_Re_width+j; //배열의 좌표를 구한다.
m_OutputImage[point] = 255; //출력값을 255 어두운값으로 변경한다.
}
else
{
C1 = (double)m_tempImage[i_H][i_W]; //이미지위치에서 색상값을 얻는다.
C2 = (double)m_tempImage[i_H][i_W+1];
C3 = (double)m_tempImage[i_H+1][i_W+1];
C4 = (double)m_tempImage[i_H+1][i_W];
newValue = (unsigned char)(C1 * (1-s_H)*(1-s_W) + C2*s_W*(1-s_H) + C3*s_W*s_H+C4*(1-s_W)*s_H);
point = i*m_Re_width+j;
m_OutputImage[point] = newValue; //보간된 색상값을 입력한다.
}
}
}
printf("RGB 값을 출력한다.\n");
for(i=0; i<m_height; i++)
{
for(j=0; j<m_width; j++)
{
printf("%d %d %2d\t", i, j, m_OutputImage[i*m_width+j]);
}
printf("\n");
}
printf("\n");
//-------------------------
printf("포인터 소멸\n");
//-------------------------
delete m_InputImage;
for(i=0; i<m_height; i++)
{
delete m_tempImage[i];
}
delete m_tempImage;
delete m_OutputImage;
}
}
#endif
int main(int argc, char** argv)
{
CImageProcessing cp;
cp.OnBilinear();
printf("\n");
double d;
double ld;
ld = 10.12345678901234567890;
printf("%.12f\n", ld);
d = floor(10.3);
printf("floor(10.3) %lf\n", d);
d = floor(10.5);
printf("floor(10.5) %lf\n", d);
d = floor(10.8);
printf("floor(10.8) %lf\n", d);
printf("\n");
d = floor(11.3);
printf("floor(11.3) %lf\n", d);
d = floor(11.5);
printf("floor(11.5) %lf\n", d);
d = floor(11.8);
printf("floor(11.8) %lf\n", d);
return 0;
}
#if 0
floor(10.3) 10.000000
floor(10.5) 10.000000
floor(10.8) 10.000000
floor(11.3) 11.000000
floor(11.5) 11.000000
floor(11.8) 11.000000
#endifFile attachments:
| 첨부 | 파일 크기 |
|---|---|
| 385.4 KB |
Forums:


댓글 달기