안녕하세요. 오늘은 C언어 공부를 하면서 풀었던 예제를 공유하겠습니다. 앞으로도 제가 풀었던 C예제를 계속 공유하겠습니다!!

이번 예제는 간단히 raw 이미지파일을 읽어 들이고, 그것을 출력 버퍼에 복사한 뒤 다시 다른 파일에 그대로 쓰는 것으로, 이미지에 아무런 처리를 하지 않았기 때문에 완전히 똑 같은 이미지 하나를 만들어내는 것입니다!! 아래는 예제 코드입니다.

예시 입력 파일로는 Lena_512.raw파일을 사용했습니다. 이미지 크기는 가로 세로 512*512입니다. (영상 신호처리를 공부한 사람이라면 한 번쯤은 마주치게 될 이미지입니다ㅋㅋㅋㅋㅋㅋㅋ) 각 코드 줄에 대한 설명은 주석 처리해 두었습니다!!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define VER 512  
#define HOR 512
#define F_SIZE (VER*HOR)

unsigned char** alloc_pic_2d(int width, int height); // 2D 배열 함수 선언

int main() 
{
    int i, j;

    unsigned char** ori_pic_2d = alloc_pic_2d(HOR, VER); // 원본 이미지 2D 배열을 위한 메모리 할당
    unsigned char** modi_pic_2d = alloc_pic_2d(HOR, VER); // 복사 이미지 2D 배열을 위한 메모리 할당

    FILE * fin2, * fout2; // 파일 포인터 선언

 
    fin2 = fopen("Lena_512.raw", "rb"); // 바이너리 읽기 모드를 위한 입력 파일 열기 (for the 2D case)
    fout2 = fopen("Copy_Lena_512_2d.raw", "wb"); // 바이너리 쓰기 모드를 위한 출력 파일 열기 (for the 2D case)

    if (!fin2) // 입력 파일이 성공적으로 열렸는지 확인
    {
        printf("ERROR :: File Can't Read\n"); // Print error message
        exit(1); // Exit the program with an error code
    }
    if (!fout2) // 출력 파일이 성공적으로 열렸는지 확인
    {
        printf("ERROR :: File Can't Save\n"); // Print error message
        exit(1); // Exit the program with an error code
    }

    for (i = 0; i < VER; i++) // 이미지 세로 크기만큼 1씩 증가하면서 루프 반복
        fread(ori_pic_2d[i], sizeof(unsigned char), VER, fin2); //  입력 파일의 각 줄을 ori_pic_2d 배열로 읽어 옴
    for (j = 0; j < VER; j++)
    {
        for (i = 0; i < HOR; i++) // 이미지 가로 크기만큼 1씩 증가하면서 루프 반복
        {
            modi_pic_2d[j][i] = ori_pic_2d[j][i]; // ori_pic_2d 이미지에서 각 픽셀을 복사하여 modi_pic_2d에 저장
        }
    }

    for (i = 0; i < VER; i++) {
        fwrite(modi_pic_2d[i], sizeof(unsigned char), VER, fout2); // 입력 파일의 각 줄을 modi_pic_2d 배열에 씀
    }
    fclose(fin2); // 입력파일 닫기
    fclose(fout2); // 출력 파일 닫기

    for (i = 0; i < VER; i++) // 배열 메모리 할당 해제를 위한 반복
    {
        free(ori_pic_2d[i]); // ori_pic_2d 각 열 메모리 해제
        free(modi_pic_2d[i]); // modi_pic_2d 각 메모리 해제
    }

    free(ori_pic_2d); // 원본 2D 그림 배열의 포인터에 대한 메모리를 확보
    free(modi_pic_2d); // 복사 2D 그림 배열의 포인터에 대한 메모리를 확보


    return 0; // Return success
}

unsigned char** alloc_pic_2d(int width, int height) // 2차원 배열 메모리 할당 함수 정의
{
    unsigned char** pic;
    int i;

    if ((pic = (unsigned char**)calloc(width, sizeof(unsigned char*))) == NULL)
    {
        printf("\n malloc_picture : Picture structure \n");
        exit(1);
    }

    for (i = 0; i < height; i++)
    {
        if ((pic[i] = (unsigned char*)calloc(height, sizeof(unsigned char))) == NULL)
        {
            printf("\n malloc_picture : Picture structure \n");
            exit(1);
        }
    }
    return pic;
}