AVI RIFF 文件參考手冊

微軟的 AVI 文件格式是一種用於捕獲、編輯和回放 audio-video 序列的 RIFF 文件規範。總體上講,AVI 文件包含多個針對不同數據的流。 大部分 AVI 序列使用 audio 和 video 流。 一個簡單的 AVI序列特例可以只包含 video 數據而不包含 audio 數據。

本部分並沒有介紹 OpenDML 對於 AVI 文件格式的擴展。如果要對其深入研究, 請參考 OpenDML AVI M-JPEG 文件格式小組委員會出版的《OpenDML AVI File Format Extensions 》。

 

FOURCCs

 

一個 FOURCC( four-character code4字符碼)是一個包含4ASCII碼字符串的32位的無符號整型數據。例如, 在 Little-Endian 系統中, FOURCC 'abcd' 表示爲 0x64636261FOURCC中也可以包含空格,如 ' abc' 也是一個有效的FOURCC。 AVI 文件使用 FOURCC碼標示流的類型、數據chunkindex元素, 和其他的信息。

 

RIFF 文件格式

 

AVI 文件格式是基於 RIFF ( resource interchange file format ) 文檔格式的。一個 RIFF 文件包含一個RIFF 頭, 以及其後的多個 list 和 chunk

  • RIFF 頭的格式:

    RIFF’+文件大小+文件類型+(數據)

    'RIFF'就是FOURCC'RIFF'。文件大小是一個表示文件中數據大小的4字節值。文件類型是一個FOURCC碼,表示文件類型。文件大小,包含的是文件類型以及其後數據的大小,不包含FOURCC'RIFF'和文件大小本身所佔的空間。

  • 塊(chunk)的格式:

    ckID+ckSize+ckData

    其中, ckID是一個說明該chunk中所包含的數據的FOURCC碼。szSize 是表示 ckData 中數據大小的4字節數值。ckData0個或多個字節的數據。數據總是填充到就近的WORD邊界。ckSize表示的是chunk中有效數據的大小,它不包括填充部分的大小,以及ckIDckSize所佔的空間。

  • List 格式:

    'LSIT'+listSize+listType+listData

    'LIST'就是FOURCC'LIST'listSize是表示list大小的4字節數值。listType是一個FOURCC碼。listData中是以任意順序排列的多個listchunklistSize包含的是listTypelistData的大小,而不包含FOURCC'LIST'和文件大小本身所佔的空間。

 

本文的餘下內容,將用以下符號表示 RIFF chunk

ckID ( ckData )

其中chunk大小的概念比較模糊。使用以上符號,一個list可以表示爲:

'LIST' ( listType ( listData ) )

可選成員被放到了方括號中:[可選成員]

 

AVI RIFF Form

 

AVI 文件在 RIFF 頭中用 FOURCC 'AVI '標示。所有的AVI文件都被強制要求包含兩個LIST 類型的chunk,分別定義了stream的格式和stream的數據。一個AVI文件還可能包含一個index chunk,其中包含了數據chunk在文件中的位置。包含以上部分的AVI文件的格式爲:

RIFF ('AVI '      LIST ('hdrl' ... )      LIST ('movi' ... )      ['idx1' (<AVI Index>) ]     )	'hdrl' list定義了數據的格式,是第一個必須的LIST chunk。'movi' list包含了AVI序列中的數據,是第二個必須的LIST chunk。'idx1'list包含了index數據。這三部分在AVI文件中的順序是特定的。	注意:OpenDML 擴展中定義了另外一種index,用FOURCC碼'indx'進行標示。	'hdrl' list和'movi' list 用subchunk來表示它們的數據。 下面的例子列出了AVI RIFF文件的結構, 其中的list需要包含相應的chunk。RIFF ('AVI '      LIST ('hdrl'            'avih'(<Main AVI Header>)            LIST ('strl'                  'strh'(<Stream header>)                  'strf'(<Stream format>)                  [ 'strd'(<Additional header data>) ]                  [ 'strn'(<Stream name>) ]                  ...                 )             ...           )      LIST ('movi'            {SubChunk | LIST ('rec '                              SubChunk1                              SubChunk2                              ...                             )               ...            }            ...           )      ['idx1' (<AVI Index>) ]     )AVI Main Header	'hdrl' list的開頭部分是一個包含主AVI header 的 'avih' chunk。主header中包含了AVI 文件的一些全局信息,如:文件中包含多少個流,AVI序列的寬高等等。主header chunk的內容可以用結構體 AVIMAINHEADER 表示。AVI Stread Headers	主header 後面跟的是一個或多個'strl' list。每一個數據流都需要有一個'strl' list。每一個'strl' list都必須包含文件中一種流的信息,並且必須包含該流的header chunk('strh')和format chunk('strf')。另外,一個'strl' list還可能包含一個流的頭數據chunk('strd')和一個流的名稱chunk('strh')。	流的header chunk ('strh')可以用結構體 AVISTREAMHEADER 表示。	流的format chunk('strf')一定要跟在header chunk的後面。Format chunk描述了流中數據的格式。Format chunk中包含什麼數據,依賴於流的類型。對於video流,其中的數據是一個BITMAPINFO結構體,如果指定的話其中將包含一個調色板。對於audio 流,其中的數據是一個WAVEFORMATEX 結構體。	如果包含流的header data chunk('strd'),它將緊隨在流的format chunk('strf')之後。其格式已經包含的內容由codec driver來定義。通常情況下,drivers使用其中的數據作爲配置信息。讀或者寫AVI文件的應用程序不需要解釋這些信息,只需要作爲一個內存塊,傳給driver,或者從driver處獲取。	可選的'strn'chunk包含一個描述流的,以空字符爲結尾的文本字符串。	'hdrl'list中流的頭信息,按照其中'strl'chunk的順序,與'movi'list中的流數據關聯起來。其中,第一個'strl'chunk表示stream 0,第二個表示stream 1,以此類推。Stream Data ( 'movi' list )	頭信息的後面,是一個包含流的真實數據的'movi'list,這些數據包括視頻幀、音頻採樣等。數據chunk 可以直接作爲成員,存在於'movi'list中,也可以組成一個'rec 'list,整體作爲一個成員,存在於'movi'list中。一個'rec 'list中包含的所有的chunk,應該一次從磁盤中讀入到內存,這樣是爲了那些從磁盤交錯播放的文件。	一個數據chunk的FOURCC碼,前兩個字節的數字信息,用來說明該chunk屬於哪個流;後兩個字節的字符信息,說明該chunk中數據的類型。

Two-character code

Description

db

Uncompressed video frame

dc

Compressed video frame

pc

Palette change

wb

Audio data

例如,如果stream 0 包含的是audio, 該流的data chunk將含有FOURCC碼'00wb';stream 1包含的是video,該流的data chunk 將包含FOURCC碼'01db'或者'01dc'。Video 的data chunk還可以在AVI序列中定義一個新的調色板條目。沒一個 改變調色板(palette-change)的chunk( 'xxpc' )包含一個AVIPALCHANGE的結構體。如果一個流包含有調色板變更,該流的AVISTREAMHEADER結構體( strh )中的成員deFlags會被設置AVISF_VIDEO_PALCHANGES 標誌。	文本流可以使用其他任意兩個字符的編碼。AVI Index Entries	可選的index chunk('idx1')可以跟在'movi'list的後面。index包含了一個數據chunk和它們在文件中位置的列表(list)。它包含一個AVIOLDINDEX結構體,其中有針對每個數據chunk的條目,也包括'rec 'chunk。如果文件包含了index,AVIMAINHEADER結構體( 'avih' )中的成員dwFlags需要被設置AVIF_HASINDEX 標誌。Other Data Chunks	如果需要,可以在數據中插入'JUNK'chunk。應用程序應該忽略'JUNK'chunk所包含的內容。===============================相關結構體========================================----------------AVIMAINHEADER結構體------------------------

AVIMAINHEADER結構體中定義了AVI文件的全局信息。

typedef struct _avimainheader {    FOURCC fcc;    DWORD  cb;    DWORD  dwMicroSecPerFrame;    DWORD  dwMaxBytesPerSec;    DWORD  dwPaddingGranularity;    DWORD  dwFlags;    DWORD  dwTotalFrames;    DWORD  dwInitialFrames;    DWORD  dwStreams;    DWORD  dwSuggestedBufferSize;    DWORD  dwWidth;    DWORD  dwHeight;    DWORD  dwReserved[4];} AVIMAINHEADER;

fcc

FOURCC 碼。此處必須爲'avih'

cb

結構體的大小,不包括開頭 的8字節。

dwMicroSecPerFrame

