상세 컨텐츠

본문 제목

Window Mata File(WMF, EMF)

멀티미디어/이미지(Image)

by cepiloth 2018. 9. 4. 20:19

본문

728x90
반응형



 WMF는 지금까지 살펴본 그래픽 파일들과는 달리 비트맵 방식이 아닌 벡터 방식으로 그림을 저장한다. 필요에 따라서는 비트맵 그림 데이터도 저장할 수 있다. WMF는 마이크로소프트 윈도우즈 GDI (Graphic Device Interface) 명령을 이용해 벡터 방식의 그림 데이터를 저장하고 있다.

 GDI는 일종의 그래픽 관련 API라고 볼 수 있는데 어플리케이션 프로그램에서 사용할 수 있는 각종 유용한 그래픽 관련 명령들을 제공하고 있다. 물론 비주얼 베이직에서도 GDI 명령들을 사용할 수 있다. 

 USER.DLL이 제공하는 API 함수들을 사용했던 것과 같은 방법으로 GDI.DLL이 제공하는 함수들을 사용하면 된다. 예를 들어 GDI가 제공하는 Pie 함수와 Rectangle 함수를 비주얼 베이직에서 사용해 보자. Pie는 말 그대로 파이 모양을 그리는 함수이고 Rectangle은 사각형을 그리는 함수이다.


파일 포맷 :

Standard WMF 파일은 Windows GDI의 PlayMeataFile 명령을 이용해 재생할 수 있다. 표준 WMF 파일은 16비트 GDI 명령만 지원한다.

Placeable WMF는 Aldus 사에 의해 만들어진 포맷으로 마이크로소프트 윈도우즈가 직접 지원하지는 않는다. 마이크로소프트 윈도우즈가 읽을 수 있으려면 맨 앞의 placeable WMF header 22바이트를 제거해야만 한다. 

Aldus placeable WMF 파일은 확장자가 보통 *.APM이지만 확장자가 *.WMF인 파일도 대부분 Placeable WMF 포맷을 따르고 있다. 따라서 확장자만으로 Standard WMF 파일인지 Placeable WMF 파일인지 알 수가 없다. 

Clipboard WMF 파일은 클립 보드에 저장될 때 사용하는 포맷으로 확장자가 *.CLP(Clipboard viewer 파일)인 파일이 이 포맷을 사용한다.

Enhanced metafile은 확장자가 *.EMF이며 32비트 GDI 명령을 지원한다. Windows GDI의 PlayEnhMetaFile 명령으로 재생할 수 있다. 16비트 WMF 파일은 SetWinMetaFileBits 명령을 이용해 Enhanced metafile로 변환될 수 있으며 이렇게 변환된 파일은 PlayEnhMetaFile 명령으로 재생 가능하다.

Standard metafile header : Standard WMF 포맷의 헤더는 표 1과 같다.
이름
크기
설명
FileType
2
metafile의 저장 장소. 0이면 메모리, 1이면 디스크에 저장되어 있음을 나타낸다.
HeaderSize
2
헤더 크기. 단위는 word(2바이트). 항상 9이다.
Version
2
metafile을 만든 윈도우즈 버전.
FileSize
4
파일 크기. 단위는 word(2바이트)이다.
NumOfObjects
2
저장된 개체의 개수
MaxRecordSize
4
가장 큰 레코드 크기. 단위는 word
NumOfParams
2
사용되지 않음. 항상 0.

<표 1 Standard WMF 헤더>

Placeable metafile의 헤더이다. 이 헤더 다음에 표 1의 standard WMF 헤더가 온다.
이름
크기
설명
Key
4
Placeable metafile임을 나타내는 키. 항상 0x9AC6CDD7이다.
Handle
2
항상 0.
Left
2
그림 이미지의 좌측 x좌표. 단위는 보통 Twip
Top
2
그림 이미지 상단 y좌표. 단위는 보통 Twip
Right
2
그림 이미지 우측 x좌표. 단위는 보통 Twip
Bottom
2
그림 이미지 하단 y좌표. 단위는 보통 Twip
Inch
2
1인치 당 길이. 보통은 1440 twips이다.
Reserved
4
디스크에 저장 시 항상 0
Checksum
2
헤더에 대한 checksum. Key부터 Reserved까지 10개 word에 대해 xor 연산을 한 값을 보관하고 있다. 헤더 10개 word를 xor한 결과와 checksum 값이 서로 다르면 파일이 비정상적임을 나타낸다.

