??xml version="1.0" encoding="utf-8" standalone="yes"?>99精品国产免费久久久久久下载 ,亚洲日本久久久午夜精品,久久精品中文字幕第23页http://m.shnenglu.com/tgh621/category/8163.html专注技术开?/description>zh-cnSat, 27 Dec 2008 04:55:05 GMTSat, 27 Dec 2008 04:55:05 GMT60[转]PSD格式文g的读?/title><link>http://m.shnenglu.com/tgh621/archive/2008/12/26/70462.html</link><dc:creator>大v</dc:creator><author>大v</author><pubDate>Fri, 26 Dec 2008 10:15:00 GMT</pubDate><guid>http://m.shnenglu.com/tgh621/archive/2008/12/26/70462.html</guid><wfw:comment>http://m.shnenglu.com/tgh621/comments/70462.html</wfw:comment><comments>http://m.shnenglu.com/tgh621/archive/2008/12/26/70462.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/tgh621/comments/commentRss/70462.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/tgh621/services/trackbacks/70462.html</trackback:ping><description><![CDATA[<font size=2> PhotoShopQ我x有h会不知道吧。如今最新的版本?.0Q其图象文g*.PSD?.5相比变化q不太大。以下我׃l?.PSD文g的读取方法,q提供完整读取函数。其中:m_Rect为目标区域,m_lpDDS7为目标DirectDraw表面Qm_pbAlphaMask为目标Aplha通告指针。Read16函数Z指定文g当前位置d一个WORDQRead32函数Z指定文g当前位置d一个DWORD。MAX_PSD_CHANNELS?4。以下就?.PSD文g的读取方法,有兴的朋友可以l箋深入研究Q到时可别忘了发我一份?br></font></font><font class=f14 id=zoom><font face=宋体><br></font></font><font face=宋体></font></font><font face=Arial><font class=f14 id=zoom><font face=宋体><font color=#99ccff><font size=2><span id="rv3j9t9" class=ColorCode>  HRESULT LoadPSD( LPSTR strFilename )</span> </font><font color=#c0c0c0><span id="nj93znn" class=ColorCatchword><font size=2>// dPSD文g</font></span></font><font size=2><br><span id="9v9t9fl" class=ColorCode>  {<br>    DWORD dwWidth, dwHeight;</span> <font color=#c0c0c0><span id="1xnt9hp" class=ColorCatchword>// 宽高</span></font><br><span id="h3ft1lr" class=ColorCode>    long lSurfWidth = m_Rect.right - m_Rect.left;<br>    long lSurfHeight = m_Rect.bottom - m_Rect.top;<br>    WORD CompressionType;</span> <font color=#c0c0c0><span id="djnr339" class=ColorCatchword>// 压羃cd</span></font><br><span id="t9xhn9x" class=ColorCode>    HDC hDC;<br>    FILE *fpPSD;<br>    WORD ChannelCount;</span> <font color=#c0c0c0><span id="b9hzx99" class=ColorCatchword>// 通道?/span></font><br><br><span id="z3zb9nv" class=ColorCatchword>    <font color=#c0c0c0>// 打开PSD文g</font></span><br><span id="nbnhv39" class=ColorCode>    if ( ( fpPSD = fopen ( strFilename, "rb" ) ) == NULL ) {<br>      return E_FAIL;<br>    }<br></span><br><span id="z9vplxn" class=ColorCatchword>    <font color=#c0c0c0>// 头四个字节ؓ"8BPS"</font><br></span><span id="ht99b99" class=ColorCode>    char signature[5];<br>    signature[0] = fgetc( fpPSD );<br>    signature[1] = fgetc( fpPSD );<br>    signature[2] = fgetc( fpPSD );<br>    signature[3] = fgetc( fpPSD );<br>    signature[4] = '\0';<br>    if ( strcmp( signature,"8BPS" ) != 0 ) {<br>      return E_FAIL;<br>    }<br></span><br><span id="bptxzz9" class=ColorCatchword>    <font color=#c0c0c0>// 版本必须?</font></span><br><span id="v3999j9" class=ColorCode>    if ( Read16( fpPSD ) != 1 ) {<br>      return E_FAIL;<br>    }<br></span><br><span id="zd9t999" class=ColorCatchword>    <font color=#c0c0c0>// 跌一些数?(L0)</font></span><br><span id="t3jfhrz" class=ColorCode>    Read32( fpPSD );<br>    Read16( fpPSD );<br></span><br><span id="939dljx" class=ColorCatchword>    <font color=#c0c0c0>// d通道?/font><br></span><span id="xjzjdtr" class=ColorCode>    ChannelCount = Read16( fpPSD );</span><br><br><span id="b11x391" class=ColorCatchword>    <font color=#c0c0c0>// 定臛_有一个通道</font><br></span><span id="3jnp999" class=ColorCode>    if ( ( ChannelCount < 0 ) || ( ChannelCount > MAX_PSD_CHANNELS ) ) {<br>      return E_FAIL;<br>    }<br></span><br><span id="j99d3p3" class=ColorCatchword>    <font color=#c0c0c0>// d宽和?/font><br></span><span id="t3txzpx" class=ColorCode>    dwHeight = Read32( fpPSD );<br>    dwWidth = Read32( fpPSD );<br>    if ( dwWidth != ( DWORD )lSurfWidth ||</span> <span id="h9rl319" class=ColorCode>dwHeight != ( DWORD )lSurfHeight ) {<br>      return E_FAIL;<br>    }<br></span><br><span id="9h99vnn" class=ColorCatchword>    <font color=#c0c0c0>// 只读?位通道</font></span><br><span id="3npjl3p" class=ColorCode>    if ( Read16( fpPSD ) != 8 ) {<br>      return E_FAIL;<br>    }<br></span><br><span id="dxbvfnl" class=ColorCatchword><font color=#c0c0c0>    // 定模式为RGB.<br>    // 可能|<br>    // 0: 位图<br>    // 1: 灰阶<br>    // 2: 索引<br>    // 3: RGB<br>    // 4: CMYK<br>    // 7: Multichannel<br>    // 8: Duotone<br>    // 9: Lab</font><br></span><span id="znhj9d9" class=ColorCode>    if ( Read16( fpPSD ) != 3 ) {<br>      return E_FAIL;<br>    }<br></span><br><span id="n3zj1rl" class=ColorCatchword>    <font color=#c0c0c0>// 跌数据Q如调色板)</font><br></span><span id="hv999df" class=ColorCode>    int ModeDataCount = Read32( fpPSD );<br>    if ( ModeDataCount )<br>      fseek( fpPSD, ModeDataCount, SEEK_CUR );<br></span><br><span id="d9393td" class=ColorCatchword>    <font color=#c0c0c0>// 跌数据Q如Qpen tool paths, etcQ?/font><br></span><span id="x39lb3v" class=ColorCode>    int ResourceDataCount = Read32( fpPSD );<br>    if ( ResourceDataCount )<br>      fseek( fpPSD, ResourceDataCount, SEEK_CUR );<br><br></span><span id="399z99j" class=ColorCatchword>    <font color=#c0c0c0>// 条过保留数据</font><br></span><span id="hvx3fl3" class=ColorCode>    int ReservedDataCount = Read32( fpPSD );<br>    if ( ReservedDataCount )<br>      fseek( fpPSD, ReservedDataCount, SEEK_CUR );<br></span><br><span id="n3xh1db" class=ColorCatchword><font color=#c0c0c0>    // 0: 非压~?br>    // 1: RLE压羃</font><br></span><span id="3l9x9xd" class=ColorCode>    CompressionType = Read16( fpPSD );<br>    if ( CompressionType > 1 ) {<br>      return E_FAIL;<br>    }<br><br>    BYTE* PSDPixels = new BYTE[ ( lSurfWidth * lSurfHeight ) * 4 ];<br></span><br><span id="n3hjnl3" class=ColorCatchword><font color=#c0c0c0>    // 解包数据</font><br></span><span id="x9xjbb9" class=ColorCode>    UnPackPSD( fpPSD, lSurfWidth, lSurfHeight, PSDPixels, ChannelCount, CompressionType );<br><br>    fclose( fpPSD );<br></span><br><span id="nr3f9f9" class=ColorCatchword><font color=#c0c0c0>    // 复制信息</font><br></span><span id="93t93r9" class=ColorCode>    BITMAPINFO BitmapInfo;<br>    ZeroMemory( &BitmapInfo, sizeof( BitmapInfo ) );<br>    BitmapInfo.bmiHeader.biSize = sizeof( BitmapInfo.bmiHeader );<br>    BitmapInfo.bmiHeader.biWidth = lSurfWidth;<br>    BitmapInfo.bmiHeader.biHeight = -lSurfHeight;<br>    BitmapInfo.bmiHeader.biPlanes = 1;<br>    BitmapInfo.bmiHeader.biBitCount = 32;<br><br>    m_lpDDS7->GetDC( &hDC );<br><br>    int rc = StretchDIBits( hDC,<br>                0,<br>                0,<br>                lSurfWidth,<br>                lSurfHeight,<br>                0,<br>                0,<br>                lSurfWidth,<br>                lSurfHeight,<br>                PSDPixels,<br>                &BitmapInfo,<br>                DIB_RGB_COLORS,<br>                SRCCOPY );<br><br>    m_lpDDS7->ReleaseDC( hDC );<br><br>    if ( rc == GDI_ERROR ) {<br>      H_ARRAY_DELETE( PSDPixels );<br><br>  #ifdef _DEBUG<br>    g_pHERR->OutDebugMsg( 3, H2DSERR_INVALID_PSD );<br>  #endif<br>    return E_FAIL;<br><br>    }<br><br></span></font><span id="r3pbl3r" class=ColorCatchword><font size=2>   <font color=#c0c0c0> // 是否dAlpha混合通道</font><br></font></span><span id="3hjh9vb" class=ColorCode><font size=2>    if( ChannelCount > 3 ) {<br>      m_pbAlphaMask = new BYTE[ lSurfWidth * lSurfHeight ];<br><br>    for ( int x = 0; x < lSurfWidth; x++ )<br>      for ( int y = 0; y < lSurfHeight; y++ ) {<br>        m_pbAlphaMask[ ( y * lSurfWidth ) + x ] =<br>                PSDPixels[ ( ( ( y * lSurfHeight ) + x ) * 4 ) + 3 ];<br>      }<br>    }<br>    else {<br>      m_pbAlphaMask = NULL;<br>    }<br><br>    H_ARRAY_DELETE( PSDPixels );<br><br>    return DD_OK;<br>  }<br><br></font><span id="9fz39z3" class=ColorCatchword><font size=2>  </font><font color=#c0c0c0 size=2>// PSD文g解包</font><font size=2><br> </font></span></span></font> <div align=left><font color=#99ccff><span id="zfhnp33" class=ColorCode><font size=2>  void CHades2DSurface::UnPackPSD( FILE *fp,</font></span><font size=2><span id="9htvx9b" class=ColorCatchword>     // fp为PSD文g指针Q?/span><span id="3x9j9v9" class=ColorCode><br>                   DWORD dwWidth,   </span><span id="rlxrl1x" class=ColorCatchword>// dwWidth、dwHeight为宽高,</span><span id="pt3z3dn" class=ColorCode><br>                   DWORD dwHeight,<br>                   BYTE* pixels,</span><span id="xnxrb9v" class=ColorCatchword>   // pixels包目标指针,</span><span id="vx3zf93" class=ColorCode><br>                   WORD ChannelCnt,</span><span id="33f9193" class=ColorCatchword>  // ChannelCnt为通道敎ͼ</span><span id="ln9933t" class=ColorCode><br>                   WORD Compression )</span></font><span id="f9pztln" class=ColorCatchword><font size=2> // Compression位压~类型?</font></span></font></div> <div align=left><font color=#99ccff><span id="v3vr3n3" class=ColorCatchword><font size=2>                <br>                 <br></font></span><font size=2><span id="pfr3z3h" class=ColorCode>  {<br>    int Default[4] = { 0, 0, 0, 255 };<br>    int chn[4] = { 2, 1, 0, 3};<br>    int PixelCount = dwWidth * dwHeight;<br><br>    if ( Compression ) {<br>      fseek( fp, dwHeight * ChannelCnt * 2, SEEK_CUR );<br><br>      for ( int c = 0; c < 4; c++ ) {<br>        int pn = 0;<br>        int channel = chn[c];<br><br>        if ( channel >= ChannelCnt ) {<br>          for ( pn=0; pn < PixelCount ;pn++ ) {<br>            pixels[ ( pn * 4 ) + channel ] = Default[ channel ];<br>          }<br>        }<br>        else</span> <span id="ldf99t9" class=ColorCatchword>// 非压~?br></span></font><span id="9tfhtlf" class=ColorCode><font size=2>        {<br>          int count = 0;<br>          while( count < PixelCount ) {<br>            int len = fgetc( fp );<br>            if( len == 128 ) { }</font></span></font></div> <div align=left><font color=#99ccff><span id="xn9l939" class=ColorCode><font size=2>            else if ( len < 128 )</font></span><font size=2> </font><span id="jt39j9j" class=ColorCatchword><font size=2>// 非RLE</font></span></font></div> <div align=left><font color=#99ccff><span id="xpjlff9" class=ColorCode><font size=2>            {<br>              len++;<br>              count += len;<br>              while(len) {<br>                pixels[ ( pn * 4 ) + channel ] = fgetc( fp );<br>                pn++;<br>                len--;<br>              }<br>            }<br>             else if ( len > 128 )</font></span><font size=2> <span id="bbnhb3v" class=ColorCatchword>// RLE打包</span><br></font><span id="33h9nn9" class=ColorCode><font size=2>            {<br>              len ^= 0x0FF;<br>              len += 2;<br>              unsigned char val = fgetc( fp );<br>              count += len;<br>              while( len ) {<br>                pixels[ ( pn * 4 ) + channel ] = val;<br>                pn++;<br>                len--;<br>              }<br>            }<br>          }<br>        }<br>      }<br>    }<br>    else<br>    {<br>      for ( int c=0; c < 4; c++ ) {<br>        int channel = chn[c];<br>        if ( channel > ChannelCnt ) {<br>          for( int pn = 0; pn < PixelCount; pn++ ) {<br>            pixels[ ( pn * 4 ) + channel ] = Default[ channel ];<br>          }<br>        }<br>        else {<br>          for( int n = 0; n < PixelCount; n++ ) {<br>            pixels[ ( n * 4 ) + channel ] = fgetc( fp );<br>          }<br>        }<br>      }<br>    }<br>  }</font></span></font></div> </font></font><font face=宋体></font></font> <img src ="http://m.shnenglu.com/tgh621/aggbug/70462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/tgh621/" target="_blank">大v</a> 2008-12-26 18:15 <a href="http://m.shnenglu.com/tgh621/archive/2008/12/26/70462.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]GIF文档http://m.shnenglu.com/tgh621/archive/2008/12/26/70461.html大v大vFri, 26 Dec 2008 10:14:00 GMThttp://m.shnenglu.com/tgh621/archive/2008/12/26/70461.htmlhttp://m.shnenglu.com/tgh621/comments/70461.htmlhttp://m.shnenglu.com/tgh621/archive/2008/12/26/70461.html#Feedback0http://m.shnenglu.com/tgh621/comments/commentRss/70461.htmlhttp://m.shnenglu.com/tgh621/services/trackbacks/70461.html阅读全文