指定幀之間的微秒數。此值表明本文件的總時間。

dwMaxBytesPerSec

指定文件的近似最大數據速率。此值表明該系統每秒要處理的字節數,以表現一個AVI序列,正如在main header 和 stream header chunks 中其他參數指所指定的字節數。

dwPaddingGranularity

規定以字節爲單位的數據對齊。將數據以該值的整數倍進行對齊。

dwFlags

包含0個或多個一下標誌的按位組合:

Value

Description

AVIF_COPYRIGHTED

表明AVI文件包含了版權數據和軟件。如果設置了改標誌,將不允許軟件對該數據進行拷貝。

AVIF_HASINDEX

表明AVI文件包含一個index

AVIF_ISINTERLEAVED

表明AVI文件是交叉的。

AVIF_MUSTUSEINDEX

表明應用程序需要使用index,而不是物理上的順序,來定義數據的展現順序。例如,該標誌可以用於創建一個編輯用的幀列表。

AVIF_WASCAPTUREFILE

表明該文件是一個用於捕獲實時視頻的,而特別分配的AVI 文件。如果一個文件設置了該標誌,在用戶寫該文件之前,應用程序應該發出警告,因爲用戶可能會對該文件進行碎片整理。


AVIF_COPYRIGHTED

0x00020000

AVIF_HASINDEX

0x00000010

AVIF_ISINTERLEAVED

0x00000100

AVIF_MUSTUSEINDEX

0x00000020

AVIF_WASCAPTUREFILE

0x00010000

TRUSTCKTYPE

0x00000800


dwTotalFrames

指定本文件中包含的幀數據的總數。也就是指定文件中總共包含多少幀。

dwInitialFrames

指定交錯文件中的初始幀。非交錯文件,該參數應該被設置爲0。如果你正在創建一個交錯文件,在該參數中指定文件中,AVI文件的初始幀之前,幀的數量,即文件中在初始幀前面還有多少幀。

爲了讓音頻驅動有足夠的音頻去處理,交錯文件中的音頻數據必須與視頻數據有一定的偏移。通常情況下,音頻數據必須前移足夠的幀,以使大約0.75秒的音頻數據被預裝。應該將音頻數據中偏移的幀數設置到成員dwInitialRecords(未找到該成員,懷疑應該是dwInitialFrames)。音頻流header的結構體AVISTREAMHEADERdwInitialFrames 成員,應該被設置爲同樣的值。

dwStreams

指定文件中包含的流的數量。例如,一個包含視頻和音頻數據的文件有兩個流。

dwSuggestedBufferSize

指定讀該文件用的建議的緩存大小。一般來說,該大小要足以包含文件中最大的數據塊(chunk)。如果該成員被設置爲0,或者太小,播放軟件在播放時就需要重新分配內容,這將導致性能的下降。對於一個交叉文件,該緩存大小應該足以讀取一整條記錄(在movi list中,有的數據以chunk的形式存在,有的數據以record即記錄的形式存在,一個record 是多個chunk的組合),而不是一個chunk

dwWidth

指定該AVI文件的寬,以像素爲單位。

dwHeight

指定該AVI文件的高,以像素爲單位。

dwReserved

保留,設置爲0

Requirements

Header: Aviriff.h.

----------------AVISTREAMHEADER結構體------------------------

AVISTREAMHEADER結構體包含了AVI文件中一個流的相關信息。

Syntax

typedef struct _avistreamheader {     FOURCC fcc;     DWORD  cb;     FOURCC fccType;     FOURCC fccHandler;     DWORD  dwFlags;     WORD   wPriority;     WORD   wLanguage;     DWORD  dwInitialFrames;     DWORD  dwScale;     DWORD  dwRate;     DWORD  dwStart;     DWORD  dwLength;     DWORD  dwSuggestedBufferSize;     DWORD  dwQuality;     DWORD  dwSampleSize;     struct {         short int left;         short int top;         short int right;         short int bottom;     }  rcFrame;} AVISTREAMHEADER;

Members

fcc

指定一個FOURCC碼,此處必須爲'strh'

cb

指定結構體的大小,不包含開頭的8字節,即fcccb所佔的空間。

fccType

包含一個標識流中數據類型的FOURCC碼。針對視頻和音頻,標準的AVI值定義如下:

FOURCC

Description

'auds'

Audio stream

'mids'