< 표 2 Placeable metafile 헤더 >

표 3은 Clipboard metafile의 헤더이다. 32비트 윈도우즈용일 경우 16비트용보다 2배 더 크기가 크다. Clipboard metafile 헤더 다음에 standard WMF 헤더가 온다.
이름
크기
설명
MappingMode
2(4)
메타 파일을 재생할 때 사용할 단위.
1 - Text (Pixel 단위)
2 - Low Metric (0.1 mm)
3 - High Metric (0.01 mm)
4 - Low English (0.01 inch)
5 - High English (0.001 inch)
6 - Twips 1/1440 (inch)
7 - Isotropic (사용자 정의-폭/높이 비율 고정)
8 - Anisotropic (사용자 정의-폭/높이 비율 고정 안됨)
Width
2(4)
그림 이미지 폭
Height
2(4)
그림 이미지 높이
Handle
2(4)
디스크에 저장 시 항상 0.

* 괄호 안은 32비트 윈도우즈 헤더의 크기.
< 표 3 Clipboard metafile 헤더 >


Standard metafile record : Standard metafile의 헤더 다음에는 메타 파일 레코드들이 오는데 각각의 레코드는 GDI 함수와 1대 1로 대응된다. GDI 함수에 따라 매개 변수의 개수와 크기가 달라지기 때문에 레코드 크기는 일정하지 않다. 표 4는 standard metafile의 레코드 구조이다.
이름
크기
설명
Size
4
Size 필드를 포함한 레코드의 전체 크기. 단위는 word.최소 크기는 3 (Size 필드 2 word + Function 필드 1 word).
Function
2
GDI 함수 번호. 하위 바이트는 GDI 함수를 나타내고 상위 바이트는 전달될 매개 변수의 크기를 나타낸다. 단위는 워드이다. 예를 들어 Rectangle 함수를 나타내는 Function 번호는 0x041B인데 0x1B는 Rectangle 함수를, 0x04는 4word의 매개 변수를 가지고 있음을 나타낸다.
Parameters[]
N
전달될 매개 변수 배열. 매개 변수가 여러 개일 경우 순서가 뒤집혀서 저장된다. 예를 들어 Rectangle함수는 X1, Y1, X2, Y2 4개의 매개 변수를 전달 받는데 Y2, X2, Y1, X1의 순서로 저장된다.

<표 4 standard metafile 레코드 구조 >


대부분의 함수들이 word 단위의 매개 변수들을 가지고 있지만 몇몇 함수들의 매개 변수는 word 단위가 아닌 고유의 데이터 구조를 가지고 있다.

메타 파일의 맨 마지막 레코드는 파일의 마지막을 가리키는 레코드로 항상 3 word의 크기를 가지며 함수 번호 필드는 항상 0x0000이다. 매개 변수는 없다.