大v 2008-12-26 18:14 发表评论
]]>
[转]TGA囑փ文g格式资料http://m.shnenglu.com/tgh621/archive/2008/12/26/70460.html大v大vFri, 26 Dec 2008 10:12:00 GMThttp://m.shnenglu.com/tgh621/archive/2008/12/26/70460.htmlhttp://m.shnenglu.com/tgh621/comments/70460.htmlhttp://m.shnenglu.com/tgh621/archive/2008/12/26/70460.html#Feedback0http://m.shnenglu.com/tgh621/comments/commentRss/70460.htmlhttp://m.shnenglu.com/tgh621/services/trackbacks/70460.htmlҎdavid mcduffe~写的TGA文g格式资料译而成
 
本文档是为满多对 TGA 囑փ格式的了解需要而创建的。本文摘录自truevision 技术指南的附录 CQ如?
需要更q一步的信息Q请致信以下地址Q?
at&t
electronic photography and imaging center
2002 wellesley ave.
indianapolis, in 42619
本文档不求全面,但力求准。如果你发现了Q何拼写错误或内容错误Q请告诉我,Q?david mcduffe,
75530,2626 Q,我将Ҏq些错误Q谢谢?
不全面的原因?TGA 包含了超q六U图像文件格式,而其中的几种较ؓ常用?我选择了我现在使用的格式ƈ
在本文中加以详解?如果你需要本文中没有包含的格式说明,你可以与你的 truevision 代理商联pR?/pre>
Ҏ有的 TGA 格式的文件而言Q其W三字节Q二q制整数Q用来区别各U不同的 TGA 文g。下面列Z该字
节表明的对应文gcdQ?/pre>
	0  -  文g中没有图像数?/pre>
	1  -  未压~的Q颜色表囑փ
	2  -  未压~的Qrgb 囑փ
	3  -  未压~的Q黑白图?/pre>
	9  -  runlength ~码的颜色表囑փ
	10 -  runlength ~码?rgb 囑փ
	11 -  压羃的,黑白囑փ
	32 -  使用 huffman,delta ?runlength ~码的颜色表囑փ
	33 -  使用 huffman,delta ?runlength ~码的颜色映图像,4 四叉树cd处理?/pre>
	本文仅仅描述对应 1Q?Q? ?10 的文件格式?
