이중포인터배열과 포인터배열 사용하는 방법
글쓴이: 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 #endif
File attachments:
첨부 | 파일 크기 |
---|---|
test 이중포인터배열과 포인터배열 사용하는 방법 ★★★★★.zip | 385.4 KB |
Forums:
댓글 달기