找回密码
 注册
搜索
查看: 8310|回复: 0

[收藏]一个QQ堂的资源图片解码器

[复制链接]
发表于 2005-5-16 14:45:06 | 显示全部楼层 |阅读模式
  茫茫长夜无聊,结果下个了QQT的小游戏。
7 S; c! U% Y  A0 n5 e. ~哎太幼稚的一个游戏。
8 _5 \4 ^. T: M5 U% a: e. Z不过里面的小人物倒是有意思。于是就把察看了图片资源。
' j) f& e( y3 X' b: G8 O8 v9 F5 S4 }% C9 j/ X6 \) r& _: D
呵呵~~有意思打开PAK保管发现第一个字节PK(ZIP的压缩格式),于是把名称该为.rar用RAR解压缩
0 W) ^" b" R- t
5 K/ F  P- j& M+ ~) L. A( C& }。。。。。。( y+ u# _% s' j7 {) y, [
成功。
( j( v( H1 ^* n5 f2 q, |6 ~
4 f4 W" [% x/ t! {
  f" t7 L( B1 K8 \结果打开一看全是*.img的文件。没见过~~~~~: G0 t  L8 s/ W
打开文件看晕 QQF.DIMG 什么文件格式。:( ~~~~~
' t' q! i4 R2 _6 [( Z$ \5 Q  L+ S8 Z$ r
于是分析了全部数据有点想16BIT的图像。但是有是24BIT的长度长14个字节。
1 i5 ]9 A. D' ^' z# O6 e" Z5 f4 [
" o# E' n, f! @: ^4 _; _。。。+ {# t% I  o* y6 Z$ e  M. d

) _2 k* v: N3 S/ |哎不说了。给点代码自己去研究。不过有点问题。* p" I3 d- B$ R* Q0 _

" h( f- Q6 n$ W我搞不懂直接在贴到屏幕上显示正常。
1 U, f6 O6 U5 Z+ e7 K; ]0 l% V+ M4 X, n* F
写成BMP发现意思比较暗。。。
0 b$ j- i; A" F( ^) ?  b2 l- T/ L
4 F5 Q! n; _4 s8 t: ~& E% F% k7 @' i+ e
typedef struct tagQQBITMAPHEADER{ // bmih
. o$ ~4 T; d- R( [1 F( S7 A! s    char   szName[8]; //QQF.DIMG 标志   8' R# f# N- I+ B6 R7 H  @
DWORD  bC1;       //65536
1 {! F7 q1 P8 B5 w3 m( bDWORD  bC2;       //24, W; l1 h. o1 l+ I
DWORD  bA1;       //
" |% B) s' J7 u2 TDWORD  bA2;       //
7 P, u8 O$ ?1 [9 w( [  G4 e: YDWORD  bA3;       //
) l1 K- X! A; J# A7 eDWORD  bA4;       //8 c4 H" ?" ^  b0 ~& Z0 \. g0 O! z
   LONG   biWidth;   //宽
& M" K, t1 i# p. E2 T3 @    LONG   biHeight;  //高! ]' N' O( l% T2 Y  x
   DWORD  biP; 3 [' X3 U& v& K+ k: y" D% _5 F
   DWORD  biB; 0 P4 H0 b( h4 r3 [4 ?9 H1 {
   DWORD  biC; - S6 z1 R8 h. }' n/ l
   DWORD  biS; , N0 }2 q0 T5 X7 Y1 e  X
   LONG   biWidth2;  //宽
8 ~- r5 ~! }2 k9 e& D5 c$ J    LONG   biHeight2; //高
- `- I% G* t# f7 p    DWORD  biClrUsed; + ~* t: e1 h3 {; L3 I7 v  t
   DWORD  biClrImportant; ; z1 Z) D) _) b$ O
} QQBITMAPHEADER; ) M- y; @$ @, ^3 E8 E5 t

( N# s/ L0 \9 z  g. K9 j  c& h9 w4 o7 c9 Q
void CBmpToolDlg::ExpBmpFile(CString strFile)
) c2 A" a" N0 N3 }$ F{8 A* F: u( l# i
BITMAPFILEHEADER bBmpFile;1 F1 x9 }: k0 G  E: v' Q
BITMAPINFOHEADER bBmpInfo;* R, @$ {. _9 o2 ~( I
QQBITMAPHEADER   bQQHead;  C) q8 v# D- l& a, r0 A
DWORD  dwReadSize = 0;
9 F! q4 p. W4 s- z2 B) Z" _WORD  m_wWidth;
4 D; d/ S! Q7 `3 Z9 hWORD  m_wHeight;
" k! c6 z/ X/ |' zDWORD  m_dwImageLength;
$ A# |& f7 L4 SDWORD  m_dwTemLength;
( {$ q7 W! u* N. H9 R0 w/ b/ PWORD  *m_pwImage;
1 j$ Y+ {$ q5 N/ B+ u8 e9 W8 jCFile m_SaveFile;
# M, }  j: r  `5 r8 sCString str_Text;$ a2 x% h$ f* w8 @

1 z% k  R; T) ?) w; k: { try
  V8 S4 U; G" b7 i) D {
0 u( h6 K. S/ [4 e1 `
; D: x3 [0 d! A7 N. E. T8 U! eHANDLE hFile = ::CreateFile(strFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,# s3 K+ f, e: _' W; Q
FILE_ATTRIBUTE_NORMAL, NULL);7 m( f4 j! A5 Z& k

- a, C; @: U& k) r( d# bif ( hFile )
8 }. Z0 m" j+ N0 i4 ^. y  }8 W, p{
" a+ P0 k1 `' G' ]) m) ]5 uZeroMemory(&bQQHead, sizeof(bQQHead));
2 i$ E8 I9 [" g% [1 d4 ?ReadFile(hFile, &bQQHead, sizeof(bQQHead), &dwReadSize, NULL);6 Y! }: n$ B3 t; q: E" D' p

3 L! k$ H+ O4 _) ]% ~/ Gif(bQQHead.szName [0] != 'Q')return;% w7 Y; R2 {; O1 m

0 B4 u: L5 H& X5 z. t+ e3 wm_wWidth  = (WORD)bQQHead.biWidth;
& x; Z2 w4 U0 D. k9 B0 Km_wHeight = (WORD)bQQHead.biHeight;
2 o2 C  W: Q8 m; m2 e4 @& Y
1 ^& u. K% g# N3 E5 E. dm_dwImageLength = m_wWidth*m_wHeight*sizeof(WORD);3 ]; K1 w) u' O; x" A7 e

) h; i) E% f& }; S3 pm_pwImage = new WORD[sizeof(WORD) * m_wWidth * m_wHeight];0 B! e5 m% v; ^$ J$ k

7 p' C" x( J# o3 Z0 [$ EUINT nSize = m_dwImageLength;! g8 g& G4 t" r1 y% L
1 i. h2 `. {  V/ h% d' V. S( `
ReadFile(hFile, m_pwImage, nSize, &dwReadSize, NULL);
* ?1 K2 t  y$ E6 f& `
# O9 c' R# a4 \' b' c8 `CloseHandle(hFile);7 k- L) d( a5 S' X3 n: H& ]8 j
}/ x4 ^% L- t5 }; }+ [) i
m_dwTemLength = 3 * m_wWidth * m_wHeight;( R+ J+ `* e0 E2 Y" `5 U+ n% |5 j: X
//重新构件一个BMP头然后在写入到新的文件  K6 q& v( t, }. \
3 h3 z6 P( V# b. I; x6 R8 z" ~
bBmpFile.bfType = 0x4d42;//'BM'" W! R7 [8 ?& ?
bBmpFile.bfSize = m_dwTemLength +  sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
. W. n( e2 M2 B  V% s  ~# I' TbBmpFile.bfReserved1 = bBmpFile.bfReserved2 = 0;9 T$ j0 s' \& I( n7 O8 P
bBmpFile.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //
8 @7 o+ q: L, }! m, P( c  s! A0 J. P//
0 {. Q. h) A- P. QbBmpInfo.biSize = sizeof(BITMAPINFOHEADER); //以下是为BITMAPINFOHEADER结构赋值
# h/ }" W) K5 B3 ]7 xbBmpInfo.biWidth = m_wWidth;
$ I$ y' G3 o$ w& l) _$ }0 IbBmpInfo.biHeight = m_wHeight;
. h& \  k6 `( HbBmpInfo.biPlanes = 1;% O; i+ s: L2 b7 ~" c
bBmpInfo.biBitCount = 24;
* ~+ P2 K$ [; o7 F- s4 X( g7 zbBmpInfo.biCompression = BI_RGB;
4 h$ ?5 ?, c% l: K$ P: HbBmpInfo.biSizeImage = 0;
. M* k/ {* z& C; ^& t5 CbBmpInfo.biXPelsPerMeter = 0;
' U7 j: |' R3 obBmpInfo.biYPelsPerMeter = 0;! ~+ g7 Y. [% f& [; J" P/ i! J
bBmpInfo.biClrUsed = 0;
4 Q( Z1 {, [1 p1 |! GbBmpInfo.biClrImportant = 0;
) [/ C9 w6 a0 Y* T8 B7 W$ h8 n/ N
+ q) g* D  d/ Q2 B9 C///////////////////////////////////////////////////////////////////////////
4 I& m  Y$ C' H" K# x//倒转图像数据
+ v9 U0 w' \- eBYTE *pOrgImage;
+ Y0 s8 X" b5 s! t- CpOrgImage = new BYTE[m_dwTemLength];
* ]! F* T' R5 K* Y+ ]" S4 B( _) f+ s9 y5 N9 s
BYTE bsBlueColor, bsGreenColor, bsRedColor;+ v6 G$ z8 R5 F* ~& s
//656- h5 U; x+ D* w' [  k4 U
DWORD dwBMask = 31;) g3 A. g0 [$ W+ T/ c3 @, N$ D  `
DWORD dwGMask = 2016;
+ [: Z. z8 e7 k! o/ vDWORD dwRMask = 63448;
% j/ X) [/ u) @9 O" l
  B$ }7 J( B, F- T$ F1 ABYTE bBShift = 3;
9 T2 G; u! ~8 \5 TBYTE bGShift = 5;  \; g8 ?8 H/ R& h8 k0 n" f6 I$ p
BYTE bRShift = 11;/ ]" z- m5 a" r( f

8 Z) B& P$ z: s6 i; \% g- S// wPixel = ((byRBit >> 3) << 11) | ((byGBit >> 2) << 5) | (byBBit >> 3);
3 a8 |$ u1 B7 E+ y' F/*
  d% j# I( G8 L. \9 KWORD dwBMask = 31;) N! [! s! H8 y1 z4 E" b2 K
WORD dwGMask = 2016;
# E1 Z) @6 H+ t' n: H; C% iWORD dwRMask = 63448;
$ m' s' n) y3 Z8 A, ^- x- p7 I0 I$ Y8 g5 ]7 p
BYTE bBShift = 0;
" X; l: R) H8 M( ^; o9 ^BYTE bGShift = 5;
; b7 r* S  ^" r) v: Y5 C1 ABYTE bRShift = 11;3 q3 K9 ~% [" U8 {
*/5 L  y8 }1 B9 a- L+ X: b! _6 r
WORD nXSize = m_wWidth;
/ ^! M- ?8 b: M. q. p( S8 n+ S: |int nByteAlignCX = m_wWidth*3;//(((m_wWidth * 24) + 31) & ~31) >> 3;5 G9 \' T2 Q0 `6 G6 L) X
8 f. @1 C# E8 i) X; i
str_Text.Format("%s New File 16Size %d 24Size%d",strFile,m_dwImageLength,m_dwTemLength);  W* F# w) e& _2 U) e
AfxMessageBox(str_Text);" D% g: ~! V4 p' K! m

; v2 t3 R, k& f5 gfor (int nYIdx = 0; nYIdx < m_wHeight; nYIdx++)6 n6 S; w1 P5 ]# k
{3 i% r3 H/ U9 {) j
for (int nXIdx = 0; nXIdx < m_wWidth; nXIdx++)4 J0 b. ?1 R2 \6 ~( a/ J- ]
{
) O3 B  V$ @; k! s//分色处理' i* R9 G9 m3 i* N8 e1 C5 _
bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] ) >> bBShift);
& K3 D2 Y  R' s8 \& M8 cbsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bGShift) << 2 );
" K4 {/ O: u' a4 l: h9 TbsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bRShift) << 3);* G6 w# b9 C2 [$ X
/* bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwBMask) >> bBShift); " C- R& d3 G: S) N2 [
bsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwGMask) >> bGShift);" ?4 x4 Y% x, N" B6 n4 G  E
bsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwRMask) >> bRShift);& I8 Z5 i( t' F3 s% v0 A0 o8 Z
*/
- _7 v7 q3 P8 G. q- _' XpOrgImage[(nXIdx * 3 + 2) + (nYIdx * nByteAlignCX)]=bsRedColor;% Z* U0 e) x7 @( G
pOrgImage[(nXIdx * 3 + 1) + (nYIdx * nByteAlignCX)]=bsGreenColor;7 l0 h5 }! Q: t! w/ F
pOrgImage[(nXIdx * 3 + 0) + (nYIdx * nByteAlignCX)]=bsBlueColor;% t- B+ i0 T( @' }! s- B
}
, @8 I/ B: Q; c! G: X}
( h# ~1 f: K: A9 x( p0 f) L( r, w1 I9 E, S. G$ C  |( a8 y
DeleteFile(strFile+".bmp");1 o( f6 t% Q. H% r, B  n: P! X
    if(!m_SaveFile.Open(strFile+".bmp",Cfile::modeCreate|Cfile::modeWrite|Cfile::typeBinary|Cfile::modeNoTruncate))- Z: B4 Z% [# C, Y( _
{5 s% t' w/ L( R+ d9 i
AfxMessageBox("建立文件发生错误!");
# M4 p1 T: \8 {- c9 q" }+ S: o         return ;
8 A& _( t4 r. y1 T' _4 s* ~4 Q }
% ]* E1 i+ h, B8 L/ X% M1 s m_SaveFile.Write (&bBmpFile,sizeof(bBmpFile));
: J* \  d* D# J9 ?. } m_SaveFile.SeekToEnd();
6 n5 P- P2 V0 `! Q
6 a2 X+ a: ^: A1 e m_SaveFile.Write (&bBmpInfo,sizeof(bBmpInfo));
, E) \4 n' ^* G/ ^ m_SaveFile.SeekToEnd();: V$ m( n* t* u& r$ Y  D
, l/ f% c" `8 e+ u0 z
m_SaveFile.Write (pOrgImage,m_dwTemLength);
2 b- @) N* Q6 Z$ k8 L: B  t* {- | m_SaveFile.Close();
2 ~, W. m: A: \) }; m, O  Q3 \0 x2 U$ k  P
if ( m_pwImage )$ V: G# y; t; {( k
{
9 M, Z" K. w; B3 Z! z* x) d7 X+ U delete m_pwImage;% Q; b9 D; g/ M; G% V, x
m_pwImage = NULL;
# p  c* g: u& b( ]0 N0 f9 ?* |0 C }
' K- @! y2 {# a2 O9 P# t2 K+ U if ( pOrgImage )
) K" n: h- K. }  E4 u8 ?4 w {   \; K/ I0 s* n1 D4 w" R/ o. M
delete pOrgImage;1 R5 m' M! ^/ `9 l7 h6 A
pOrgImage = NULL; 7 s2 o) Q9 e$ Q- [) s
}1 K0 M+ v- z6 [5 ^( C9 g
}
) ~2 `5 W- x2 g: p  z9 E: ycatch(...)
! Q$ X$ N/ D1 p2 A8 ?& [1 u6 r{. P8 K7 B* i/ k/ M& t1 E! @, S' ^" m
}0 |2 }( _8 @3 s. c9 Q  S$ z' W3 ]
}
. Z- q4 F! V3 n8 q. F
# g1 R5 K5 F- O" C6 V" {' q& P
, H( x, ^& _) y9 A该代码只能用于研究和学习中。请勿用于非法途径。
2 p- p8 z8 w9 N: Z4 R; F; w; G) I; S1 F; f! c
呵呵。; |1 H+ P3 E1 q9 k% a. e" S# Y
希望谁能结决图像16->24的问题请给我发一份。不胜感激
! ~0 W) h1 G3 G; n- k
2 b( O& z, K$ w1 ~8 Q$ D; `newsoil@163.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2025-11-14 18:10 , Processed in 0.019361 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表