언어/C

오랜만에 C언어 복습

이게될까 2024. 3. 12. 21:44
728x90
728x90

영상처리를 위해 C언어를 사용해야 하는데 복습 한번 쓱 합시다.

정수 자료형 기준 표현할 수 있는 범위

1 byte = 8 bit 

2^8 = 256 이라고 생각하면 편합니당

256*256 = 65536

메모리 할당

malloc과 calloc이 있죠

free를 생활화 합시다!

우린 영상처리를 할꺼니까 이진 파이링 되겠네요

파일 입 출력

file 포인터 사용하는거 잘 봐야합니당

scanf에는 주소 기호 사용하는 것도 잊지 말고여

파일 입출력
fopen

상대 경로와 절대 경로 잘 지켜야 합니다.

파일 모드

파일에서 데이터를 가지고 온다고 생각하면 편합니다.

 

파일에 작성한다고 생각하면 됩니당

우린 이진 파일을 읽을 것이다!

그럼 실습 하나를 해봐야겠죠

#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<windows.h>

int main() {
	BITMAPFILEHEADER bmpFile;
	BITMAPINFOHEADER bmpInfo;
	FILE* inputFile = NULL;
	inputFile = fopen("AICenter.bmp", "rb");
	fread(&bmpFile, sizeof(BITMAPFILEHEADER), 1, inputFile);
	fread(&bmpInfo, sizeof(BITMAPINFOHEADER), 1, inputFile);

	int width = bmpInfo.biWidth;
	int height = bmpInfo.biHeight;
	int size = bmpInfo.biSizeImage;
	int bitCnt = bmpInfo.biBitCount;
	int stride = (((bitCnt / 8) * width) + 3) / 4 * 4;
	printf("%d %d %d %d %d\n",width,height,size,bitCnt,stride);

	unsigned char* inputImg = NULL, * outputImg = NULL;
	inputImg = (unsigned char*)calloc(size, sizeof(unsigned char));
	outputImg = (unsigned char*)calloc(size, sizeof(unsigned char));
	fread(inputImg, sizeof(unsigned char), size, inputFile);
	for (int j = 0; j < height; j++) {
		for (int i = 0; i < width; i++) {
			outputImg[j * stride + 3 * i + 0] = inputImg[j * stride + 3 *i + 0];
			outputImg[j * stride + 3 * i + 1] = inputImg[j * stride + 3 * i + 1];
			outputImg[j * stride + 3 * i + 2] = inputImg[j * stride + 3 * i + 2];

			if (i < 100 && j < 100) {
				outputImg[j * stride + 3 * i + 0] = 0;
				outputImg[j * stride + 3 * i + 1] = 255;
				outputImg[j * stride + 3 * i + 2] = 0;
			}/*
			if (i > 400 && j > 400) {
				outputImg[j * stride + 3 * i + 0] = 255;
				outputImg[j * stride + 3 * i + 1] = 0;
				outputImg[j * stride + 3 * i + 2] = 0;
			}
			if (i < 100 && j > 400) {
				outputImg[j * stride + 3 * i + 0] = 0;
				outputImg[j * stride + 3 * i + 1] = 0;
				outputImg[j * stride + 3 * i + 2] = 255;
			}
			if (i > 400 && j < 100) {
				outputImg[j * stride + 3 * i + 0] = 0;
				outputImg[j * stride + 3 * i + 1] = 0;
				outputImg[j * stride + 3 * i + 2] = 0;
			}*/
		}
	}
	FILE* outputFile = fopen("Output.bmp", "wb");
	fwrite(&bmpFile, sizeof(BITMAPFILEHEADER),1,outputFile);
	fwrite(&bmpInfo, sizeof(BITMAPINFOHEADER), 1, outputFile);
	fwrite(outputImg, sizeof(unsigned char), size, outputFile);

	free(outputImg);
	free(inputImg);	
	fclose(outputImg);
	fclose(inputFile);
	return 0; 
}

저기 코드에 따라 다양한 영상의 변환이 가능합니다.

위 코드로 부터 왼쪽 아래에서 0,0으로 시작한 다는 것을 알았다.

그리고 색상한 BGR 순서이다.

728x90