C를 활용해서 디지털 영상 처리와 관련한 가벼운 주제로 공부할 계획입니다.
IDE는 Visual Studio를 활용합니다.
이번 포스팅의 주제는 raw 파일 이미지 읽기 및 복사입니다. raw 포맷은 다른 bmp,jpg,gif,png 등... 과는 달리 단어 그대로 가공되지 않은 수치 값을 가지고 있는 데이터 포맷입니다. 따라서 시각화 하기 위해서 Dabwa 프로그램을 활용하여 시각화 할 수 있습니다. 유명한 Lenna 이미지를 통해서 진행했습니다. 512 x 512 x 1 흑백이미지를 사용했고 파일의 크기는 256 kb입니다.
먼저 라이브러리를 불러오고, Size를 정의해 줍니다.
#pragma warning(disable : 4996)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define VER 512
#define HOR 512
#define F_SIZE (VER*HOR)
1차원 형태, 2차원 형태로 데이터를 받을 메모리를 할당해 줍니다.
unsigned char* alloc_pic(int SIZE)
{
unsigned char* pic;
if ((pic = (unsigned char*)calloc(SIZE, sizeof(unsigned char))) == NULL)
{
printf("\n malloc_picture : Picture structure \n");
exit(1);
}
return pic;
}
unsigned char** alloc_pic_2d(int width, int height)
{
unsigned char** pic;
int i;
if ((pic = (unsigned char**)calloc(height, 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(width, sizeof(unsigned char))) == NULL)
{
printf("\n malloc_picture : Picture structure \n");
exit(1);
}
}
return pic;
}
raw포맷의 데이터를 fin1에 저장하고 fout1에 복사하여 저장하기 File 구조체를 활용합니다.
int i, j;
unsigned char* ori_pic = alloc_pic(F_SIZE);
unsigned char* modi_pic = alloc_pic(F_SIZE);
unsigned char** ori_pic_2d = alloc_pic_2d(HOR, VER);
unsigned char** modi_pic_2d = alloc_pic_2d(HOR, VER);
FILE* fin1, * fin2, * fout1, * fout2;
fin1 = fopen("Lena_512.raw", "rb");
fout1 = fopen("Copy_Lena_512.raw", "wb");
fin2 = fopen("Lena_512.raw", "rb");
fout2 = fopen("Copy_Lena_512_2d.raw", "wb");
if (!fin1)
{
printf("ERROR :: File Can't Read\n");
exit(1);
}
if (!fout1)
{
printf("ERROR :: File Can't Save\n");
exit(1);
}
if (!fin2)
{
printf("ERROR :: File Can't Read\n");
exit(1);
}
if (!fout2)
{
printf("ERROR :: File Can't Save\n");
exit(1);
}
ori_pic에 fin1의 데이터를 입력하고, memcpy 함수를 통해 modi_pic 복사하는 방법
index를 통해 접근해서 2차원형태로 modi_pic_2d에 복사하는 방법
2가지 방법을 통해 읽기, 쓰기를 진행 했습니다.
fread((void*)ori_pic, sizeof(unsigned char), F_SIZE, fin1);
memcpy(modi_pic, ori_pic, F_SIZE * sizeof(unsigned char));
fwrite(modi_pic, sizeof(unsigned char), F_SIZE, fout1);
for (i = 0; i < VER; i++)
fread(ori_pic_2d[i], sizeof(unsigned char), HOR, fin2);
for (j = 0; j < VER; j++)
{
for (i = 0; i < HOR; i++)
{
modi_pic_2d[j][i] = ori_pic_2d[j][i];
}
}
for (i = 0; i < VER; i++)
fwrite(modi_pic_2d[i], sizeof(unsigned char), HOR, fout2);
메모리 사용을 마친 후에는 할당을 해주는게 좋습니다
fclose(fin1);
fclose(fout1);
fclose(fin2);
fclose(fout2);
for (i = 0; i < VER; i++)
{
free(ori_pic_2d[i]);
free(modi_pic_2d[i]);
}
free(ori_pic_2d);
free(modi_pic_2d);
free(ori_pic);
free(modi_pic);
이렇게 기존의 raw포맷의 흑백 이미지를 읽고 복사해서 저장하는 코드를 작성해봤습니다!