2014년 8월 7일 목요일

BMP 구조

BMP 파일을 읽어서 쓰기위해 BMP파일의 구조를 파악하고 코드를 간단히 나마 구현해봤다. 윈도우에서 하면 금새 될텐데 왜 그랬냐? Linux에서 해보려고.

그럼 BMP파일구조에 대해 먼저 알아보자.

BMP파일구조

BMP파일 자체에 대한 궁금증은 다른 자료들을 찾아보면 된다.

파일헤더
영상헤더
팔레트정보
영상데이터
BMP파일의 구조를 나타냈다. 아주 간단하다. 파일헤더, 영상헤더, 팔레트 정보, 영상데이터 이렇게 들어가있다.

자 그럼 각각에 대해 알아보자.

1. 파일헤더

  BMP파일에 대한 정보를 가지고 있다. 아래의 표는 파일헤더에 있는 내용을 나타낸다.

Filed
Bytes
설명
bfType
2
0x4D42 (‘BM’) 이란 데이터가 있어야 한다.
bfSize
4
파일의 전체 크기.
bfReserved1
2
사용하지 않음.
bfReserved2
2
사용하지 않음.
bfOffBits
4
영상데이터의 시작위치를 나타낸다.

상위의 표를 구조체로 표현하면 다음과 같이 나타낼 수 있을것이다.

typedef struct {
  short             bfType;
  unsigned int   bfSize;
  short             bfReserved1;
  short             bfReserved2;
  unsigned int   bfOffBits;
} BITMAPFILEHEADER

bfType

bfType에 들어간 내용이 중요한데 이곳에 0x4D42 문자로 "BM"이라는 값이 있어야 일차적으로 입력된 파일이 BMP파일인지 아닌지 걸러진다.
즉 파일명은 *.bmp로 되어있더라고 파일 헤더를 깠을 때 bfType에 0x4D42의 값이 없다면 BMP파일이 아닌것으로 간주하면 된다.

bfSize

bfSize는 BMP파일의 전체 사이즈를 나타낸다.


bfReserved1 & 2


사용하지 않는 영역이다. 그냥 사용하지 않는다고 생각하고 있으면 됨. 하지만 헤더를 깠을때 0의 값이 들어가 있다.


bfOffBits


실제 영상데이터의 위치를 나타낸다. 여기에 있는 값은 파일 헤더, 인포헤더의 총 사이즈와 같다.

2. 영상헤더

BMP파일의 영상헤더 (Info Header)에 대해 알아보자. 이곳에는 실제 RAW데이터에 대한 정보들이 포함되어 있다.

Filed
Bytes
설명
biSize
4
영상헤더의 크기
biWidth
4
BMP의 가로 픽셀 수
biHeight
4
BMP의 세로 픽셀 수
biplanes
2
색상 면 -> 1의 값.
biBitCount
2
픽셀당 비트 수
biCompression
4
압축의 형태
biSizeImage
4
실제 데이터의 크기
biXPixelPerMeter
4
미터당 가로 픽셀 수
biYPixelPerMeter
4
미터당 세로 픽셀 수
biClrUsed
4
BMP에서 사용되는 색상 수
biClrImportant
4
BMP 출력에 필요한 색상 수

상위의 표를 구조체로 나타내면 다음과 같이 작성할 수 있다.

typedef struct {
  unsigned int        biSize;
  unsigned int        biWidth;
  unsigned int        biHeight;
  unsigned short    biPlanes;
  unsigned short    biBitCount;
  int                      biCompression;
  unsigned int        biSizeImage;
  unsigned int        biXPixelPerMeter;
  unsigned int        biYPixelPerMeter;
  int                      biClrUsed;
  int                      biClrImportant;
} BITMAPINFOHEADER;


각각의 필드에 대한 설명은 표를 보면 나와있다.

3. 팔레트 정보

4. 영상데이터
영상데이터에 영상은 꺼꾸로 들어가 있으며 이부분을 참고해서 코딩하길 바란다.



2014년 7월 24일 목요일

Ubuntu Vi 백스페이스 및 방향키

우분투에서 vi를 처음 사용하다보면 백스페이스와 방향키가 안먹는 경우가 있다. 혹은 뻘짓을 한다던지 이때는 아래와 같이 하면 되겠다.

방법: 1

~$ vi .exrc

vi 창에 다음을 작성.

set autoindent
set number
set bs=2
set nocp

저장 후 종료 (esc한번 누르고 :wq)

이후
~$ source .exrc
실행시키면 이후부터는 제대로 작동~

방법:2
우분투에서 vi가 초기에 뻘짓을 하는 잉는 제대로된 버전에 설치되어 있지 않기 때문.
이때는 vim을 설치함으로서 해결법도 있다.

아래는 vim을 설치하기위한 명령어

~$ sudo apt-get install vim

요래 해도 된다.


2014년 7월 20일 일요일

Oracle VM VirtualBox "Cannot register the hard dist" 해결법

 VM VirtualBox를 쓰다보면
새로운 가상머신을 만들때 다음과 같은 에러가 간혹 뜨는것을 경험하게 된다.
이때의 해결법에 대해 간략히 적어보도록 하겠다.


상위와 같은 에러는 기존에 있는  vdi파일을 복사하여 사용하고자 할 때 혹은 다른 곳에 있는 것을 가지고 왔을때 uuid 값의 중복에 의해 발생 되는 에러이다. 이때는 cmd 창에서 다음과 같이 치면 해결이 된다.

"VBoxManage.exe internalcommands sethduuid <에러난 vdi 명>"

아래 그림은 본인이 문제해결을 위해 사용했던것을 캡쳐해 놓은것이다.




2014년 1월 15일 수요일

Linux *.tar 압축 및 해제

<===  tar 압축. ===>

tar -cvf [파일명.tar] [압축할 폴더명]
ex) tar -cvf DM8148_BOOT.tar /media/BOOT/*
외부 입력장치(USB 혹은 SD)카드의 BOOT드라이브 내용을 모두 압축하라.


<=== tar 압축 해제. ===>
tar -xvf 파일명
ex) tar -xvf BOOT.tar
요래 하면 압축 풀림.