자주쓰는 내용들 개념에 대해
size_t fread(void *
ptr, size_t
size, size_t
nmemb, FILE *
stream);
Reads data from a stream.
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
요거랑 비슷한거로는 fclose()가 있나봄
fread(&hf,sizeof(BITMAPFILEHEADER),1,infile); 하면..BIT머시기 크기만큼 1번 infile에서 읽어서 hf에다 씀
count가 1이 아닐 경우는 아래와 같은 식으로 하겠지
fwrite(OrgImg,sizeof(char),256*256,outfile);
요 파일 헤더파일을 14byte
실제 소스에서 bmp파일이 아닌경우 종료하게 하는 부분이 있음
if(hf.bfType != 0x4d42) exit(1);
예제...
#include <stdio.h>
int main(void)
{
unsigned int bt = 0x4d42;
unsigned short bt1 = 0x4d42;
printf("'B''M' %x%x\n",'B','M');
printf("int = %x ,%s\n",bt, &bt);
printf("short = %x ,%s\n",bt1, &bt1);
return 0;
}결과
결과로 보건데 낮은 번지부터 읽는듯 42가 'B'인데...
영상 헤더정보는 40byte
biBitCount가 8이면 흑백..24면 rgb쯤 되려나
RGBQUAD *pRGB;
if(hInfo.biClrUsed!=0) // 팔레트가 있는 경우
{
pRGB= new RGBQUAD [hInfo.biClrUsed]; // 팔레트의 크기만큼 메모리를 할당함
fread(pRGB,sizeof(RGBQUAD),hInfo.biClrUsed,infile); // 팔레트를 파일에서 읽음
}
팔레트 정보는 1024 byte인가봄
printf("size of RGBQUAD = %d\n",sizeof(RGBQUAD)); //결과 4
printf("size of BYTE = %d\n",sizeof(BYTE)); //결과 1
#define WIDTHBYTES(bits) (( (bits) + 31) / 32 * 4 ) // 영상 가로길이는 4바이트의 배수여야 함 //(영상의 가로사이즈를 비트단위로 넣으면 4의 배수로 만들어줭) //이게 왜 4배가 되야되냐? 지금하드가 ntfs..디스크가 4바이트씩 읽음(블럭인가?) 주소도 데이타 처리도 4바이트씩 하고있음. //영상의 가로사이즈를 4의 배수로 맞추면 영상의 전체 크기도 4의 배수가됨 //256이면 걍 쓰고 ...258이면 260바이트를 써야됨.
int rwsize = WIDTHBYTES(hInfo.biBitCount * hInfo.biWidth);
for(int i = 0; i< hInfo.biHeight;i++)
for(int j = 0; j < hInfo.biWidth; j++)
lpImg[i * rwsize + j] = 255 - lpImg[i * rwsize + j];
걍 이미지 밝기 반전하는건데..여기서 이게 왜 필요하냐? 참...예제를 만들어봄
int rwsize = WIDTHBYTES(8 * 509);
int rwsize1 = WIDTHBYTES(8 * 510);
int rwsize2 = WIDTHBYTES(8 * 511);
int rwsize3 = WIDTHBYTES(8 * 512);
int rwsize4 = WIDTHBYTES(8 * 513);
int rwsize5 = WIDTHBYTES(8 * 514);
그래서 이거 하고나면 rwsize는 가로 길이가 나옴...biWidth 해도될걸 굳이 귀찮게..이런 쯧쯧..
이게 반올림이 아니라 내림이라 저런 문제가 있었나? 암튼. 31로해서 올림으로 해서 맞춤
int myWidthStep(int n)
{
return (n * 8 + 31) / 32 * 4;
}
int _tmain(int argc, _TCHAR* argv[]) {
printf("%d\n",myWidthStep(39));
printf("%d\n",myWidthStep(40));
printf("%d\n",myWidthStep(41));
printf("%d\n",myWidthStep(42));
printf("%d\n",myWidthStep(43));
printf("%d\n",myWidthStep(44));
printf("%d\n",myWidthStep(45));
return 0;
}
40
40
44
44
44
44
48