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
요래 하면 압축 풀림.


2013년 8월 6일 화요일

unexpected error while launching program Error while running ps7_init method:



xilinx SDK를 사용 및 jtag을 이용한 프로그램을 보드에 올리려는 중 다음과 같은 에러가 발생됐다.
상기 에러의 발생 원인은 다양한 것이 있지만 본인이 해결했던 방법 한가지를 적을까 한다.
보통 다른 사람이 해놓은 프로젝트를 들고와서 쓰다보면 경로의 문제가 많이 발생하게 된다.
이 문제 또한 경로의 문제였다. 즉 ps7_init.tcl파일의 경로가 잘못되어 있었기에 문제가 발생했던 것이다.
이떄는 다음과 같이 문제를 해결해보면 된다.

1. project explorer->해당프로젝트 (오른쪽 클릭)->Run As->RunConfigurations를 누르면 다음과 같은 화면이 나온다.


2. 그림의 오른쪽 화면을 보면 Device Initialization탭이 있다. 클릭!
이제 화면을 유심히 보면 Path to initialization TCL file 이라고 적히고 아래에 경로가 적혀있는것을 볼 수 있을 것이다.
자세히 보면 현재 프로젝트의 경로와 틀린 점을 발견할 수 있을것이다.
이 경로를 현재 프로젝트의 tcl파일이 있는 경로로 바꿔주면 된다.


2013년 7월 25일 목요일

The system is running in low-graphics mode 에러

virtualbox를 사용해서 ubuntu linux를 설치하면 제목과 같은 오류가 발생하는 문제에 봉착하는 경우가 종종 있다.
이때 해결책에 대해 언급해본다.

먼저 당면한 문제의 이미지에서 ctrl + art + F1을 누른다.
그러면 terminal 창에 로그인 화면이 뜬다.
로그인 후
다음과 같이 치면 파일 설치가 되고.
그 후 리붓을 시키면 된다.

$sudo apt-get install fglrx
$sudo reboot


2013년 7월 14일 일요일

Xilinx ZedBoard u-boot를 해보자 2탄

앞에서 각각의 필요한 파일들에 대한 빌드를 했었다.
이번에는 hostpc에서 필요한 셋팅을 해본다.

1. tftp셋팅.
    /etc/xinetd.d/ 폴더로 이동한다.
    terminal 입력: vim tftp
    아래의 내용을 추가해서 적어넣는다.

     Service tftp
{
           socket_type = dgram
           protocol = udp
           wait = yes
           user = root
           server = /usr/sbin/in.tftpd
           server_args = -s /tftpboot
           disable = no
     }

       terminal 입력: mkdir /tftpboot

        tftp에 사용할 파일들이 들어갈 폴더를 만든다.
        이전에 빌드해 놓은 파일들을 이 폴더에 저장한다.

       terminal 입력: /etc/init.d/xinetd restart

2. dhcp 셋팅
     /etc/dhcp3폴더로 이동.
     terminal 입력: vim dhcpd.conf
     아래 내용 추가.

subnet (해당아이피에따라) netmask (해당하는것에 따라) {
           host targetboard {
                     fixed-address (해당 아이피);
                     hardware ethernet (해당 mac주소);
                     option root-path “/full/path/to/rfs”;
                     filename “해당파일이름”;
           }
}


terminal 입력: service dhcp3-server restart





본 정보는 부정확하다. 수정한 내용에 대해서 추후 올리도록 하겠따.