Enhanced metafile header : 표 5는 EMF 파일 헤더이다.
이름
크기
설명
RecordType
4
레코드 타입. 항상 0x00000001
RecordSize
4
헤더의 크기. 단위는 바이트.
BoundsLeft
4
그림 이미지의 크기와 위치.
BoundsRight
4
BoundsTop
4
BoundsBottom
4
FrameLeft
4
그림 이미지가 그려질 프레임의 크기와 위치.
FrameRight
4
FrameTop
4
FrameBottom
4
Signature
4
파일 구분자. 항상 0x464D4520이다.
Version
4
EMF 포맷 버전. 보통은 0x00000100 이 저장되어 있다.
Size
4
전체 metafile 크기. 단위는 바이트.
NumOfRecords
4
헤더를 포함한 전체 레코드 개수
NumOfHandles
2
메모리 핸들 테이블에 저장된 핸들 개수. 보통은 0.
Reserved
2
사용되지 않음. 항상 0.
SizeOfDescrip
4
Description string 필드에 저장된 16비트 유니코드 문자의 개수. 0이면 description string 필드가 없는 경우이다.
OffsOfDescrip
4
Description string 필드의 시작 위치. 단위는 바이트. 0이면 description string 필드가 없는 경우.
NumPalEntries
4
컬러 팔레트의 개수. 팔레트는 레코드의 맨 마지막에 위치한다. 팔레트 수가 0이면 팔레트가 없음을 의미한다.
WidthDevPixels
4
출력 장치의 폭과 높이. 단위는 픽셀.
HeightDevPixels
4
WidthDevMM
4
출력 장치의 폭과 높이. 단위는 mm.
HeightDevMM
4
DescripString
N
SizeOfDescrip 필드와 OffsOfDescrip 필드가 0이 아니면 헤더의 맨 마지막에 description string이 저장되어 있다. 2바이트 유니코드로 된 임의의 문자열이 저장될 수 있다. 보통 파일에 대한 설명이 저장된다.

< 표 5 EMF 파일 헤더 >


Enhanced metafile record : 표 6은 enhanced metafile의 레코드 구조이다.
이름
크기
설명
Function
4
GDI 함수 번호.
Size
4
Size 필드를 포함한 레코드의 전체 크기. 단위는 바이트.
최소 크기는 8 (Function필드 4바이트 + Size 필드 4바이트).
Parameters[]
N
전달될 매개 변수 배열. 매개 변수가 여러 개일 경우 순서가 뒤집혀서 저장된다.

<표 6 Enhanced metafile 레코드 구조 >

EMF의 GDI 함수 번호는 WMF의 함수 번호와 다르다. 총 97개의 GDI 함수를 지원한다. 

Enhanced metafile Color Palette : EMF 파일의 맨 마지막 레코드에는 파일의 끝을 알리는 EMR_EOF(함수 번호 14)가 저장되어 있다. EMF 헤더의 NumPalEntries 필드가 0이 아니면 맨 마지막 레코드에 컬러 팔레트 정보가 저장되어 있다. 컬러 팔레트가 저장된 맨 마지막 레코드의 구조는 표 7과 같다.
이름
크기
설명
Function
4
End of Record 함수. 항상 14이다.
Size
4
레코드 전체 크기. 단위는 바이트.
NumPalEntries
4
컬러 팔레트 개수
OffPalEntries
4
컬러 팔레트의 시작 위치. 맨 마지막 레코드의 처음부터 상대적인 위치를 나타낸다.
Palette[ ] (팔레트가 없는 경우 생략됨)
Red
1
빨간색 세기.
Green
1
녹색 세기.
Blue
1
청색 세기.
Flag
1
플래그.
:
:
:
OffToEOF
4
파일의 맨 마지막에서부터 맨 마지막 레코드의 시작 위치까지 바이트 수. 보통 Size 필드와 같은 값을 가지고 있다.


< 표 7 컬러 팔레트 구조 >


Reference WebSite


http://okjungsoo.tistory.com/m/post/view/id/3
libwmf - http://wvware.sourceforge.net/caolan/index.html
http://netghost.narod.ru/gff/graphics/summary/micmeta.htm
http://wvware.sourceforge.net/caolan/index.html
http://wvware.sourceforge.net/caolan/support.html
http://libuemf.sourceforge.net/
http://blog.didierstevens.com/2007/08/28/analyzing-a-suspect-wmf-file/


728x90
반응형

'멀티미디어 > 이미지(Image)' 카테고리의 다른 글

JPEG2000  (0) 2018.09.04
PNG  (0) 2018.09.04
GIF Format  (0) 2018.09.04
HEIF(High Efficiency Image File Format)  (0) 2018.09.04
Guetzli  (0) 2017.04.15

관련글 더보기

댓글 영역