MIDI stream

'txts'

Text stream

'vids'

Video stream


fccHandler

該成員是可選的,包含了一個FOURCC碼,用於標識一個特定的數據處理程序。該數據處理程序是該流的首選數據處理程序。對於視頻流和音頻流來說,這是一個解碼流時用的編解碼器。

dwFlags

包含數據流的所有標誌。這些標誌的高位序字,具體到流中包含的數據類型(意思應該是,這些標誌的高位,說明了流的類型)。標準標誌定義如下:

AVISF_DISABLED

表明該流默認情況下不被啓用。

AVISF_VIDEO_PALCHANGES

表明該流中包含調色板變換。該標誌提示播放軟件,它需要可變的調試板。


wPriority

指定一種流的優先級。例如,一個文件中包含了多個音頻流,其中優先級最高的可能會是默認的流。

wLanguage

Language tag.

dwInitialFrames

指定在交叉文件中,音頻流相對於視頻流要向前偏移多少。通常情況下,是大約0.75秒。如果你正在創建交叉文件,在該成員中指定文件中,AVI序列的初始幀之前,幀的數量。詳細信息,請參考AVIMAINHEADER結構體中 dwInitialFrames 成員。

dwScale

與 dwRate 一起,決定該流所要使用的時間尺度。用dwScale 去除dwRate ,得到一秒鐘樣本的數量。對於視頻流,這就是幀率( fram rate )。對於音頻流,這個頻率相當於播放nBlockAlign 個字節的音頻需要的時間,對於PCM音頻,它只是採樣率。

dwRate

參考dwScale.

dwStart

指定這個流開始的時間。其單位有主文件頭中的dwRate dwScale 成員定義(即其單位是dwRate/dwScale)。通常,dwStart0,但是它也可以爲不與文件同時啓動的流定義一個時間延遲。

dwLength

指定這個流的長度。單位由流的頭信息中的dwRate dwScale 來確定(即其單位是dwRate/dwScale)。(對於視頻流,dwLength就是流包含的總幀數;對於音頻流,dwLength就是包含的block的數量,block是音頻解碼器能處理的原子單位)。dwLength/(dwRate/dwScale),即dwLength * dwScale / dwRate,可以得到流的總時長。

dwSuggestedBufferSize

指定讀該流時需要的緩存的大小。通常情況下,這是一個與該流中最大的chunk的大小相對應的值。使用準確的緩存大小,可以提高播放器的性能。如果你不知道準確的緩存大小,可以設置爲0

dwQuality

指定一個流數據的質量指標。該指標是一個010,000的數值。對於壓縮數據,這通常是一個作爲質量參數值傳給壓縮軟件的數值。如果該值爲-1,驅動將使用默認的質量值。

dwSampleSize

指定 一個數據樣本的大小。如果樣本的大小可變,該成員將被設置爲0。如果該值爲非0,該文件中的多個樣本可以組成一個信號chunk。如果該值爲0,數據中的每個樣本(例如,一個視頻幀)必須放在一個單獨的chunk中。對於視頻流,該數值通常爲0,雖然當所有的視頻幀都具有相同的大小時,它也可以爲非0。對於音頻流,該數值應該和結構體WAVEFORMATEX中的成員nBlockAlign一致。

rcFrame

指定一個在由AVI主頭結構中的dwWidth 成員和dwHeight 成員決定的電影矩形中,文本流或視頻流的目標矩形。rcFrame 成員通常用於支持多個視頻流。將該矩形設置爲與電影矩形對應的座標,以更新整個電影矩形。該成員的單位是像素。目標矩形的左上角與電影矩形的左上角關聯。

Remarks

該結構體的部分成員在結構體AVIMAINHEADER中也存在。AVIMAINHEADER中的數據是針對整個文件的,AVISTREAMHEADER中的數據是針對單個流的。

Requirements

Header: Aviriff.h.

----------------BITMAPINFO結構體------------------------BITMAPINFO結構體定義了一個基於windows的DIB(device-independent bitmap)的尺寸和顏色信息。

Syntax

typedef struct tagBITMAPINFO {   BITMAPINFOHEADER bmiHeader;   RGBQUAD bmiColors[1]; } BITMAPINFO;