--------------------------------------------------------------------------------
|数据cd 1Q?颜色?color-mapped)囑փ
|--------|--------|------------------------------------------------------------
|  偏移  |  长度  |                            描述
|--------|--------|------------------------------------------------------------
|    0   |     1  |  囑փ信息字段Q见本子表的后面Q的字符?
|        |        |
|        |        |  本字D| 1 字节无符h型,指出了图像格式区别字D长?
|        |        |  其取D围是 0 ?255 Q当它ؓ 0 时表C没有图像的
|        |        |  信息字段?
|        |        |
|        |        |
|--------|--------|------------------------------------------------------------
|    1   |     1  |  颜色表的cd
|        |        |
|        |        |  该字Dؓ表示对应格式 1 的图像而包含一个二q制 1
|        |        |
|--------|--------|------------------------------------------------------------
|    2   |     1  |  囑փcd?
|        |        |
|        |        |  该字D|Mؓ 1 Q?q也是此cd为格?1 的原?
|        |        |
|--------|--------|------------------------------------------------------------
|    3   |     5  |  颜色表规?
|        |        |
|    3   |     2  |  颜色表首址
|        |        |  颜色表首元表的整型Q低?高位Q烦?
|        |        |
|    5   |     2  |  颜色表的长度
|        |        |  颜色表的表项LQ整型(低位-高位Q?
|        |        |
|    7   |     1  |  颜色表表的位(bitQ数
|        |        |  16 代表 16 ?TGA Q?4 代表 24 ?TGA Q?2 代表 32 ?TGA
|        |        |
|        |        |
|--------|--------|------------------------------------------------------------
|    8   |    10  |  囑փ规格
|        |        |
|    8   |     2  |  囑փ x 坐标起始位置
|        |        |  囑փ左下?x 坐标的整型(低位-高位Q?
|        |        |
|        |        |
|   10   |     2  |  囑փ y 坐标起始位置
|        |        |  囑փ左下?y 坐标的整型(低位-高位Q?
|        |        |
|        |        |
|   12   |     2  |  囑փ宽度
|        |        |  以像素ؓ单位Q图像宽度的整型Q低?高位Q?
|        |        |
|   14   |     2  |  囑փ高度
|        |        |  以像素ؓ单位Q图像高度的整型Q低?高位Q?
|        |        |
|   16   |     1  |  囑փ每像素存储占用位QbitQ数
|        |        |
|        |        |
|   17   |     1  |  囑փ描述W字?
|        |        |  bits 3-0 - 每像素的属性位QbitQ数
|        |        |
|        |        |  bit 4    - 保留Q必Mؓ 0
|        |        |  bit 5    - 屏幕起始位置标志
|        |        |             0 = 原点在左下角
|        |        |             1 = 原点在左上角
|        |        |             truevision 囑փ必须?0
|        |        |  bits 7-6 - 交叉数据存储标志
|        |        |             00 = 无交?
|        |        |             01 = 两\?偶交?
|        |        |             10 = 四\交叉
|        |        |             11 = 保留
|        |        |  q一应该设?0Q不要问我ؓ什?
|        |        |
|--------|--------|------------------------------------------------------------
|   18   |  可变  |  囑փ信息字段
|        |        |  包含一个自由格式的Q长度是囑փ记录块偏U?0 处的字节中的
|        |        |  倹{它常常被忽略(卛_U?0 处gؓ 0 Q,注意其最大可?
|        |        |  含有 255 个字W。如果需要存储更多信息,可以攑֜囑փ数据
|        |        |  之后
|        |        |
|        |        |
|--------|--------|------------------------------------------------------------
|  可变  |  可变  |  颜色表数?
|        |        |
|        |        |  起始位置由前一个字D늚大小军_Q其长度由单Ҏ据大?
|        |        |  和数据项数目军_Q在前面相应的说明字D中l出Q?
|        |        |  每项?2 字节Q? 字节?4 字节Q字节中没有使用的位QbitQ?
|        |        |  被认为是属性位?
|        |        |
|        |        |  4 字节表项中,字节 1 表示 BLUEQ字?2 表示 GREENQ?
|        |        |  		    字节 3 表示 REDQ字?4 表示属?
|        |        |  3 字节表项中各字节依次对应 BLUEQGREENQRED
|        |        |
|        |        |  2 字节表项中,两个字节分解成如下Ş式:
|        |        |  arrrrrgg gggbbbbb
|        |        |  但是Q由于低位在前,高位在后的存储顺序,从文件中d表项
|        |        |  Ӟ先d gggbbbbb 而后d arrrrrgg Qa 表示属性位?
|        |        |
|--------|--------|------------------------------------------------------------
|  可变  |  可变  |  囑փ数据字段
|        |        |
|        |        |  该字D늻Z Q高度)xQ宽度)个颜色表烦引,每个索引
|        |        |  以整C字节的Ş式存储(典型的例子如 1 ?2 个字节)
|        |        |  所有的数据都没有符P对于 2-字节表项而言Q低位字节是
|        |        |  先存储的?
|        |        |
-------------------------------------------------------------------------------
--------------------------------------------------------------------------------
|数据cd 2Q?无颜色表 rgb 囑փ
|--------|--------|------------------------------------------------------------
|   偏移 |   长度 |                         描述
|--------|--------|----------------------------------------------------------
|    0   |     1  |  囑փ信息字段Q?见本子表的后?Q的字符?
|        |        |
|        |        |  本字D| 1 字节无符h型,指出了图像格式区别字D长?
|        |        |  其取D围是 0 ?255 Q当它ؓ 0 时表C没有图像的
|        |        |  信息字段?
|        |        |
|--------|--------|------------------------------------------------------------
|    1   |     1  |  颜色表类?
|        |        |
|        |        |  该字D늚内容或者ؓ 0 或者ؓ 1Q? 表示没有颜色表,1 表示
|        |        |  颜色表存在。由于本格式是无颜色表的Q因此此w常被忽略?
|        |        |  提示Q如果置?1Qtarga l画E序Q将把边框颜色设|ؓ映射
|        |        |        中的W一U颜?
|        |        |
|--------|--------|------------------------------------------------------------
|    2   |     1  |  囑փcd?
|        |        |
|        |        |  该字D|Mؓ 2 Q?q也是此cd为格?2 的原?
|        |        |
|--------|--------|------------------------------------------------------------
|    3   |     5  |  颜色表规?
|        |        |
|        |        |  如果颜色表类型字Dؓ 0 则被忽略Q否则描q如?
|        |        |
|    3   |     2  |  颜色表首址
|        |        |  颜色表首元入口的整型Q低?高位Q烦?
|        |        |
|    5   |     2  |  颜色表的长度
|        |        |  颜色表的表项LQ整型(低位-高位Q?
|        |        |
|    7   |     1  |  颜色表表的位(bitQ数
|        |        |  16 代表 16 ?TGA Q?4 代表 24 ?TGA Q?2 代表 32 ?TGA
|        |        |
|        |        |
|--------|--------|------------------------------------------------------------
|    8   |    10  |  囑փ规格
|        |        |
|    8   |     2  |  囑փ x 坐标起始位置
|        |        |  囑փ左下?x 坐标的整型(低位-高位Q?
|        |        |
|        |        |
|   10   |     2  |  囑փ y 坐标起始位置
|        |        |  囑փ左下?y 坐标的整型(低位-高位Q?
|        |        |
|        |        |
|   12   |     2  |  囑փ宽度
|        |        |  以像素ؓ单位Q图像宽度的整型Q低?高位Q?
|        |        |
|   14   |     2  |  囑փ高度
|        |        |  以像素ؓ单位Q图像高度的整型Q低?高位Q?
|        |        |
|   16   |     1  |  囑փ每像素存储占用位QbitQ数
|        |        |  它的gؓ16Q?4 ?32 {等军_了该囑փ?TGA 16QTGA24
|        |        |  TGA 32 {等
|        |        |
|   17   |     1  |  囑փ描述W字?
|        |        |  bits 3-0 - 每像素对应的属性位的位敎ͼ对于 	TGA 16Q?
|        |        |             该gؓ 0 ?1Q对?TGA 24Q该gؓ 0Q?
|        |        |             对于 TGA 32Q该gؓ 8
|        |        |
|        |        |  bit 4    - 保留Q必Mؓ 0
|        |        |  bit 5    - 屏幕起始位置标志
|        |        |             0 = 原点在左下角
|        |        |             1 = 原点在左上角
|        |        |             对于 truevision 囑փ必须?0
|        |        |  bits 7-6 - 交叉数据存储标志
|        |        |             00 = 无交?
|        |        |             01 = 两\?偶交?
|        |        |             10 = 四\交叉
|        |        |             11 = 保留
|        |        |
|--------|--------|------------------------------------------------------------
|   18   | 可变   |  囑փ信息字段
|        |        |  包含一个自由格式的Q长度是囑փ记录块偏U?0 处的字节中的
|        |        |  倹{它常常被忽略(卛_U?0 处gؓ 0 Q,注意其最大可?
|        |        |  含有 255 个字W。如果需要存储更多信息,可以攑֜囑փ数据
|        |        |  之后
|        |        |
|--------|--------|------------------------------------------------------------
|  可变  |  可变  |  颜色表数?
|        |        |
|        |        |  如果颜色表类型ؓ 0Q则该域不存在,否则过该域直接d
|        |        |  囑փ颜色表规g描述了每的字节敎ͼ?2Q?Q? 之一
|        |        |
|        |        |
|        |        |
|        |        |
|--------|--------|------------------------------------------------------------
|  可变  |  可变  |  囑փ数据?
|        |        |
|        |        |  q里存储了(宽度QxQ高度)个像素,每个像素中的 rgb 色?
|        |        |  该色值包含整C字节
|        |        |
|        |        |
|        |        |  3 字节表项中各字节依次对应 BLUEQGREENQRED
|        |        |
|        |        |  2 字节表项中,两个字节分解成如下Ş式:
|        |        |  arrrrrgg gggbbbbb
|        |        |  但是Q由于低位在前,高位在后的存储顺序,从文件中d表项
|        |        |  Ӟ先d gggbbbbb 而后d arrrrrgg Qa 表示属性位
|        |        |
|        |        |  4 字节表项包含了分别代?blue,green,red 及属性的四个
|        |        |  字节Q(׃g上的原因Q有的时?TGA 24 cd的图像也?
|        |        |  TGA 32 cd的图像那样存?
|        |        |
|        |        |
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
|数据cd 9:  runlength ~码Q带颜色表的囑փ
|--------|--------|------------------------------------------------------------
|  偏移  |  长度  |                            描述
|--------|--------|------------------------------------------------------------
|    0   |     1  |  囑փ信息字段Q见本子表的后面Q的字符?
|        |        |
|        |        |  本字D| 1 字节无符h型,指出了图像格式区别字D长?
|        |        |  其取D围是 0 ?255 Q当它ؓ 0 时表C没有图像的
|        |        |  信息字段?
|        |        |
|--------|--------|------------------------------------------------------------
|    1   |     1  |  颜色表的cd
|        |        |
|        |        |  该字Dؓ表示对应带颜色表的图像而Mؓ 1
|        |        |
|--------|--------|------------------------------------------------------------
|    2   |     1  |  囑փcd?
|        |        |
|        |        |  本类型该字段Zq制 9
|        |        |
|--------|--------|------------------------------------------------------------
|    3   |     5  |  颜色表规?
|        |        |
|        |        |  如果颜色表类型字Dؓ 0 则被忽略Q否则描q如?
|        |        |
|        |        |
|    3   |     2  |  颜色表首址
|        |        |  颜色表首元入口的整型Q低?高位Q烦?
|        |        |
|    5   |     2  |  颜色表的长度
|        |        |  颜色表的表项LQ整型(低位-高位Q?
|        |        |
|    7   |     1  |  颜色表表的位(bitQ数
|        |        |  16 代表 16 ?TGA Q?4 代表 24 ?TGA Q?2 代表 32 ?TGA
|        |        |
|--------|--------|------------------------------------------------------------
|    8   |    10  |  囑փ规格
|        |        |
|    8   |     2  |  囑փ x 坐标起始位置
|        |        |  囑փ左下?x 坐标的整型(低位-高位Q?
|        |        |
|        |        |
|   10   |     2  |  囑փ y 坐标起始位置
|        |        |  囑փ左下?y 坐标的整型(低位-高位Q?
|        |        |
|        |        |
|   12   |     2  |  囑փ宽度
|        |        |  以像素ؓ单位Q图像宽度的整型Q低?高位Q?
|        |        |
|   14   |     2  |  囑փ高度
|        |        |  以像素ؓ单位Q图像高度的整型Q低?高位Q?
|        |        |
|   16   |     1  |  囑փ每像素存储占用位QbitQ数
|        |        |
|        |        |
|   17   |     1  |  囑փ描述W字?
|        |        |  bits 3-0 - 每像素的属性位QbitQ数
|        |        |
|        |        |  bit 4    - 保留Q必Mؓ 0
|        |        |  bit 5    - 屏幕起始位置标志
|        |        |             0 = 原点在左下角
|        |        |             1 = 原点在左上角
|        |        |             truevision 囑փ必须?0
|        |        |  bits 7-6 - 交叉数据存储标志
|        |        |             00 = 无交?
|        |        |             01 = 两\?偶交?
|        |        |             10 = 四\交叉
|        |        |             11 = 保留
|        |        |
|--------|--------|------------------------------------------------------------
|   18   | 可变   |  囑փ信息字段
|        |        |  包含一个自由格式的Q长度是囑փ记录块偏U?0 处的字节中的
|        |        |  倹{它常常被忽略(卛_U?0 处gؓ 0 Q,注意其最大可?
|        |        |  含有 255 个字W。如果需要存储更多信息,可以攑֜囑փ数据
|        |        |  之后
|        |        |
|--------|--------|------------------------------------------------------------
|  可变  |  可变  |  颜色表数?
|        |        |
|        |        |  起始位置由前一个字D늚大小军_Q其长度由单Ҏ据大?
|        |        |  和数据项数目军_Q在前面相应的说明字D中l出Q?
|        |        |  每项?2 字节Q? 字节?4 字节Q字节中没有使用的位QbitQ?
|        |        |  被认为是属性位?
|        |        |
|        |        |  4 字节表项中,字节 1 表示 BLUEQ字?2 表示 GREENQ?
|        |        |  		    字节 3 表示 REDQ字?4 表示属?
|        |        |  3 字节表项中各字节依次对应 BLUEQGREENQRED
|        |        |
|        |        |  2 字节表项中,两个字节分解成如下Ş式:
|        |        |  arrrrrgg gggbbbbb
|        |        |  但是Q由于低位在前,高位在后的存储顺序,从文件中d表项
|        |        |  Ӟ先d gggbbbbb 而后d arrrrrgg Qa 表示属性位?
|        |        |
|--------|--------|------------------------------------------------------------
| 可变   |  可变  |  囑փ数据?
|        |        |
|        |        |  本区域给ZQ宽度)xQ高度)个颜色表索引q些索引存放
|        |        |  在数据包中;有两中类型的数据包:run-length 数据包,
|        |        |  以及未加工的数据包,每种cd的数据包含有 1-字节的头信息Q?
|        |        |  Q其中指Z数据包类型和数目Q,其后是可变长度的数据?
|        |        |  头信息中最高位?1 表示 run-length cd的数据包Q当
|        |        |  它ؓ 0 Ӟ表示未加工的数据?
|        |        |
|        |        |  对于 run-length 数据包,头信息含义如?
|        |        |      __________________________________________________
|        |        |      | 1 bit |   7 位的重复记数减一
|        |        |      |   id  |   ׃ 7 位表C的最大gؓ 127Q故最? |
|        |        |      |       |   的运行大ؓ 128Q(译注Q原文ؓ     |
|        |        |      |       |   the largest run sizeQ?         |
|        |        |      |-------|----------------------------------------|
|        |        |      |   1   |  c     c     c     c     c     c    c  |
|        |        |      --------------------------------------------------
|        |        |
|        |        |  对于未加工数据包Q头信息的含义如?
|        |        |      __________________________________________________
|        |        |      | 1 bit |   7 位的像素个数减一                   |
|        |        |      |   id  |   ׃ 7 位表C的最大gؓ 127Q故?   |
|        |        |      |       |   cd的一个数据包中像素个C能大?  |
|        |        |      |       |   128                                  |
|        |        |      |-------|----------------------------------------|
|        |        |      |   0   |  n     n     n     n     n     n    n  |
|        |        |      --------------------------------------------------
|        |        |
|        |        |  对于 run-length 数据包而言Q头信息之后是一个简单的
|        |        |  颜色索引Q且假定该烦引被重复头信息中?7 位表C的ơ数
|        |        |  run-length 数据包也怼跨越扫描U?
|        |        |  Q扫描线起始于某行结束于下一行)
|        |        |
|        |        |  对于未加工的数据包,头信息之后是颜色索引Q数值由头信?
|        |        |  l出Q该cd的数据包也可能跨扫描线
|        |        |
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
|数据cd 10Qrun length ~码Qrgb 囑փ
|--------|--------|------------------------------------------------------------
|   偏移 |   长度 |                         描述
|--------|--------|------------------------------------------------------------
|    0   |     1  |  囑փ信息字段Q见本子表的后面Q的字符?
|        |        |
|        |        |  本字D| 1 字节无符h型,指出了图像格式区别字D长?
|        |        |  其取D围是 0 ?255 Q当它ؓ 0 时表C没有图像的
|        |        |  信息字段?
|        |        |
|--------|--------|------------------------------------------------------------
|    1   |     1  |  该字D늚内容或者ؓ 0 或者ؓ 1Q? 表示没有颜色表,1 表示
|        |        |  颜色表存在。由于本格式是无颜色表的Q因此此w常被忽略?
|        |        |  提示Q如果置?1Qtarga l画E序Q将把边框颜色设|ؓ映射
|        |        |        中的W一U颜?
|        |        |
|--------|--------|------------------------------------------------------------
|    2   |     1  |  囑փcd代码
|        |        |
|        |        |  本类型该字段Zq制 10
|        |        |
|--------|--------|------------------------------------------------------------
|    3   |     5  |  颜色表规?
|        |        |
|        |        |  如果颜色表类型字Dؓ 0 则被忽略Q否则描q如?
|        |        |
|        |        |
|    3   |     2  |  颜色表首址
|        |        |  颜色表首元入口的整型Q低?高位Q烦?
|        |        |
|    5   |     2  |  颜色表的长度
|        |        |  颜色表的表项LQ整型(低位-高位Q?
|        |        |
|    7   |     1  |  颜色表表的位(bitQ数
|        |        |  16 代表 16 ?TGA Q?4 代表 24 ?TGA Q?2 代表 32 ?TGA
|        |        |
|--------|--------|------------------------------------------------------------
|    8   |    10  |  囑փ规格
|        |        |
|    8   |     2  |  囑փ x 坐标起始位置
|        |        |  囑փ左下?x 坐标的整型(低位-高位Q?
|        |        |
|        |        |
|   10   |     2  |  囑փ y 坐标起始位置
|        |        |  囑փ左下?y 坐标的整型(低位-高位Q?
|        |        |
|        |        |
|   12   |     2  |  囑փ宽度
|        |        |  以像素ؓ单位Q图像宽度的整型Q低?高位Q?
|        |        |
|   14   |     2  |  囑փ高度
|        |        |  以像素ؓ单位Q图像高度的整型Q低?高位Q?
|        |        |
|   16   |     1  |  囑փ每像素存储占用位QbitQ数
|        |        |
|        |        |
|   17   |     1  |  囑փ描述W字?
|        |        |  bits 3-0 - 每像素的属性位QbitQ数
|        |        |
|        |        |  bit 4    - 保留Q必Mؓ 0
|        |        |  bit 5    - 屏幕起始位置标志
|        |        |             0 = 原点在左下角
|        |        |             1 = 原点在左上角
|        |        |             truevision 囑փ必须?0
|        |        |  bits 7-6 - 交叉数据存储标志
|        |        |             00 = 无交?
|        |        |             01 = 两\?偶交?
|        |        |             10 = 四\交叉
|        |        |             11 = 保留
|        |        |
|--------|--------|------------------------------------------------------------
|   18   | 可变   |  囑փ信息字段
|        |        |  包含一个自由格式的Q长度是囑փ记录块偏U?0 处的字节中的
|        |        |  倹{它常常被忽略(卛_U?0 处gؓ 0 Q,注意其最大可?
|        |        |  含有 255 个字W。如果需要存储更多信息,可以攑֜囑փ数据
|        |        |  之后
|        |        |
|--------|--------|------------------------------------------------------------
|  可变  |  可变  |  颜色表数?
|        |        |
|        |        |  如果颜色表类型ؓ 0Q则该域不存在,否则过该域直接d
|        |        |  囑փ颜色表规g描述了每的字节敎ͼ?2Q?Q? 之一
|        |        |
|--------|--------|------------------------------------------------------------
| 可变   |  可变  |  囑փ数据?
|        |        |
|        |        |  本区域给ZQ宽度)xQ高度)个颜色表索引q些索引存放
|        |        |  在数据包中;有两中类型的数据包:run-length 数据包,
|        |        |  以及未加工的数据包,每种cd的数据包含有 1-字节的头信息Q?
|        |        |  Q其中指Z数据包类型和数目Q,其后是可变长度的数据?
|        |        |  头信息中最高位?1 表示 run-length cd的数据包Q当
|        |        |  它ؓ 0 Ӟ表示未加工的数据?
|        |        |
|        |        |  对于 run-length 数据包,头信息含义如?
|        |        |      __________________________________________________
|        |        |      | 1 bit |   7 位的重复记数减一
|        |        |      |   id  |   ׃ 7 位表C的最大gؓ 127Q故最? |
|        |        |      |       |   的运行大ؓ 128Q(译注Q原文ؓ     |
|        |        |      |       |   the largest run sizeQ?         |
|        |        |      |-------|----------------------------------------|
|        |        |      |   1   |  c     c     c     c     c     c    c  |
|        |        |      --------------------------------------------------
|        |        |
|        |        |  对于未加工数据包Q头信息的含义如?
|        |        |      __________________________________________________
|        |        |      | 1 bit |   7 位的像素个数减一                   |
|        |        |      |   id  |   ׃ 7 位表C的最大gؓ 127Q故?   |
|        |        |      |       |   cd的一个数据包中像素个C能大?  |
|        |        |      |       |   128                                  |
|        |        |      |-------|----------------------------------------|
|        |        |      |   0   |  n     n     n     n     n     n    n  |
|        |        |      --------------------------------------------------
|        |        |
|        |        |
|        |        |  对于 run length 数据包,头信息之后是一个简单颜色|
|        |        |  且假定该值重复的ơ数为头信息中记录的?
|        |        |  run-length 数据包也怼跨越扫描U?
|        |        |  Q扫描线起始于某行结束于下一行)
|        |        |
|        |        |  对于未加工数据包Q头信息之后是颜色|数目由头信息指出Q?
|        |        |
|        |        |
|        |        |  颜色表项自n?2-字节Q?-字节?4-字节几种大小Q分?
|        |        |  对应 TGA 16,TGA 24 ?TGA 32QŞ式如下:
|        |        |
|        |        |
|        |        |  3 字节表项中各字节依次对应 BLUEQGREENQRED
|        |        |
|        |        |  2 字节表项中,两个字节分解成如下Ş式:
|        |        |  arrrrrgg gggbbbbb
|        |        |  但是Q由于低位在前,高位在后的存储顺序,从文件中d表项
|        |        |  Ӟ先d gggbbbbb 而后d arrrrrgg Qa 表示属性位
|        |        |
|        |        |  4 字节表项包含了分别代?blue,green,red 及属性的四个
|        |        |  字节Q(׃g上的原因Q有的时?TGA 24 cd的图像也?
|        |        |  TGA 32 cd的图像那样存?
|        |        |
--------------------------------------------------------------------------------


大v 2008-12-26 18:12 发表评论
]]>自绘按钮补遗【{?/title><link>http://m.shnenglu.com/tgh621/archive/2008/09/25/62779.html</link><dc:creator>大v</dc:creator><author>大v</author><pubDate>Thu, 25 Sep 2008 12:19:00 GMT</pubDate><guid>http://m.shnenglu.com/tgh621/archive/2008/09/25/62779.html</guid><wfw:comment>http://m.shnenglu.com/tgh621/comments/62779.html</wfw:comment><comments>http://m.shnenglu.com/tgh621/archive/2008/09/25/62779.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/tgh621/comments/commentRss/62779.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/tgh621/services/trackbacks/62779.html</trackback:ping><description><![CDATA[     摘要:   <a href='http://m.shnenglu.com/tgh621/archive/2008/09/25/62779.html'>阅读全文</a><img src ="http://m.shnenglu.com/tgh621/aggbug/62779.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/tgh621/" target="_blank">大v</a> 2008-09-25 20:19 <a href="http://m.shnenglu.com/tgh621/archive/2008/09/25/62779.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PNG囑փhttp://m.shnenglu.com/tgh621/archive/2008/09/03/60838.html大v大vWed, 03 Sep 2008 10:34:00 GMThttp://m.shnenglu.com/tgh621/archive/2008/09/03/60838.htmlhttp://m.shnenglu.com/tgh621/comments/60838.htmlhttp://m.shnenglu.com/tgh621/archive/2008/09/03/60838.html#Feedback0http://m.shnenglu.com/tgh621/comments/commentRss/60838.htmlhttp://m.shnenglu.com/tgh621/services/trackbacks/60838.html J2MEq_PNG囑փ压羃、解压与加密技?nbsp; 收藏C? java图书资源下蝲
在J2MEq_上PNG囄格式几乎成ؓ了标准,无数台手持设备上q行的J2MEE序几乎都选用PNG来显C图像,包括大量的手机游戏以及手机应用,所以对PNG文g格式的了解,可以更有效的减少Jar SizeQ保护自有知识权?br>        CoCoMo曄对PNG文gq行q一D|间的研究Q包括图像压~、解压以及加解密{,现将研究心得记录如下Q?
PNG文g格式Q?br>        PNG文g格式分ؓPNG-24和PNG-8Q其最大的区别是PNG-24是用24位来保存一个像素|是真彩色Q而PNG-8是用8位烦引值来在调色盘中烦引一个颜Ԍ因ؓ一个烦引值的最大上限ؓ2?ơ方?28Q故调色盘中颜色数最多ؓ128U,所以该文g格式又被叫做PNG-8 128仿色?br>       PNG-24因ؓ其图片容量过大,而且在Nokia和Moto{某些机型上创徏囄p|和显CZ正确{异常时有发生,有时q会严重拖慢昄速度Q故q不常用QCoCoMo认ؓq些异常和^台底层的囑փ解压不无关系。不q该格式最大的优点是可以保存Alpha通道Q同事也曾有q利用该囄格式实现Alpha混合的先例,x随着技术的发展Q手机硬件^台的提升QAlpha混合一定会被广泛的应用Q到那时该格式的最大优势才会真正发挥?br>       PNG-8文g是目前广泛应用的PNG囑փ格式Q其主要有六大块l成Q?br>1.文g?br>2.IHDR?br>3.PLTE?br>4.tRNS?br>5.IDAT?br>6.文g?br>q六大块按顺序排列,也就是说IDAT块永q是在PLTE块之后,期间也会有许多其他的区块用来描述信息Q例如图像的最后修Ҏ间是多少Q图像的创徏者是谁等Q不q这些区块的信息Ҏ们来说都是可有可无的描述信息Q故压羃时一般先向这些区块开刀?/p>

数据块:
除了文g_其中四大数据块和文gN是由l一的数据块文gl构描述的:
        Chunk Length: 4byte
        Chunk Type:   4byte
        Chunk Data:   Chunk Length的长?br>        Chunk CRC:    4byte
例如IHDR块的数据长度?3Q既
        Chunk Length = 13
        Chunk Type = "IHDR"

文g_
用来标示PNG文gQؓ固定?4个字节:0x89504e47 0x0d0a1a0a

IHDR块:
用来描述囑փ的基本信息,其格式ؓQ?br>       囑փ宽:    4byte
       囑փ高:    4byte
       囑փ色深Q?4byte
       颜色cdQ?1byte
       压羃ҎQ?1byte
       滤LҎQ?1byte
       扫描ҎQ?1byte
曄有h问过我,撒叫滤LҎ和扫描方法,汗,说实话我也不知道Q不q我们是在做手机游戏Q不是在搞图形学不是嘛?/p>

PLTE块:
q个是传说中放|调色盘数据的地方啦Q其格式为:
      循环
           REDQ?nbsp;   1byte
           GREENQ?byte
           BLUEQ?nbsp; 1byte
      END
循环长度嘛,不就是Chunk Length / 3的长度嘛Q而且Chunk Length一定ؓ3的倍数?/p>

tRNS块:
q个块时有时无,主要是看你是否用了透明艌Ӏ该区块的格式ؓQ?br>      循环
           if(对应调色盘颜色非透明)
               0xFFQ?nbsp; 1byte
           else
               0x00Q?nbsp; 1byte
      END
循环长度色盘的颜色数Q相当于调色盘颜色表的一个对应表Q标识该颜色是否透明Q?xFF不透明Q?x00透明。故如果用UltraEdit查看PNG文g的二q制~码Q如果看C大片FFQ一般就是tRNS区块啦,因ؓ一个PNG文g一般只有一个透明艌Ӏ?/p>

IDAT块:
q个是存放囑փ数据的地方啦Q这里要注意的是一个PNG文g可能有多个IDAT区块Q而其他三大区块只可能有一个?br>IDAT区块是经q压~的Q所以数据不可读Q压~算法一般ؓLZ77滑动H口法Q如果硬要看里面的数据的话,用zlib库也是可以的QCoCoMo当年pqWindows Mobile上的帝国时代巨变态的用zlib库压~和解压该区块来q一步减PNG文g大小Q真是寸K寔R啊?/p>

IEND块:
该区块虽然也按照数据块的l构Q但Chunk Data是没有的Q所以是固定?6个字节:0x00000000 0x49454e44 0xae426082

PNG囑փ压羃Q?br>        了解了PNG的文件结构,压羃有的放矢了。压~有6个别,可以Ҏ需要选择?br>Level1Q读取PNG文gQ将除六大块之外的所有区块都qo?br>Level2Q文件头是固定的0x89504e47 0x0d0a1a0aQ文件尾是固定的0x00000000 0x49454e44 0xae426082Q去掉!
Level3Q每个区块的Chunk Type我们是否需要呢Q很明显Q我们自己写的压~格式自己应该清楚是按照什么样的顺序,LQ?br>Level4Q每个区块的Chunk Length我们是否需要呢Q?br>           IHDR块:定长13个字节,明显不需要,L?br>           PLTE块:最?28个颜Ԍ为撒要用4byte来记录区块长度而不是用1byte来记录颜色数呢?
           tRNS块:既然有颜色数QtRNS又是调色盘颜色表的对应表Q既数量与颜色数相同Qؓ撒还需要呢Q?br>           IDAT块:我想q个是唯一需?byte来记录长度的区块?br>Level5Q每个区块的Chunk CRC是否需要呢Q?br>           因ؓ计算CRC需要一些时_但对于字节较的区块一般可以忽略不计,所以对于这个问题还是由E序员自己决定吧。对于CRC的计可以参看CoCoMo的另一Blog“PNG文g的CRC码计?#8221;
Level6Q每个区块我们是否要原封不动的保存期数据呢?
          IHDR块:除了宽、高、色深是需要的Q后面那4byte的信息是固定?x03000000
          PLTE块:为撒要用3byte来表CRGB而不?byte?65格式Q压~方法可以参看CoCoMo的另一Blog“关于PNG囑փ压羃的一Ҏ?#8221;
          tRNS块:我想tRNS块是冗余最多的区块了吧Q大D大D늚0xFF明显没有必要Q一般的PNG文g只有一个透明Ԍ为撒要用对应表的Ҏ而不是一个烦引来记录到底哪个是透明色呢Q由于颜色数最?28Q所以只需1byte可以代替tRNS那么?xFF啦?br>          IDAT块:么想法,如果你够变态,把zlib加进来吧Q?/p>

PNG囑փ解压Q?br>        创徏了自定义的文ӞJ2ME端读取后Q就面解压的问题了。我们可以利用此函数来创建ImageQ?br>static Image
createImage(byte[] imageData, int imageOffset, int imageLength)
     前提是传入的imageData与PNG未被压羃前的一致。因为PNG文g格式是固定的Q所以读取自定义的压~文件后Q开始将那些默认的数据再dq去Q实现解压的目的。下面就开始解压之旅吧!
首先要创Z个ByteArrayOutputStream outQ?br>1.写入文g_
out.writeInt(0x89504e47);
out.writeInt(0x0d0a1a0a);
2.写入IHDR?br>out.writeInt(13);
out.writeInt(0x49484452);  //0x49484452为Chunk Type "IHDR"
out.writeInt(width);
out.writeInt(height);
out.writeByte(depth);
out.writeInt(0x03000000);  //压羃时舍掉的4byteQ默?x03000000
out.writeInt(crc);
其他区块Ҏ一_故略q。。?br>3.写入文g?br>out.writeInt(0x00000000);
out.writeInt(0x49454e44);
out.writeInt(0xae426082);
4.转换成数l,创徏Image
byte[] pngBuffer = out.toByteArray();
Image image = Image.createImage(pngBuffer, 0, pngBuffer.length);
哈哈Q大功告成。这里注意如果中途数据写入有错误Q经怼出现创徏Imagep|的异常,而且非常不好调试Q不q只要自定的压羃格式定下来后Q对应的创徏Image的函数只要写一ơ,以后基本不会出问题哈?/p>

PNG囑փ加解密:
        很多人都担心自己辛苦创作的漂亮的术囄很easyp别h拿到了,I其原因是由于PNG文g格式是固定的Q稍微了解的人用UltraEdit很容易就能找到IHDRQPLTE{标识了。CoCoMoq常看GameLoft的图像文Ӟ哈哈。一般是2byte的LengthQ然后紧接着囄数据Q都攑֜一个文仉Q直接拷?q制然后_脓C个新文g里就是一q图。后来的加密技术会把PNG分块Q例如前100个字节一块,紧接着1K一块,最后剩余字节一块,然后把块序打ؕQ用2byte来记录总长度,1byte记录序Q但是这q没有从Ҏ上消除IHDRQIENDq些昄的定位标识,好像在对破解者说Q嘿Q看Q我在q里Q?br>       现在了解了之前的压羃和解压技术,q个问题也就q刃而解了,因ؓChunk LengthQChunk Type和Chunk CRCq些东西都消׃Q甚臌数据块本w的数据都修改了Q我可以按照ImageWidth、ImageHeight、ImageDepth的顺序写数据Q也可以倒过来写。我惛_牛的PNG分析器也是无能ؓ力的吧,唯一可以定位的就只有IDAT区块了,不过q得到该区块的数据Q也应该是一张黑白图?br>       不过在加解密的领域真是道高一,高一丈,CoCoMo很希望和各位共同探讨Q共同提高!



大v 2008-09-03 18:34 发表评论
]]>
(? bmp囑ֈ?/title><link>http://m.shnenglu.com/tgh621/archive/2008/09/03/60837.html</link><dc:creator>大v</dc:creator><author>大v</author><pubDate>Wed, 03 Sep 2008 10:24:00 GMT</pubDate><guid>http://m.shnenglu.com/tgh621/archive/2008/09/03/60837.html</guid><wfw:comment>http://m.shnenglu.com/tgh621/comments/60837.html</wfw:comment><comments>http://m.shnenglu.com/tgh621/archive/2008/09/03/60837.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/tgh621/comments/commentRss/60837.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/tgh621/services/trackbacks/60837.html</trackback:ping><description><![CDATA[<p><font size=3><span>说到囄Q位图(</span><font face="Times New Roman">Bitmap</font><span>Q当然是最单的Q它</span><font face="Times New Roman">Windows</font><span>昄囄的基本格式,其文件扩展名?/span><font face="Times New Roman">*.BMP</font><span>。在</span><font face="Times New Roman">Windows</font><span>下,M各式的图片文Ӟ包括视频播放Q都要{化ؓ位图个时候才能显C出来,各种格式的图片文件也都是在位图格式的基础上采用不同的压羃法生成的(</span><font face="Times New Roman">Flash</font><span>中用了适量图,是按相同颜色区域存储的)?/span></font></p> <p><font size=3><span>一、下面我们来看看位图文gQ?/span><font face="Times New Roman">*.BMP</font><span>Q的格式?/span></font></p> <p><font size=3><span>位图文g主要分ؓ如下</span><font face="Times New Roman">3</font><span>个部分:</span></font></p> <p> <table cellSpacing=0 cellPadding=0 width=487 border=1> <tbody> <tr> <td vAlign=top width=115> <p align=center><span><font size=3>块名U?/font></span></p> </td> <td vAlign=top width=204> <p align=center><font size=3><span>对应</span><font face="Times New Roman">Windows</font><span>l构体定?/span></font></p> </td> <td vAlign=top width=168> <p align=center><font size=3><span>大小Q?/span><font face="Times New Roman">Byte</font><span>Q?/span></font></p> </td> </tr> <tr> <td vAlign=top width=115> <p><span><font size=3>文g信息?/font></span></p> </td> <td vAlign=top width=204> <p><font face="Times New Roman" size=3>BITMAPFILEHEADER</font></p> </td> <td vAlign=top width=168> <p><font face="Times New Roman" size=3>14</font></p> </td> </tr> <tr> <td vAlign=top width=115> <p><span><font size=3>位图信息?/font></span></p> </td> <td vAlign=top width=204> <p><font face="Times New Roman" size=3>BITMAPINFOHEADER</font></p> </td> <td vAlign=top width=168> <p><font face="Times New Roman" size=3>40</font></p> </td> </tr> <tr> <td vAlign=top width=115> <p><font size=3><font face="Times New Roman">RGB</font><span>颜色阵列</span></font></p> </td> <td vAlign=top width=204> <p><font face="Times New Roman" size=3>BYTE*</font></p> </td> <td vAlign=top width=168> <p><span><font size=3>由图像长宽尺寸决?/font></span></p> </td> </tr> </tbody> </table> </p> <p><span><span>1?span>   </span></span></span><font size=3><span>文g信息?/span><font face="Times New Roman">BITMAPFILEHEADER</font></font></p> <p><font size=3><span>l构体定义如下:</span></font></p> <p><span><font size=3>typedef struct tagBITMAPFILEHEADER { /* bmfh */</font></span><span> </span></p> <p><span><font size=3>UINT bfType;<span> </span></font></span><span><br></span><span><font size=3>DWORD bfSize;</font></span><span> <br></span><span><font size=3>UINT bfReserved1;</font></span><span> <br></span><span><font size=3>UINT bfReserved2;</font></span><span> <br></span><font size=3><span>DWORD bfOffBits;</span></font></p> <p><span><font size=3>} BITMAPFILEHEADER;</font></span><span> </span></p> <p><span><font size=3>其中Q?/font></span><span> </span></p> <p> <table cellSpacing=0 cellPadding=0 border=1> <tbody> <tr> <td width=139> <p><span><font size=3>bfType</font></span></p> </td> <td vAlign=top width=451> <p><font size=3><span>说明文g的类型,该值必需?/span><span>0x4D42</span><span>Q也是字符</span><span>'BM'</span><span>?/span></font></p> </td> </tr> <tr> <td width=139> <p><span><font size=3>bfSize</font></span></p> </td> <td vAlign=top width=451> <p><font size=3><span>说明该位图文件的大小Q用字节为单?/span></font></p> </td> </tr> <tr> <td width=139> <p><span><font size=3>bfReserved1</font></span></p> </td> <td vAlign=top width=451> <p><font size=3><span>保留Q必设|ؓ</span><span>0</span></font></p> </td> </tr> <tr> <td width=139> <p><span><font size=3>bfReserved2</font></span></p> </td> <td vAlign=top width=451> <p><font size=3><span>保留Q必设|ؓ</span><span>0</span></font></p> </td> </tr> <tr> <td width=139> <p><span><font size=3>bfOffBits</font></span></p> </td> <td vAlign=top width=451> <p><font size=3><span>说明从文件头开始到实际的图象数据之间的字节的偏U量。这个参数是非常有用的,因ؓ位图信息头和调色板的长度会根据不同情况而变化,所以你可以用这个偏UdD速的从文件中dC数据?/span></font></p> </td> </tr> </tbody> </table> <br></p> <p><font size=3><span><span><font face="Times New Roman">2?/font></span></span><span>位图信息?/span><font face="Times New Roman">BITMAPINFOHEADER</font></font></p> <p><font size=3><span>l构体定义如下:</span></font></p> <p><span><font size=3>typedef struct tagBITMAPINFOHEADER { /* bmih */</font></span><span> </span></p> <p><span><font size=3>DWORD biSize;</font></span><span> <br></span><span><font size=3>LONG biWidth;</font></span><span> <br></span><span><font size=3>LONG biHeight;</font></span><span> <br></span><span><font size=3>WORD biPlanes;</font></span><span> <br></span><span><font size=3>WORD biBitCount;</font></span><span> <br></span><span><font size=3>DWORD biCompression;</font></span><span> <br></span><span><font size=3>DWORD biSizeImage;</font></span><span> <br></span><span><font size=3>LONG biXPelsPerMeter;</font></span><span> <br></span><span><font size=3>LONG biYPelsPerMeter;</font></span><span> <br></span><span><font size=3>DWORD biClrUsed;</font></span><span> <br></span><font size=3><span>DWORD biClrImportant;</span></font></p> <p><span><font size=3>} BITMAPINFOHEADER;</font></span></p> <p><font size=3><span>其中Q?/span></font></p> <p> <table cellSpacing=0 cellPadding=0 border=1> <tbody> <tr> <td width=139> <p><span><font size=3>biSize</font></span></p> </td> <td vAlign=top width=451> <p><font size=3><span>说明</span><font face="Times New Roman">BITMAPINFOHEADER</font><span>l构所需要的字数?/span></font></p> </td> </tr> <tr> <td width=139> <p><span><font size=3>biWidth</font></span></p> </td> <td vAlign=top width=451> <p><span><font size=3>说明图象的宽度,以象素ؓ单位?/font></span></p> </td> </tr> <tr> <td width=139> <p><span><font size=3>biHeight</font></span></p> </td> <td vAlign=top width=451> <p><font size=3><span>说明图象的高度,以象素ؓ单位。注Q这个值除了用于描q图像的高度之外Q它q有另一个用处,是指明该图像是倒向的位图,q是正向的位图。如果该值是一个正敎ͼ说明囑փ是倒向的,如果该值是一个负敎ͼ则说明图像是正向的。大多数?/span><font face="Times New Roman">BMP</font><span>文g都是倒向的位图,也就是时Q高度值是一个正数?/span></font></p> </td> </tr> <tr> <td width=139> <p><span><font size=3>biPlanes</font></span></p> </td> <td vAlign=top width=451> <p><font size=3><span>为目标设备说明位面数Q其值将L被设?/span><span>1</span><span>?/span></font></p> </td> </tr> <tr> <td width=139> <p><span><font size=3>biBitCount</font></span></p> </td> <td vAlign=top width=451> <p><font size=3><span>说明比特?/span><span>/</span><span>象素Q其gؓ</span><span>1</span><span>?/span><span>4</span><span>?/span><span>8</span><span>?/span><span>16</span><span>?/span><span>24</span><span>、或</span><span>32</span><span>。但是由于我们^时用到的囑փl大部分?/span><span>24</span><span>位和</span><span>32</span><span>位的Q所以我们讨两类囑փ?/span></font></p> </td> </tr> <tr> <td width=139> <p><span><font size=3>biCompression</font></span></p> </td> <td vAlign=top width=451> <p><font size=3><span>说明图象数据压羃的类型,同样我们只讨论没有压~的cdQ?/span><font face="Times New Roman">BI_RGB</font><span>?/span></font></p> </td> </tr> <tr> <td width=139> <p><span><font size=3>biSizeImage</font></span></p> </td> <td vAlign=top width=451> <p><font size=3><span>说明图象的大,以字节ؓ单位。当?/span><font face="Times New Roman">BI_RGB</font><span>格式Ӟ可设|ؓ</span><font face="Times New Roman">0</font><span>?/span></font></p> </td> </tr> <tr> <td width=139> <p><span><font size=3>biXPelsPerMeter</font></span></p> </td> <td vAlign=top width=451> <p><font size=3><span>说明水^分L率,用象?/span><font face="Times New Roman">/</font><span>cC?/span></font></p> </td> </tr> <tr> <td width=139> <p><span><font size=3>biYPelsPerMeter</font></span></p> </td> <td vAlign=top width=451> <p><font size=3><span>说明垂直分L率,用象?/span><font face="Times New Roman">/</font><span>cC?/span></font></p> </td> </tr> <tr> <td width=139> <p><span><font size=3>biClrUsed</font></span></p> </td> <td vAlign=top width=451> <p><font size=3><span>说明位图实际使用的彩色表中的颜色索引敎ͼ设ؓ</span><font face="Times New Roman">0</font><span>的话Q则说明使用所有调色板)?/span></font></p> </td> </tr> <tr> <td width=139> <p><span><font size=3>biClrImportant</font></span></p> </td> <td vAlign=top width=451> <p><font size=3><span>说明对图象显C有重要影响的颜色烦引的数目Q如果是</span><font face="Times New Roman">0</font><span>Q表C都重要?/span></font></p> </td> </tr> </tbody> </table> </p> <p><font size=3><font face="Times New Roman"><span><span>3?/span></span>RGB</font><span>颜色阵列</span></font></p> <p><font size=3><span>有关</span><font face="Times New Roman">RGB</font><span>三色I间我想大家都很熟悉Q这里我惌的是?/span><font face="Times New Roman">Windows</font><span>下,</span><font face="Times New Roman">RGB</font><span>颜色阵列存储的格式其?/span><font face="Times New Roman">BGR</font><span>。也是_对于</span><font face="Times New Roman">24</font><span>位的</span><font face="Times New Roman">RGB</font><span>位图像素数据格式是:</span></font></p> <table cellSpacing=0 cellPadding=0 border=1> <tbody> <tr> <td vAlign=top width=148> <p><font size=3><span>蓝色</span><font face="Times New Roman">B</font><span>?/span></font></p> </td> <td vAlign=top width=148> <p><font size=3><span>l色</span><font face="Times New Roman">G</font><span>?/span></font></p> </td> <td vAlign=top width=160> <p><font size=3><span>U色</span><font face="Times New Roman">R</font><span>?/span></font></p> </td> </tr> </tbody> </table> <p><font size=3><span>对于</span><font face="Times New Roman">32</font><span>位的</span><font face="Times New Roman">RGB</font><span>位图像素数据格式是:</span></font></p> <table cellSpacing=0 cellPadding=0 border=1> <tbody> <tr> <td vAlign=top width=114> <p><font size=3><span>蓝色</span><font face="Times New Roman">B</font><span>?/span></font></p> </td> <td vAlign=top width=114> <p><font size=3><span>l色</span><font face="Times New Roman">G</font><span>?/span></font></p> </td> <td vAlign=top width=114> <p><font size=3><span>U色</span><font face="Times New Roman">R</font><span>?/span></font></p> </td> <td vAlign=top width=114> <p><font size=3><span>透明通道</span><font face="Times New Roman">A</font><span>?/span></font></p> </td> </tr> </tbody> </table> <p><font size=3><span>透明通道也称</span><font face="Times New Roman">Alpha</font><span>通道Q该值是该像素点的透明属性,取值在</span><font face="Times New Roman">0</font><span>Q全透明Q到</span><font face="Times New Roman">255</font><span>Q不透明Q之间。对?/span><font face="Times New Roman">24</font><span>位的囑փ来说Q因为没?/span><font face="Times New Roman">Alpha</font><span>通道Q故整个囑փ都不透明?/span></font></p> <p><span><font size=3>二、搞清了文g格式Q下一步我们要实现加蝲?/font></span></p> <p><font size=3><span><font face="Times New Roman">            </font></span><span>加蝲文g的目的是要得到图片属性,以及</span><font face="Times New Roman">RGB</font><span>数据Q然后可以将其绘制在</span><font face="Times New Roman">DC</font><span>?/span><font face="Times New Roman">(GDI)</font><span>Q或是生成纹理对?/span><font face="Times New Roman">(3D:OpenGL/Direct3D)</font><span>。这两种用途在数据处理上有点区别,我们主要按前一U用法讲Q在?/span><font face="Times New Roman">3D</font><span>有不同的地方Q我们再提出来?/span></font></p> <p><font size=3><font face="Times New Roman">1</font><span>、加载文件头</span></font></p> <p><font size=3><font face="Times New Roman"><span>            </span>//Load the file header</font></font></p> <p><font size=3><font face="Times New Roman"><span>            </span>BITMAPFILEHEADER header;</font></font></p> <p><font size=3><font face="Times New Roman"><span>            </span>memset(&header, 0, sizeof(header));</font></font></p> <p><font size=3><font face="Times New Roman"><span>            </span>inf.read((char*)&header, sizeof(header));</font></font></p> <p><font size=3><font face="Times New Roman"><span>            </span>if(header.bfType != 0x4D42)</font></font></p> <p><font size=3><font face="Times New Roman"><span>                        </span>return false;</font></font></p> <p><font size=3><span><font face="Times New Roman">            </font></span><span>q个很简单,没有什么好说的?/span></font></p> <p><font size=3><font face="Times New Roman"><span>            </span>2</font><span>、加载位图信息头</span></font></p> <p><font size=3><font face="Times New Roman"><span>            </span>//Load the image information header</font></font></p> <p><font size=3><font face="Times New Roman"><span>            </span>BITMAPINFOHEADER infoheader;</font></font></p> <p><font size=3><font face="Times New Roman"><span>            </span>memset(&infoheader, 0, sizeof(infoheader));</font></font></p> <p><font size=3><font face="Times New Roman"><span>            </span>inf.read((char*)&infoheader, sizeof(infoheader));</font></font></p> <p><font size=3><font face="Times New Roman"><span>            </span>m_iImageWidth = infoheader.biWidth;</font></font></p> <p><font size=3><font face="Times New Roman"><span>            </span>m_iImageHeight = infoheader.biHeight;</font></font></p> <p><font size=3><font face="Times New Roman"><span>            </span>m_iBitsPerPixel = infoheader.biBitCount;</font></font></p> <p><font size=3><span><font face="Times New Roman">            </font></span><span>q里我们得到?/span><font face="Times New Roman">3</font><span>各重要的囑Ş属性:宽,高,以及每个像素颜色所占用的位数?/span></font></p> <p><font size=3><span><span><font face="Times New Roman">3?/font></span></span><span>行对?/span></font></p> <p><font size=3><span>׃</span><font face="Times New Roman">Windows</font><span>在进行行扫描的时候最的单位?/span><font face="Times New Roman">4</font><span>个字节,所以当</span><font face="Times New Roman"> </font></font></p> <p><font size=3><span>囄?/span><font face="Times New Roman"> X </font><span>每个像素的字节数</span><span><font face="Times New Roman"> </font></span><span>Q?/span><font face="Times New Roman">= 4</font><span>的整数?/span></font></p> <p><font size=3><span>时要在每行的后面补上~少的字节,?/span><font face="Times New Roman">0</font><span>填充Q一般来说当囑փ宽度?/span><font face="Times New Roman">2</font><span>的幂时不需要对齐)。位图文仉的数据在写入的时候已l进行了行对齐,也就是说加蝲的时候不需要再做行寚w。但是这样一来图片数据的长度׃是:?/span><font face="Times New Roman"> X </font><span>?/span><font face="Times New Roman"> X </font><span>每个像素的字节数</span><span><font face="Times New Roman"> </font></span><span>了,我们需要通过下面的方法计正的数据长度Q?/span></font></p> <p><font face="Times New Roman" size=3>//Calculate the image data size</font></p> <p><font face="Times New Roman" size=3>int iLineByteCnt = (((m_iImageWidth*m_iBitsPerPixel) + 31) >> 5) << 2;</font></p> <p><font face="Times New Roman" size=3>m_iImageDataSize = iLineByteCnt * m_iImageHeight;</font></p> <p><font size=3><span><span><font face="Times New Roman">4?/font></span></span><span>加蝲囄数据</span></font></p> <p><font size=3><span>对于</span><font face="Times New Roman">24</font><span>位和</span><font face="Times New Roman">32</font><span>位的位图文gQ位图数据的偏移量ؓ</span><font face="Times New Roman">sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)</font><span>Q也是说现在我们可以直接读取图像数据了?/span></font></p> <p><font size=3><font face="Times New Roman"><span>            </span>if(m_pImageData) delete []m_pImageData;</font></font></p> <p><font size=3><font face="Times New Roman"><span>            </span>m_pImageData = new unsigned char[m_iImageDataSize];</font></font></p> <p><font size=3><font face="Times New Roman"><span>            </span>inf.read((char*)m_pImageData, m_iImageDataSize);</font></font></p> <p><font size=3><span>如果你够细心,׃发现内存</span><font face="Times New Roman">m_pImageData</font><span>里的数据的确?/span><font face="Times New Roman">BGR</font><span>格式Q可以用个纯蓝色或者是U红色的囄试一下?/span></font></p> <p><font size=3><span><span><font face="Times New Roman">5?/font></span></span><span>l制</span></font></p> <p><font size=3><span>好了Q数据和属性我们都有了Q现在就可以拿来随便用了Q就和吃馒头一Pq白糖_白p,qU糖_红p。下面是我的</span><font face="Times New Roman">GDI</font><span>l制代码Q仅作参考?/span></font></p> <p><font face="Times New Roman" size=3>void CImage::DrawImage(HDC hdc, int iLeft, int iTop, int iWidth, int iHeight)</font></p> <p><font face="Times New Roman" size=3>{</font></p> <p><font size=3><font face="Times New Roman"><span>            </span>if(!hdc || m_pImageData == NULL)</font></font></p> <p><font size=3><font face="Times New Roman"><span>                        </span>return;</font></font></p> <p><font size=3><font face="Times New Roman"><span>            </span>BITMAPINFO bmi;</font></font></p> <p><font size=3><font face="Times New Roman"><span>            </span>memset(&bmi, 0, sizeof(bmi));</font></font></p> <p><font size=3><font face="Times New Roman"><span>            </span>bmi.bmiHeader.biSize = sizeof(BITMAPINFO);</font></font></p> <p><font size=3><font face="Times New Roman"><span>            </span>bmi.bmiHeader.biWidth = m_iImageWidth;</font></font></p> <p><font size=3><font face="Times New Roman"><span>            </span>bmi.bmiHeader.biHeight = m_iImageHeight;</font></font></p> <p><font size=3><font face="Times New Roman"><span>            </span>bmi.bmiHeader.biPlanes = 1;</font></font></p> <p><font size=3><font face="Times New Roman"><span>            </span>bmi.bmiHeader.biBitCount = m_iBitsPerPixel;</font></font></p> <p><font size=3><font face="Times New Roman"><span>            </span>bmi.bmiHeader.biCompression = BI_RGB;</font></font></p> <p><font size=3><font face="Times New Roman"><span>            </span>bmi.bmiHeader.biSizeImage = m_iImageDataSize;</font></font></p> <p><font size=3><font face="Times New Roman"><span>            </span>StretchDIBits(hdc, iLeft, iTop, iWidth, iHeight, </font></font></p> <p><font size=3><font face="Times New Roman"><span>                                                </span>0, 0, m_iImageWidth, m_iImageHeight, </font></font></p> <p><font size=3><font face="Times New Roman"><span>                                                </span>m_pImageData, &bmi, DIB_RGB_COLORS, SRCCOPY);</font></font></p> <p><font face="Times New Roman" size=3>}</font></p> <p><font size=3><font face="Times New Roman"><span><span>6?/span></span>3D(OpenGL)</font><span>的不同之?/span></font></p> <p><span><font size=3>如果你是想用刚才我们得到的数据生成纹理对象,那么你还要请Z面的问题?/font></span></p> <p><font size=3><span>首先Q用来生成纹理的数据不需要对齐,也就是说不能在每行的后面加上寚w的字节。当然在</span><font face="Times New Roman">OpenGL</font><span>里要求纹理图片的寸?/span><font face="Times New Roman">2</font><span>的幂Q所以这个问题实际上不存在;</span></font></p> <p><font size=3><span>其次Q我们得到的囑Ş数据格式?/span><font face="Times New Roman">BGR(BGRA)</font><span>Q所以在生成U理的时候,需指定格式?/span><font face="Times New Roman">GL_BGR_EXT(GL_BGRA_EXT)</font><span>Q否则需要做</span><font face="Times New Roman">BGR->RGB(BGRA->RGBA)</font><span>的{?/span></font></p> <img src ="http://m.shnenglu.com/tgh621/aggbug/60837.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/tgh621/" target="_blank">大v</a> 2008-09-03 18:24 <a href="http://m.shnenglu.com/tgh621/archive/2008/09/03/60837.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(? bmp图文件结?/title><link>http://m.shnenglu.com/tgh621/archive/2008/09/03/60836.html</link><dc:creator>大v</dc:creator><author>大v</author><pubDate>Wed, 03 Sep 2008 10:22:00 GMT</pubDate><guid>http://m.shnenglu.com/tgh621/archive/2008/09/03/60836.html</guid><wfw:comment>http://m.shnenglu.com/tgh621/comments/60836.html</wfw:comment><comments>http://m.shnenglu.com/tgh621/archive/2008/09/03/60836.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/tgh621/comments/commentRss/60836.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/tgh621/services/trackbacks/60836.html</trackback:ping><description><![CDATA[<p align=center>位图文g可看成由4个部分组成:位图文g?bitmap-file header)、位图信息头(bitmap-information header)、彩色表(color table)和定义位囄字节阵列Q它h如下所C的形式?/p> <div align=center> <center> <table cellSpacing=2 borderColorDark=#000000 width=510 borderColorLight=#cc6600 border=1> <tbody> <tr> <td width=232> <p align=center>位图文g的组?/p> </td> <td width=157> <p align=center>l构名称</p> </td> <td width=103> <p align=center>W号</p> </td> </tr> <tr> <td width=232>位图文g?bitmap-file header)</td> <td width=157>BITMAPFILEHEADER</td> <td width=103>bmfh</td> </tr> <tr> <td width=232>位图信息?bitmap-information header)</td> <td width=157>BITMAPINFOHEADER</td> <td width=103>bmih</td> </tr> <tr> <td width=232>彩色?color table)</td> <td width=157>RGBQUAD</td> <td width=103>aColors[]</td> </tr> <tr> <td width=232>图象数据阵列字节</td> <td width=157>BYTE</td> <td width=103>aBitmapBits[]</td> </tr> </tbody> </table> </center></div> <p>位图文gl构可综合在?-01中?/p> <blockquote> <p align=center>?1 位图文gl构内容摘要</p> </blockquote> <div align=center> <center> <table cellSpacing=2 borderColorDark=#000000 cellPadding=7 width=585 borderColorLight=#cc6600 border=1> <tbody> <tr> <td width=18> </td> <td width=43> <p align=center>偏移?/p> </td> <td width=96> <p align=center>域的名称</p> </td> <td width=58> <p align=center>大小</p> </td> <td width=287> <p align=center>内容</p> </td> </tr> <tr> <td width=27>  <p> </p> <p> </p> <p>图象文g</p> <p>?/p> </td> <td width=43>0000h</td> <td width=80>文g标识</td> <td width=58>2 bytes</td> <td width=287>两字节的内容用来识别位图的类型: <p>‘BM’ Q?Windows 3.1x, 95, NT, …</p> <p>‘BA’ QOS/2 Bitmap Array</p> <p>‘CI’ QOS/2 Color Icon</p> <p>‘CP’ QOS/2 Color Pointer</p> <p>‘IC’ Q?OS/2 Icon</p> <p>‘PT’ QOS/2 Pointer</p> <p>注:因ؓOS/2pȝq没有被普及开Q所以在~程Ӟ你只需判断W一个标?#8220;BM”p?/p> </td> </tr> <tr> <td width=27> </td> <td width=43>0002h</td> <td width=80>File Size</td> <td width=58>1 dword</td> <td width=287>用字节表C的整个文g的大?/td> </tr> <tr> <td width=27> </td> <td width=43>0006h</td> <td width=80>Reserved</td> <td width=58>1 dword</td> <td width=287>保留Q必设|ؓ0</td> </tr> <tr> <td width=27> </td> <td width=43>000Ah</td> <td width=80>Bitmap Data Offset</td> <td width=58>1 dword</td> <td width=287>从文件开始到位图数据开始之间的数据(bitmap data)之间的偏U量</td> </tr> <tr> <td width=27> </td> <td width=43>000Eh</td> <td width=80>Bitmap Header Size</td> <td width=58>1 dword</td> <td width=287>位图信息?Bitmap Info Header)的长度,用来描述位图的颜艌Ӏ压~方法等。下面的长度表示Q? <p>28h - Windows 3.1x, 95, NT, …</p> <p>0Ch - OS/2 1.x</p> <p>F0h - OS/2 2.x</p> <p>注:在Windows95?8?000{?font color=#0000ff>操作pȝ</font>中,位图信息头的长度q不一定是28hQ因为微软已l制定出了新的BMP文g格式Q其中的信息头结构变化比较大Q长度加ѝ所以最好不要直接用常?8hQ而是应该从具体的文g中读取这个倹{这h能确保程序的兼容性?/p> </td> </tr> <tr> <td width=27> </td> <td width=43>0012h</td> <td width=80>Width</td> <td width=58>1 dword</td> <td width=287>位图的宽度,以象素ؓ单位</td> </tr> <tr> <td width=27> </td> <td width=43>0016h</td> <td width=80>Height</td> <td width=58>1 dword</td> <td width=287>位图的高度,以象素ؓ单位</td> </tr> <tr> <td width=27> </td> <td width=43>001Ah</td> <td width=80>Planes</td> <td width=58>1 word</td> <td width=287>位图的位面数Q注Q该值将L1Q?/td> </tr> <tr> <td width=27><br>图象 <p>信息</p> <p>?/p> <p> </p> <p> </p> </td> <td width=43>001Ch</td> <td width=80>Bits Per Pixel</td> <td width=58>1 word</td> <td width=287>每个象素的位? <p>1 - 单色位图Q实际上可有两种颜色Q缺省情况下是黑色和白色。你可以自己定义q两U颜Ԍ</p> <p>4 - 16 色位?/p> <p>8 - 256 色位?/p> <p>16 - 16bit 高彩色位?/p> <p>24 - 24bit 真彩色位?/p> <p>32 - 32bit 增强型真彩色位图</p> </td> </tr> <tr> <td width=27> </td> <td width=43>001Eh</td> <td width=80>Compression</td> <td width=58>1 dword</td> <td width=287>压羃说明Q? <p>0 - 不压~?(使用BI_RGB表示)</p> <p>1 - RLE 8-使用8位RLE压羃方式(用BI_RLE8表示)</p> <p>2 - RLE 4-使用4位RLE压羃方式(用BI_RLE4表示)</p> <p>3 - Bitfields-位域存放方式(用BI_BITFIELDS表示)</p> </td> </tr> <tr> <td width=27> </td> <td width=43>0022h</td> <td width=80>Bitmap Data Size</td> <td width=58>1 dword</td> <td width=287>用字节数表示的位图数据的大小。该数必L4的倍数</td> </tr> <tr> <td width=27> </td> <td width=43>0026h</td> <td width=80>HResolution</td> <td width=58>1 dword</td> <td width=287>用象?cC的水^分L?/td> </tr> <tr> <td width=27> </td> <td width=43>002Ah</td> <td width=80>VResolution</td> <td width=58>1 dword</td> <td width=287>用象?cC的垂直分L?/td> </tr> <tr> <td width=27> </td> <td width=43>002Eh</td> <td width=80>Colors</td> <td width=58>1 dword</td> <td width=287>位图使用的颜色数。如8-比特/象素表示?00h或?256.</td> </tr> <tr> <td width=27> </td> <td width=43>0032h</td> <td width=80>Important Colors</td> <td width=58>1 dword</td> <td width=287>指定重要的颜色数。当该域的值等于颜色数Ӟ或者等?ӞQ表C所有颜色都一样重?/td> </tr> <tr> <td width=27>调色板数?/td> <td width=43>ҎBMP版本的不同而不?/td> <td width=80>Palette</td> <td width=58>N * 4 byte</td> <td width=287>调色板规范。对于调色板中的每个表项Q这4个字节用下述Ҏ来描qRGB的| <table cellSpacing=0 cellPadding=0 width="100%" border=0> <tbody> <tr> <td vAlign=baseline width=42><img height=20 hspace=11 src="http://cnxhacker.net/editor/UploadFile/2005-9/15/200591510910917.gif" width=20></td> <td vAlign=top width="100%">1字节用于蓝色分量</td> </tr> <tr> <td vAlign=baseline width=42><img height=20 hspace=11 src="http://cnxhacker.net/editor/UploadFile/2005-9/15/200591510910917.gif" width=20></td> <td vAlign=top width="100%">1字节用于l色分量</td> </tr> <tr> <td vAlign=baseline width=42><img height=20 hspace=11 src="http://cnxhacker.net/editor/UploadFile/2005-9/15/200591510910917.gif" width=20></td> <td vAlign=top width="100%">1字节用于U色分量</td> </tr> <tr> <td vAlign=baseline width=42><img height=20 hspace=11 src="http://cnxhacker.net/editor/UploadFile/2005-9/15/200591510910917.gif" width=20></td> <td vAlign=top width="100%">1字节用于填充W?讄?)</td> </tr> </tbody> </table> </td> </tr> <tr> <td width=27>图象数据</td> <td width=43>ҎBMP版本及调色板寸的不同而不?/td> <td width=80>Bitmap Data</td> <td width=58>xxx bytes</td> <td width=287>该域的大取决于压羃Ҏ及图像的寸和图像的位深度,它包含所有的位图数据字节Q这些数据可能是彩色调色板的索引P也可能是实际的RGB|q将Ҏ囑փ信息头中的位深度值来军_?/td> </tr> </tbody> </table> <br> <table style="TABLE-LAYOUT: fixed"> <tbody> <tr> <td> <div id="33tplv9" class=cnt id=blog_text> <blockquote> <p align=center>构g详解</p> </blockquote> <p>1. 位图文g?/p> <p>位图文g头包含有关于文gcd、文件大、存放位|等信息Q在Windows 3.0以上版本的位图文件中用BITMAPFILEHEADERl构来定义:</p> <p>typedef struct tagBITMAPFILEHEADER { /* bmfh */</p> <blockquote>UINT bfType;<br>DWORD bfSize; <br>UINT bfReserved1; <br>UINT bfReserved2; <br>DWORD bfOffBits;<br></blockquote> <p>} BITMAPFILEHEADER;</p> <p> </p> <p>其中Q?<br></p> <p> <table cellSpacing=0 width=557 border=0> <tbody> <tr> <td width="22%"> <blockquote> <p>bfType</p> </blockquote></td> <td width="78%"> <blockquote> <p>说明文g的类?Q该值必需?x4D42Q也是字符’BM’。我们不需要判断OS/2的位图标识,q么做现在来看似乎已l没有什么意义了Q而且如果要支持OS/2的位图,E序变得很J琐。所以,在此只徏议你?#8217;BM’标识Q?</p> </blockquote></td> </tr> <tr> <td width="22%"> <blockquote> <p>bfSize</p> </blockquote></td> <td width="78%"> <blockquote> <p>说明文g的大,用字节ؓ单位</p> </blockquote></td> </tr> <tr> <td width="22%"> <blockquote> <p>bfReserved1</p> </blockquote></td> <td width="78%"> <blockquote> <p>保留Q必设|ؓ0</p> </blockquote></td> </tr> <tr> <td width="22%"> <blockquote> <p>bfReserved2</p> </blockquote></td> <td width="78%"> <blockquote> <p>保留Q必设|ؓ0</p> </blockquote></td> </tr> <tr> <td width="22%"> <blockquote> <p>bfOffBits</p> </blockquote></td> <td width="78%"> <blockquote> <p>说明从文件头开始到实际的图象数据之间的字节的偏U量。这个参数是非常有用的,因ؓ位图信息头和调色板的长度会根据不同情况而变化,所以你可以用这个偏UdD速的从文件中dC数据?/p> </blockquote></td> </tr> </tbody> </table> </p> <p>2. 位图信息?/p> <p>位图信息用BITMAPINFOl构来定义,它由位图信息?bitmap-information header)和彩色表(color table)l成Q前者用BITMAPINFOHEADERl构定义Q后者用RGBQUADl构定义。BITMAPINFOl构h如下形式Q?/p> <p>typedef struct tagBITMAPINFO { /* bmi */</p> <blockquote>BITMAPINFOHEADER bmiHeader;<br>RGBQUAD bmiColors[1];<br></blockquote> <p>} BITMAPINFO;</p> <p> </p> <p>其中Q?<br></p> <p> <table cellSpacing=0 width=557 border=0> <tbody> <tr> <td width="22%"> <blockquote> <p>bmiHeader</p> </blockquote></td> <td width="78%"> <blockquote> <p>说明BITMAPINFOHEADERl构Q其中包含了有关位图的尺寸及位格式等信息</p> </blockquote></td> </tr> <tr> <td width="22%"> <blockquote> <p>bmiColors</p> </blockquote></td> <td width="78%"> <blockquote> <p>说明彩色表RGBQUADl构的阵列,其中包含索引囑փ的真实RGB倹{?/p> </blockquote></td> </tr> </tbody> </table> </p> <p>BITMAPINFOHEADERl构包含有位图文件的大小、压~类型和颜色格式Q其l构定义为:</p> <p>typedef struct tagBITMAPINFOHEADER { /* bmih */</p> <blockquote>DWORD biSize; <br>LONG biWidth; <br>LONG biHeight; <br>WORD biPlanes; <br>WORD biBitCount; <br>DWORD biCompression; <br>DWORD biSizeImage; <br>LONG biXPelsPerMeter; <br>LONG biYPelsPerMeter; <br>DWORD biClrUsed; <br>DWORD biClrImportant;<br></blockquote> <p>} BITMAPINFOHEADER;</p> <p> </p> <p>其中Q?<br></p> <p> <table cellSpacing=0 width=565 border=0> <tbody> <tr> <td width=147> <blockquote> <p>biSize</p> </blockquote></td> <td width=414> <blockquote> <p>说明BITMAPINFOHEADERl构所需要的字数。注Q这个值ƈ不一定是BITMAPINFOHEADERl构的尺寸,它也可能是sizeof(BITMAPV4HEADER)的|或是sizeof(BITMAPV5HEADER)的倹{这要根据该位图文g的格式版本来军_Q不q,q在的情况来看Q绝大多数的BMP囑փ都是BITMAPINFOHEADERl构的(可能是后两者太新的~故?-Q?/p> </blockquote></td> </tr> <tr> <td width=147> <blockquote> <p>biWidth</p> </blockquote></td> <td width=414> <blockquote> <p>说明图象的宽度,以象素ؓ单位</p> </blockquote></td> </tr> <tr> <td width=147> <blockquote> <p>biHeight</p> </blockquote></td> <td width=414> <blockquote> <p>说明图象的高度,以象素ؓ单位。注Q这个值除了用于描q图像的高度之外Q它q有另一个用处,是指明该图像是倒向的位图,q是正向的位图。如果该值是一个正敎ͼ说明囑փ是倒向的,如果该值是一个负敎ͼ则说明图像是正向的。大多数的BMP文g都是倒向的位图,也就是时Q高度值是一个正数。(注:当高度值是一个负数时Q正向图像)Q图像将不能被压~(也就是说biCompression成员不能是BI_RLE8或BI_RLE4Q?/p> </blockquote></td> </tr> <tr> <td width=147> <blockquote> <p>biPlanes</p> </blockquote></td> <td width=414> <blockquote> <p>为目标设备说明位面数Q其值将L被设?</p> </blockquote></td> </tr> <tr> <td width=147> <blockquote> <p>biBitCount</p> </blockquote></td> <td width=414> <blockquote> <p>说明比特?象素Q其gؓ1???6?4、或32</p> </blockquote></td> </tr> <tr> <td width=147> <blockquote> <p>biCompression</p> </blockquote></td> <td width=414>说明图象数据压羃的类型。其值可以是下述g一Q?<br> <table cellSpacing=0 cellPadding=0 width="100%" border=0> <tbody> <tr> <td vAlign=baseline width=42></td> <td vAlign=top width="100%">BI_RGBQ没有压~; <br></td> </tr> <tr> <td vAlign=baseline width=42></td> <td vAlign=top width="100%">BI_RLE8Q每个象?比特的RLE压羃~码Q压~格式由2字节l成(重复象素计数和颜色烦?Q?<br></td> </tr> <tr> <td vAlign=baseline width=42></td> <td vAlign=top width="100%">BI_RLE4Q每个象?比特的RLE压羃~码Q压~格式由2字节l成 <br></td> </tr> <tr> <td vAlign=baseline width=42></td> <td vAlign=top width="100%">BI_BITFIELDSQ每个象素的比特由指定的掩码军_?br></td> </tr> </tbody> </table> </td> </tr> <tr> <td width=147> <blockquote> <p>biSizeImage</p> </blockquote></td> <td width=414>说明图象的大,以字节ؓ单位。当用BI_RGB格式Ӟ可设|ؓ0</td> </tr> <tr> <td width=147> <blockquote> <p>biXPelsPerMeter</p> </blockquote></td> <td width=414>说明水^分L率,用象?cC?/td> </tr> <tr> <td width=147> <blockquote> <p>biYPelsPerMeter</p> </blockquote></td> <td width=414>说明垂直分L率,用象?cC?/td> </tr> <tr> <td width=147> <blockquote> <p>biClrUsed</p> </blockquote></td> <td width=414>说明位图实际使用的彩色表中的颜色索引敎ͼ设ؓ0的话Q则说明使用所有调色板)</td> </tr> <tr> <td width=147> <blockquote> <p>biClrImportant</p> </blockquote></td> <td width=414> <blockquote> <p>说明对图象显C有重要影响的颜色烦引的数目Q如果是0Q表C都重要?/p> </blockquote></td> </tr> </tbody> </table> </p> <p>现就BITMAPINFOHEADERl构作如下说明:</p> <p>(1) 彩色表的定位</p> <p>应用E序可用存储在biSize成员中的信息来查扑֜BITMAPINFOl构中的彩色表,如下所C:</p> <p>pColor = ((LPSTR) pBitmapInfo + (WORD) (pBitmapInfo->bmiHeader.biSize))</p> <p>(2) biBitCount</p> <p>biBitCount=1 表示位图最多有两种颜色Q缺省情况下是黑色和白色Q你也可以自己定义这两种颜色。图像信息头装调色板中将有两个调色板,UCؓ索引0和烦?。图象数据阵列中的每一位表CZ个象素。如果一个位?Q显C时׃用烦?的RGB|如果位是1Q则使用索引1的RGB倹{?/p> <p>biBitCount=4 表示位图最多有16U颜艌Ӏ每个象素用4位表C,q用q?位作为彩色表的表Ҏ查找该象素的颜色。例如,如果位图中的W一个字节ؓ0x1FQ它表示有两个象素,W一象素的颜色就在彩色表的第2表项中查找,而第二个象素的颜色就在彩色表的第16表项中查找。此Ӟ调色板中~省情况下会?6个RGBV对应于索引0到烦?5?/p> <p>biBitCount=8 表示位图最多有256U颜艌Ӏ每个象素用8位表C,q用q?位作为彩色表的表Ҏ查找该象素的颜色。例如,如果位图中的W一个字节ؓ0x1FQ这个象素的颜色在彩色表的W?2表项中查找。此Ӟ~省情况下,调色板中会有256个RGB,对应于烦?到烦?55?/p> <p>biBitCount=16 表示位图最多有216U颜艌Ӏ每个色素用16位(2个字节)表示。这U格式叫作高彩色Q或叫增强型16位色Q或64K艌Ӏ它的情冉|较复杂,当biCompression成员的值是BI_RGBӞ它没有调色板?6位中Q最低的5位表C色分量,中间?位表C绿色分量,高的5位表C红色分量,一共占用了15位,最高的一位保留,设ؓ0。这U格式也被称?55 16位位图。如果biCompression成员的值是BI_BITFIELDSQ那么情况就复杂了,首先是原来调色板的位|被三个DWORD变量占据Q称为红、绿、蓝掩码。分别用于描q红、绿、蓝分量?6位中所占的位置。在Windows 95Q或98Q中Q系l可接受两种格式的位域:555?65Q在555格式下,U、绿、蓝的掩码分别是Q?x7C00?x03E0?x001FQ而在565格式下,它们则分别ؓQ?xF800?x07E0?x001F。你在读取一个像素之后,可以分别用掩?#8220;?#8221;上像素|从而提取出惌的颜色分量(当然q要再经q适当的左右移操作Q。在NTpȝ中,则没有格式限Ӟ只不q要求掩码之间不能有重叠。(注:q种格式的图像用v来是比较ȝ的,不过因ؓ它的昄效果接近于真彩,而图像数据又比真彩图像小的多Q所以,它更多的被用于游戏YӞ?/p> <p>biBitCount=24 表示位图最多有224U颜艌Ӏ这U位图没有调色板QbmiColors成员寸?Q,在位数组中,?个字节代表一个象素,分别对应于颜色R、G、B?/p> <p>biBitCount=32 表示位图最多有232U颜艌Ӏ这U位囄l构?6位位囄构非常类|当biCompression成员的值是BI_RGBӞ它也没有调色板,32位中?4位用于存放RGB|序是:最高位—保留,U?位、绿8位、蓝8位。这U格式也被成?88 32位图。如?biCompression成员的值是BI_BITFIELDSӞ原来调色板的位置被三个DWORD变量占据Q成为红、绿、蓝掩码Q分别用于描q红、绿、蓝分量?2位中所占的位置。在Windows 95(or 98)中,pȝ只接?88格式Q也是说三个掩码的值将只能是:0xFF0000?xFF00?xFF。而在NTpȝ中,你只要注意掩码之间不生重叠就行。(注:q种囑փ格式比较规整Q因为它是DWORD寚w的,所以在内存中进行图像处理时可进行汇~的代码优化(单)Q?/p> <p>(3) ClrUsed</p> <p>BITMAPINFOHEADERl构中的成员ClrUsed指定实际使用的颜色数目。如果ClrUsed讄?Q位图用的颜色数目q于biBitCount成员中的数目。请注意Q如果ClrUsed的g是可用颜色的最大值或不是0Q则在编E时应该注意调色板尺寸的计算Q比如在4位位图中Q调色板的缺省尺寸应该是16Qsizeof(RGBQUAD)Q但是,如果ClrUsed的g?6或者不?Q那么调色板的尺寸就应该是ClrUsedQsizeof(RGBQUAD)?/p> <p>(4) 图象数据压羃</p> <p>?BI_RLE8Q每个象素ؓ8比特的RLE压羃~码Q可使用~码方式和绝Ҏ式中的Q何一U进行压~,q两U方式可在同一q图中的M地方使用?/p> <p>~码方式Q由2个字节组成,W一个字节指定用相同颜色的象素数目Q第二个字节指定使用的颜色烦引。此外,q个字节对中的第一个字节可讄?Q联合用第二个字节的DC:</p> <p> <table cellSpacing=0 cellPadding=0 width="100%" border=0> <tbody> <tr> <td vAlign=baseline width=42><img height=20 hspace=11 src="http://cnxhacker.net/editor/UploadFile/2005-9/15/200591510910917.gif" width=20></td> <td vAlign=top width="100%">W二个字节的gؓ0Q行的结束?<br></td> </tr> <tr> <td vAlign=baseline width=42><img height=20 hspace=11 src="http://cnxhacker.net/editor/UploadFile/2005-9/15/200591510910917.gif" width=20></td> <td vAlign=top width="100%">W二个字节的gؓ1Q图象结束?<br></td> </tr> <tr> <td vAlign=baseline width=42><img height=20 hspace=11 src="http://cnxhacker.net/editor/UploadFile/2005-9/15/200591510910917.gif" width=20></td> <td vAlign=top width="100%">W二个字节的gؓ2Q其后的两个字节表示下一个象素从当前开始的水^和垂直位|的偏移量?<br></td> </tr> </tbody> </table> </p> <p>l对方式Q第一个字节设|ؓ0Q而第二个字节讄?x03?xFF之间的一个倹{在q种方式中,W二个字节表C在这个字节后面的字节敎ͼ每个字节包含单个象素的颜色烦引。压~数据格式需要字边界(word boundary)寚w。下面的例子是用16q制表示?-位压~图象数据:</p> <p align=center>03 04 05 06 00 03 45 56 67 00 02 78 00 02 05 01 02 78 00 00 09 1E 00 01 <br>q些压羃数据可解释ؓ Q?/p> <div align=center> <center> <table cellSpacing=2 borderColorDark=#000000 width=443 borderColorLight=#cc6600 border=1> <tbody> <tr> <td width=143> <p align=center>压羃数据 </p> </td> <td width=288> <p align=center>扩展数据</p> </td> </tr> <tr> <td width=143>03 04</td> <td width=288>04 04 04 </td> </tr> <tr> <td width=143>05 06</td> <td width=288>06 06 06 06 06 </td> </tr> <tr> <td width=143>00 03 45 56 67 00</td> <td width=288>45 56 67 </td> </tr> <tr> <td width=143>02 78</td> <td width=288>78 78 </td> </tr> <tr> <td width=143>00 02 05 01</td> <td width=288>从当前位|右U?个位|后向下UM?/td> </tr> <tr> <td width=143>02 78</td> <td width=288>78 78 </td> </tr> <tr> <td width=143>00 00</td> <td width=288>行结?/td> </tr> <tr> <td width=143>09 1E</td> <td width=288>1E 1E 1E 1E 1E 1E 1E 1E 1E </td> </tr> <tr> <td width=143>00 01</td> <td width=288>RLE~码图象l束 </td> </tr> </tbody> </table> </center></div> <p>?BI_RLE4Q每个象素ؓ4比特的RLE压羃~码Q同样也可用编码方式和l对方式中的M一U进行压~,q两U方式也可在同一q图中的M地方使用。这两种方式是:</p> <p>~码方式Q由2个字节组成,W一个字节指定象素数目,W二个字节包含两U颜色烦引,一个在?位,另一个在?位。第一个象素用高4位的颜色索引Q第二个使用?位的颜色索引Q第3个用高4位的颜色索引Q依此类推?/p> <p>l对方式Q这个字节对中的W一个字节设|ؓ0Q第二个字节包含有颜色烦引数Q其后箋字节包含有颜色烦引,颜色索引存放在该字节的高、低4位中Q一个颜色烦引对应一个象素。此外,BI_RLE4也同栯合用第二个字节中的DC:</p> <p> <table cellSpacing=0 cellPadding=0 width="100%" border=0> <tbody> <tr> <td vAlign=baseline width=42><img height=20 hspace=11 src="http://cnxhacker.net/editor/UploadFile/2005-9/15/200591510910917.gif" width=20></td> <td vAlign=top width="100%">W二个字节的gؓ0Q行的结束?<br></td> </tr> <tr> <td vAlign=baseline width=42><img height=20 hspace=11 src="http://cnxhacker.net/editor/UploadFile/2005-9/15/200591510910917.gif" width=20></td> <td vAlign=top width="100%">W二个字节的gؓ1Q图象结束?<br></td> </tr> <tr> <td vAlign=baseline width=42><img height=20 hspace=11 src="http://cnxhacker.net/editor/UploadFile/2005-9/15/200591510910917.gif" width=20></td> <td vAlign=top width="100%">W二个字节的gؓ2Q其后的两个字节表示下一个象素从当前开始的水^和垂直位|的偏移量?<br></td> </tr> </tbody> </table> </p> <p>下面的例子是?6q制数表C的4-位压~图象数据:</p> <p>03 04 05 06 00 06 45 56 67 00 04 78 00 02 05 01 04 78 00 00 09 1E 00 01</p> <p align=center>q些压羃数据可解释ؓ Q?/p> <div align=center> <center> <table cellSpacing=2 borderColorDark=#000000 width=417 borderColorLight=#cc6600 border=1> <tbody> <tr> <td width=141> <p align=center>压羃数据</p> </td> <td width=264> <p align=center>扩展数据</p> </td> </tr> <tr> <td width=141>03 04</td> <td width=264>0 4 0</td> </tr> <tr> <td width=141>05 06</td> <td width=264>0 6 0 6 0 </td> </tr> <tr> <td width=141>00 06 45 56 67 00</td> <td width=264>4 5 5 6 6 7 </td> </tr> <tr> <td width=141>04 78</td> <td width=264>7 8 7 8 </td> </tr> <tr> <td width=141>00 02 05 01</td> <td width=264>从当前位|右U?个位|后向下UM?/td> </tr> <tr> <td width=141>04 78</td> <td width=264>7 8 7 8 </td> </tr> <tr> <td width=141>00 00</td> <td width=264>行结?/td> </tr> <tr> <td width=141>09 1E</td> <td width=264>1 E 1 E 1 E 1 E 1 </td> </tr> <tr> <td width=141>00 01</td> <td width=264>RLE图象l束 </td> </tr> </tbody> </table> </center></div> <p>3. 彩色?/p> <p>彩色表包含的元素与位图所h的颜色数相同Q象素的颜色用RGBQUADl构来定义。对?4-位真彩色图象׃使用彩色表(同样也包?6位、和32位位图)Q因Z图中的RGB值就代表了每个象素难?Q噬 械难丈 ׃ 闹匾 耘判?饪梢ѝ 允厩 l蛭 荒芟允咀愎欢嘌丈 南允旧璞赶允静噬 枯 GBQUADl构描述由R、G、B相对强度l成的颜Ԍ定义如下Q?/p> <p>typedef struct tagRGBQUAD { /* rgbq */</p> <blockquote>BYTE rgbBlue; <br>BYTE rgbGreen; <br>BYTE rgbRed; <br>BYTE rgbReserved;<br></blockquote> <p>} RGBQUAD;</p> <p> </p> <p>其中Q?<br></p> <p> <table cellSpacing=0 width=557 border=0> <tbody> <tr> <td width="22%"> <blockquote> <p>rgbBlue</p> </blockquote></td> <td width="78%"> <blockquote> <p>指定蓝色强度</p> </blockquote></td> </tr> <tr> <td width="22%"> <blockquote> <p>rgbGreen</p> </blockquote></td> <td width="78%"> <blockquote> <p>指定l色强度</p> </blockquote></td> </tr> <tr> <td width="22%"> <blockquote> <p>rgbRed</p> </blockquote></td> <td width="78%"> <blockquote> <p>指定U色强度</p> </blockquote></td> </tr> <tr> <td width="22%"> <blockquote> <p>rgbReserved</p> </blockquote></td> <td width="78%"> <blockquote> <p>保留Q设|ؓ0</p> </blockquote></td> </tr> </tbody> </table> </p> <p>4. 位图数据</p> <p align=center>紧跟在彩色表之后的是图象数据字节阵列。图象的每一扫描行由表示图象象素的连l的字节l成Q每一行的字节数取决于图象的颜色数目和用象素表C的图象宽度。扫描行是由底向上存储的Q这是_阵列中的W一个字节表CZ囑ַ下角的象素,而最后一个字节表CZ囑֏上角的象素。(只针对与倒向DIBQ如果是正向DIBQ则扫描行是由顶向下存储的)Q倒向DIB的原点在囑փ的左下角Q而正向DIB的原点在囑փ的左上角。同Ӟ每一扫描行的字节数必需?的整倍数Q也是DWORD寚w的。如果你想确保图像的扫描行DWORD寚wQ可使用下面的代码:<br><br>(((width*biBitCount)+31)>>5)<<2</p> </div> </td> </tr> </tbody> </table> </center></div> <img src ="http://m.shnenglu.com/tgh621/aggbug/60836.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/tgh621/" target="_blank">大v</a> 2008-09-03 18:22 <a href="http://m.shnenglu.com/tgh621/archive/2008/09/03/60836.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.vocard.cn" target="_blank">Aݺݾþɫ</a>| <a href="http://www.e9ir544.cn" target="_blank">þ޾ƷAV</a>| <a href="http://www.veyp.cn" target="_blank">˳ɵӰվþ</a>| <a href="http://www.esfjjr.cn" target="_blank">97þù¶Ʒ</a>| <a href="http://www.hywsgc.cn" target="_blank">ĻþþƷ1</a>| <a href="http://www.pynov.cn" target="_blank">þþþƷ2019ѹۿ</a>| <a href="http://www.guhm.cn" target="_blank">Ӱһþҹײ </a>| <a href="http://www.efd-inc.com.cn" target="_blank">޾ƷþþþþðĦ </a>| <a href="http://www.bdfu-edu.cn" target="_blank">þۺϳDž</a>| <a href="http://www.ywck.net.cn" target="_blank">þۺ77777鶹</a>| <a href="http://www.ondai.com.cn" target="_blank">þþƷ޾Ʒ2020</a>| <a href="http://www.feichangyemen.cn" target="_blank">18պҹþó</a>| <a href="http://www.baotou8.cn" target="_blank">˺ݺۺϾþ</a>| <a href="http://www.box6.cn" target="_blank">97þþþƷۺ88þ</a>| <a href="http://www.hanxuefs.com.cn" target="_blank">þþøƵ</a>| <a href="http://www.lefanz.cn" target="_blank">ƷŮþþ</a>| <a href="http://www.97hh.cn" target="_blank">þۺ༤</a>| <a href="http://www.108bto.cn" target="_blank">뾫ƷþɪӰ</a>| <a href="http://www.ikde.cn" target="_blank">999þþùƷ</a>| <a href="http://www.mir818.cn" target="_blank">99þۺϾƷվ</a>| <a href="http://www.wkbxdlr.cn" target="_blank">þþù׾Ʒ</a>| <a href="http://www.zaggaa.cn" target="_blank">޷AVþò</a>| <a href="http://www.seowiki.com.cn" target="_blank">պþëƬ </a>| <a href="http://www.puruimu.cn" target="_blank">þøһëƬ</a>| <a href="http://www.qenw.cn" target="_blank">ھƷþþþù</a>| <a href="http://www.uhpd.cn" target="_blank">þ޸ۺ</a>| <a href="http://www.gmbs.com.cn" target="_blank">þҹɫƷa</a>| <a href="http://www.haoq98.cn" target="_blank">ٸþĻ</a>| <a href="http://www.ttyv.cn" target="_blank">պݺݾþ͵͵ɫۺ0</a>| <a href="http://www.liess.cn" target="_blank">þۺƵվ</a>| <a href="http://www.99j9.cn" target="_blank">ɫþþۺ</a>| <a href="http://www.976z.cn" target="_blank">vaþþþúݺ</a>| <a href="http://www.mfsdrj.com.cn" target="_blank">޹þþþƷ </a>| <a href="http://www.bqb2.cn" target="_blank">鶹AV뾫Ʒþ</a>| <a href="http://www.ebuxy.cn" target="_blank">ŷһþۺ</a>| <a href="http://www.windows7pe.cn" target="_blank">Ʒþþþþ</a>| <a href="http://www.qhklmy.cn" target="_blank">պƷרþþ</a>| <a href="http://www.esld.cn" target="_blank">þ99ھƷ</a>| <a href="http://www.taokecai.cn" target="_blank">˾þô߽槼</a>| <a href="http://www.usgold.cn" target="_blank">˾þ뾫ƷĻ</a>| <a href="http://www.z1568.cn" target="_blank">þùƷþ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>