::: 강좌/소스/문서 :::

강좌/소스/문서 성격에 맞지 않는 광고,비방,질문의 글은 즉시 삭제하며
내용을 복사하여 사용할 경우 반드시 이곳(http://www.howto.pe.kr)을 출처로 명시하여 주세요


Category

  김영대(2003-03-18 00:28:00, Hit : 7969, Vote : 1661
 bitmap_delphi.zip (7.8 KB), Download : 553
 [강좌] Run-Length Encoding BMP viewer

Delphi의 TImage 콤포넌트를 포함하여 몇몇 그래픽 뷰어 프로그램들은
RLE(Run-Length Encoding)로 Encoding 된 bmp 파일을 인식 못하는 경우가
있습니다. bmp 파일 포맷에는 RLE를 명시하고 있는데도...

데이터 압축에는 원본 이미지를 손실하지 않고 압축하는 Run-Length Coding,
Huffman Coding, Arithmetic Coding 등이 있고 원본 이미지를 손실하여
압축률을 높인 차분 펄스 코드변조(DPCM),  델타 변조(DM),  퓨리에 변환(FFT),
이산 여현 변환(DCT), ... 등이 있습니다

이 강좌에서 RLE Decoding 를 Delphi 로 구현하였습니다
(RLE Encoding 은 "컴퓨터 전공" 부분에 C 소스로 올렸습니다)
그럼 RLE 에 대해 간단히 설명하면,
  .fax에 많이 쓰이는 방식
  .흑백, 검은색=1, 흰색=0로 가정
  .2진 비트의 1과 1사이의 0에 대한 bits을 1 0a 1 0b 1 0c 1 0d로 표현 --> ABCD로 encoding
   (0a 는 연속적인 0의 갯수, 0사이의 1은 생략 가능)
  .a=600일 경우 --> A=1001011000과 같이 10개의 bits로 표현
  .200line/inch, 200point/inch로 scan하는 경우
     .8.5 inch x 11 inch, 1page =200x200x8.5x11=3.74x106 bits
     .9,600bps로 전송경우 6.5분 필요--> 압축후 약 20초 필요

RLE Encoding 방향과 흐름도는 아래와 같습니다



물론 Decoding 은 위그림과 반대로 계산하면 됩니다

BMP를 읽어오기 위해서는 당연히 bitmap 파일의 포맷을 봐야겠죠

typedef struct tagBITMAPFILEHEADER {    /* bmp 파일의 정보 */
    UINT    bfType;
    DWORD   bfSize;
    UINT    bfReserved1;
    UINT    bfReserved2;
    DWORD   bfOffBits;
} BITMAPFILEHEADER;

typedef struct tagBITMAPINFOHEADER {    /* bmp 정보 */
    DWORD   biSize;
    LONG    biWidth;
    LONG    biHeight;
    WORD    biPlanes;
    WORD    biBitCount;
    DWORD   biCompression;
    DWORD   biSizeImage;
    LONG    biXPelsPerMeter;
    LONG    biYPelsPerMeter;
    DWORD   biClrUsed;
    DWORD   biClrImportant;
} BITMAPINFOHEADER;

typedef struct tagRGBQUAD {     /* RGB palette 정보 */
    BYTE    rgbBlue;
    BYTE    rgbGreen;
    BYTE    rgbRed;
    BYTE    rgbReserved;
} RGBQUAD;

위 포맷중 biBitCount 는 pixel당 몇 bit를 사용하는지를 나타내며 biCompression 는
몇 bit로 encoding 되었는지를 나타냅니다
여기서 주의할것은 biBitCount 만 가지고 RGB 테이블의 길이를 계산하지 말고
biClrUsed 를 사용하여 실제 사용한 RGB 들의 갯수를 알아내야 합니다

struct tagRGBQUAD 이 있는 이유는 각 bmp 마다 파랫트를 달리 가지고 있어
모든 RGB 조합을 저장하는 것이 아니라 실제 사용한 RGB 조합만을 테이블로
저장하기 위해 사용됩니다

BMP 파일의 더 자세한 설명은 http://web.usxchange.net/elmo/bmp.htm 를 참고하세요
첨부한 소스를 다운받아 컴파일하여 실행한 화면은 아래와 같습니다
첨부한 소스에 주석이 달려 있으니 참고하여 보세요






35   [Delphi] [소스] String을 MS-WORD 로 보내는 콤포넌트  김영대 2003/03/19 6394 1515
  [Delphi] [강좌] Run-Length Encoding BMP viewer  김영대 2003/03/18 7969 1661
33   [Delphi] [강좌] Window NT/2000 의 서비스 어플리케이션의 작성  구창민 2003/03/14 7056 1407
32   [Delphi] [소스] Indy를 이용한 FTP Dll Library  신훈재 2003/03/13 8464 1657
31   [Delphi] [소스] runtime 디자이너 (콤포넌트 resize, move)  김영대 2003/03/12 6308 1574
30   [Delphi] [소스] 파서(parser)를 만들기 위한 Delphi 용 Lex & Yacc  김영대 2003/03/12 7292 1524
29   [Delphi] [소스] 원도우즈 네트웍 함수(WNet*)의 사용 예제  김영대 2003/03/12 7084 1677
28   [Delphi] [소스] 폼의 내용을 그대로 저장하고 복원하는 콤포넌트  김영대 2003/03/12 7016 1727
27   [Delphi] [문서] ZIP 파일의 내부구조 설명  김영대 2003/03/12 6861 1601
26   [Delphi] [소스] tray icon 예제소스  김영대 2003/03/12 7854 1545
25   [Delphi] [소스] 내 PC의 IP 구하기 예제  김영대 2003/03/12 7343 1619
24   [Delphi] [소스] BMP로 애니메이션 구현하기  김영대 2003/03/12 5795 1365
23   [Delphi] [소스] 델파이 프로그램에서 원도우즈 탐색기로 드롭하기  김영대 2003/03/12 6762 1607
22   [Delphi] [소스] DOS 명령어를 실행하고 결과 받아오기  김영대 2003/03/12 6944 1693
21   [Delphi] [소스] 간단한 계산기 프로그램 소스  김영대 2003/03/12 6717 1478
20   [Delphi] [소스] 다기능 DBGrid (복수 Title, 자동정렬..)  김영대 2003/03/12 8850 1770
19   [Delphi] [소스] 인쇄 미리보기 화면 만들기 - 워드패드2  김영대 2003/03/12 7625 1733
18   [Delphi] [소스] RichEdit를 이용한 워드패드(WordPad)  김영대 2003/03/12 6618 1587
17   [Delphi] [소스] Text(*.csv, *.txt) 파일을 DB 로 올리기  김영대 2003/03/12 8929 1591
16   [Delphi] [소스] 파일의 내용 전체를 비밀번호로 암호/복호화  김영대 2003/03/12 7679 1573

[1] 2 [3]
 

Copyright 1999-2019 Zeroboard / skin by zero