Members

  • bmiHeader

  • 指定一個包含尺寸和顏色格式信息的位圖信息頭結構體。使用BITMAPINFOHEADER結構體。

  • bmiColors

  • 包含下列之一:


    • 一個RGBQUAD結構體的數組。其成員構成顏色表。


    • 一個指定當前實現了的邏輯調色板中 的索引的16位無符號整型。

    • 使用DIB的函數允許使用bmiColors 的這種用法。如果bmiColors 包含了一個已實現的邏輯調色板的索引,它們必須調用如下的位圖函數:CreateDIBPatternBrushPt和 CreateDIBSectionCreateDIBSection 函數的參數iUsage 必須被設置爲DIB_PAL_COLORS 

    • 其中條目的個數依賴於BITMAPINFOHEADER 結構體中的biBitCount biClrUsed成員。

    • bmiColors 表中的顏色按重要性進行排列。詳細信息,請參考:Remarks


    • 如果bmiHeader.biCompression 被設置爲了BI_RGB ,你可以將bmiColors 數組的大小設置爲0

Remarks

一個設備無關的位圖包含兩個不同的部分:一個描述位圖尺寸和顏色的BITMAPINFO結構體,和一個定義位圖像素的字節數組。數組中的數據排列在一起,但是必須用0將每個掃描行與LONG類型邊界對齊。

如果位圖的高是正數,則該位圖是一個自下而上的DIP,並且它是以左下角起始的。

如果位圖的高是負數,則該位圖是一個自上而下的DIP,並且它是以左上角起始的。

當一個位圖緊跟在BITMAPINFO 之後時,該位圖將被打包。打包的位圖通過一個指針進行引用。

對於打包位圖,當使用DIB_PAL_COLORS 模式時,BITMAPINFOHEADER 結構體的ClrUsed 必須被設置爲一個偶數,這樣DIB位圖數組將從DWORD邊界上開始。

如果一個位圖保存在文件中,或者將要傳送給其他應用程序,bmiColors 成員不應該保護調色板索引。

位圖的顏色表應保護明確的RGB數值,除非這個應用程序獨佔使用和控制該位圖。

Security Note   包括無效格式描述的普通級別的錯誤,可以在內容(哪兒?)中找到。例如,顏色表可以跟在BITMAPINFOHEADER 結構體後面。

BITMAPINFO 結構體由一個BITMAPINFOHEADER 結構體以及一個跟在其後面的RGBQUAD 數值數組構成。數組的大小由BITMAPINFOHEADER結構體的成員biClrUsed 決定。

在驗證分配給BITMAPINFO 結構體的buffer的大小之前,不要將一個顏色表拷貝到BITMAPINFO 結構體。

Requirements

OS Versions: Windows CE 1.0 and later.
Header: Windows.h.

----------------BITMAPINFOHEADER結構體------------------------(以下的解釋來自:http://msdn.microsoft.com/en-us/library/dd183376(VS.85).aspx。後面還會有一個對該結構體的說明,與此稍有不同。)該結構體包含了一個DIB(device-independent bitmap)尺寸和顏色個數的信息。

Syntax


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

Members

  • biSize

  • 指定結構體的大小,以字節爲單位。

  • 該大小不包含biClrUsed 成員中提到的顏色表或者屏蔽位的大小。

  • 詳細請參考Remarks 

  • biWidth

  • 指定位圖的寬,以像素爲單位。

  • biHeight

  • 指定位圖的高,以像素爲單位。

  • 如果biHeight 正值,則該位圖是一個自下而上的DIB,並且它從左下角開始。

  • 如果biHeight 負值,則該位圖是一個自上而下的DIB,並且它從左上角開始。

  • 如果biHeight 負值,表明了一個自上而下的DIB,此時,biCompression 必須被設置爲BI_RGB 或者 BI_BITFIELDS。自上而下的DIB不能被壓縮。

  • biPlanes

  • 指定目標設備平面層(plane)的個數。

  • 該值必須被設置爲1

  • biBitCount

  • 指定一個像素所佔的位數。

  • BITMAPINFOHEADER 結構體的biBitCount 成員決定了一個像素佔幾個位,以及位圖中包含的最大的顏色數。

  • 該成員只能包含一個如下的值:

Value

Description

1

說明該位圖是一個黑白的,bmiColors 成員包含兩個條目。

在該位圖中,每一位代表一個像素。

如果該位爲0, 則該像素用bmiColors 表中的第一個條目中的顏色進行顯示。

如果該位爲1, 則該像素用bmiColors 表中的第二個條目中的顏色進行顯示。

2

位圖可以有4種顏色值。

4

位圖最大可以有16種顏色,bmiColors 成員包含16個條目。

位圖中的每一個像素,由顏色表中的一個4位的索引進行表示。

例如,如果位圖中的第一個字節爲 0x1F,該字節表示兩個像素。第一個像素包含表中的第二個條目的顏色,第二個像素包含表中第16個條目的顏色。

8

位圖最大可以有256種顏色,bmiColors 成員包含256個條目。在這種情況下,數組中的每一個字節標示一個像素。

16

位圖最大可以有2^16 種顏色。

如果BITMAPINFOHEADER 結構體的biCompression 成員爲BI_RGB ,則bmiColors 成員NULL 

該位圖中,每一個字代表一個像素。紅色,綠色和藍色的相對強度,由每個顏色組件的5個位來表示。

對應藍色的值,在最低的5個位,其後是分別對應綠色和紅色的各5位。

最高的一位沒有使用。bmiColors 顏色表用於優化基於調色板設備的顏色,並且必須包含BITMAPINFOHEADER 結構體的biClrUsed 成員指定的條目的個數。

24

位圖最大可以有2^24 種顏色,並且bmiColors 成員爲NULL

位圖數組中的每三個字節,表示一個像素中藍色,綠色和紅色的相對強度。

bmiColors 顏色表用於優化基於調色板設備的顏色,並且必須包含BITMAPINFOHEADER結構體的biClrUsed 成員指定的條目的個數。

32

位圖最大可以有2^32 種顏色。如果結構體BITMAPINFOHEADER 的成員biCompressionBI_RGB ,則成員bmiColors NULL。位圖數組中的一個DWORD 代表一個像素中藍色,綠色和紅色的相對強度。DWORD 中的最高一個字節沒有使用。bmiColors 顏色表用於優化基於調色板設備的顏色,並且必須包含BITMAPINFOHEADER 結構體的biClrUsed成員指定的條目的個數。

如果結構體BITMAPINFOHEADER 的成員biCompression 爲 BI_BITFIELDS,成員bmiColors 包含三個DWORD 顏色掩碼,分別用於指定一個像素中的紅色,綠色和藍色。

位圖數組中的一個DWORD 代表一個像素。



  • biCompression

  • 指定一個壓縮的自下而上的位圖(自上而下的DIB不能被壓縮)的壓縮類型。該成員可以包含一個如下的值:

Value

Description

BI_RGB

一個未壓縮的格式。

BI_BITFIELDS

指定該位圖沒有被壓縮,並且顏色表中包含三個DWORD 顏色掩碼,分別用於指定一個像素中的紅色,綠色和藍色。

該值對16- 和 32-bpp 位圖有效。

該值對WinCE 2.0及以後版本有效。

BI_ALPHABITFIELDS

指定該位圖沒有被壓縮,並且顏色表中包含三個DWORD 顏色掩碼,分別用於指定一個像素中的紅色,綠色,藍色和alpha組件。

該值對16- 和 32-bpp 位圖有效。

該值對WinCE 4.0及以後版本有效。



  • 你可以將上表中的任何一個值與BI_SRCPREROTATE 進行或,以指定源DIB部分與目標部分有相同的轉角。

  • biSizeImage

  • 指定p_w_picpath的大小,以size爲單位。

  • 對於BI_RGB 位圖,該值可以設置爲0

  • biXPelsPerMeter

  • 以每米中包含的像素的個數爲單位,指定目標設備中對於位圖的水平分辨率。

  • 應用程序可以使用該值,從源組中選擇一個最佳匹配當前設備特性的位圖。

  • biYPelsPerMeter

  • 以每米中包含的像素的個數爲單位,指定目標設備中對於位圖的垂直分辨率。

  • biClrUsed

  • 指定顏色表中,位圖真正使用的顏色索引的個數。

  • 如果該值爲0, 位圖使用成員biCompression 指定的壓縮模式需要的,與成員biBitCount 相應的最大的顏色數。

  • 如果該值爲非0, 並且成員biBitCount 小於16, 成員biClrUsed 指定圖像引擎或者設備驅動真正使用的顏色數。

  • 如果成員biBitCount 大於16, 成員biClrUsed 指定用於優化系統調色板性能的顏色表的大小。

  • 如果成員biBitCount <span sty


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章