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

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

[复制链接]
发表于 2005-5-16 14:45:06 | 显示全部楼层 |阅读模式
  茫茫长夜无聊,结果下个了QQT的小游戏。
1 F# O% w) w) y2 c/ ^4 ?' A6 h: ^哎太幼稚的一个游戏。
- n. _9 M% N: P- u  j不过里面的小人物倒是有意思。于是就把察看了图片资源。* @6 x$ |  x0 s2 L+ N4 Q' J# _
; T8 C2 k% s4 t
呵呵~~有意思打开PAK保管发现第一个字节PK(ZIP的压缩格式),于是把名称该为.rar用RAR解压缩
6 D) B  h' j* r# y; W  L- b' c3 b5 k% T4 C
。。。。。。
( l, m* b& O. K; E4 W成功。
+ p3 Y* a0 z+ @) a. O" i
# I2 y2 m. u  k5 f# W, Y
- W3 @2 M8 \: ~& E$ \. e结果打开一看全是*.img的文件。没见过~~~~~4 v1 \) x/ H; b! f, @, F
打开文件看晕 QQF.DIMG 什么文件格式。:( ~~~~~3 x( x6 s! b! J8 F1 O& z7 ]6 d

5 x; j7 u  K& G$ o- w( p于是分析了全部数据有点想16BIT的图像。但是有是24BIT的长度长14个字节。, l! L. v% \: A6 H' R, }3 E

3 n# \. w7 b( B/ w' E。。。! Q. N8 Y& o7 q  g8 d

- ~! E  S* j4 b, g; u哎不说了。给点代码自己去研究。不过有点问题。
, c/ U6 {8 g( j8 _2 U7 I" f
4 q! `+ w7 h$ I' ^我搞不懂直接在贴到屏幕上显示正常。
0 Z  N4 t6 r# u5 C: i7 G! R! }, N% @7 B
写成BMP发现意思比较暗。。。/ h; a+ Y3 m6 x3 F1 X, |, c
, d- C% t+ s1 p! R# e# Z

1 r, L9 B5 E3 Rtypedef struct tagQQBITMAPHEADER{ // bmih . _$ V2 Y' ~# E% T1 {+ a: V( e
   char   szName[8]; //QQF.DIMG 标志   8
9 \+ ~  M  z2 u/ s& i/ C" g, v9 mDWORD  bC1;       //655360 J4 L% I% d, \% G! Y
DWORD  bC2;       //24
8 F. d4 `* i( [DWORD  bA1;       //
' z2 U1 H) g# J; u. VDWORD  bA2;       //
0 f4 x# p7 X7 QDWORD  bA3;       //7 ~: K! C& m6 X
DWORD  bA4;       //. y* F) _& w4 k) n! j  V/ Z/ V; a
   LONG   biWidth;   //宽5 L2 v8 q5 r4 J; [# h
   LONG   biHeight;  //高! _( b- K! p5 \3 ~: `, [
   DWORD  biP;
7 n( G8 Q+ w8 Q    DWORD  biB; 6 H  z; p8 I* k& N- X! G$ k: Y! w' L
   DWORD  biC;
0 A& r! O0 ?; k( h3 j    DWORD  biS;
; L* p) b( A3 J- P$ h5 s) ?    LONG   biWidth2;  //宽; g" ^; k% g; Z
   LONG   biHeight2; //高: ^, R: A, g' q2 g2 J# `6 C; c
   DWORD  biClrUsed;
# K  K. [* y6 u6 l8 @+ d    DWORD  biClrImportant;
7 P% G6 g; X+ O$ G9 a4 F2 Z  r7 j} QQBITMAPHEADER; , |0 ~  S2 X/ }/ W4 a. o
% O5 Y  f0 T' [# C1 f0 F1 I1 n
$ ^9 l  D' w5 S* I1 A' y" P
void CBmpToolDlg::ExpBmpFile(CString strFile)
! [3 v. h3 I; i{. m8 Z: B$ n# u
BITMAPFILEHEADER bBmpFile;3 A: c/ D8 B6 a7 a
BITMAPINFOHEADER bBmpInfo;
* Z6 O/ R* i. P. v. ^% s, w! tQQBITMAPHEADER   bQQHead;
( Z) F$ d9 w& J- ^9 m4 I2 DDWORD  dwReadSize = 0;
( d- l& V' ~/ g$ \0 d( YWORD  m_wWidth;
6 K! q( }' X4 Y9 G, L  F5 y& o& bWORD  m_wHeight;2 h2 ?- ]) o% B; t2 H/ |: l0 c
DWORD  m_dwImageLength;5 k+ j5 K7 A7 [% y, J' Q
DWORD  m_dwTemLength;
/ f, e* J: t# t- U) o' c" fWORD  *m_pwImage;
) A, g+ K" H0 }% Q& ECFile m_SaveFile;7 O: I1 [6 N  [8 w+ ~
CString str_Text;0 @' u1 F6 U  P& [0 I

2 i* G, J# _! ], h try
/ q& h( j" P- K8 _/ u# ? {7 Q# ~# x- U0 {2 }9 H6 Q
6 v0 K& q+ x' u' _( Z: i" j% y
HANDLE hFile = ::CreateFile(strFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
* W% w* \& D$ \. @; LFILE_ATTRIBUTE_NORMAL, NULL);
* k7 G+ m, u/ @& z. N1 ]6 i: I% t2 w4 U4 Q8 y8 D) u! T8 ?8 h8 I, d/ s6 L$ G
if ( hFile )
& H1 ~5 P' ^7 `# k{
, P) W7 j# V6 ^) ~; J: W$ ]( o' nZeroMemory(&bQQHead, sizeof(bQQHead));
: A9 q" g+ A$ J% F7 L8 bReadFile(hFile, &bQQHead, sizeof(bQQHead), &dwReadSize, NULL);+ F+ y% A" y9 `# H
+ G! U+ d& G" d9 ~4 \! I& b1 g
if(bQQHead.szName [0] != 'Q')return;3 o$ C! p, b9 S1 G( x

, U0 D8 L8 T  C. Q, H+ {' Om_wWidth  = (WORD)bQQHead.biWidth;
5 b9 }6 K& E8 A- X% J' }8 J  B, \m_wHeight = (WORD)bQQHead.biHeight;
( N' M- V# N6 B- J- x7 x0 |2 }; g2 z  M6 u
m_dwImageLength = m_wWidth*m_wHeight*sizeof(WORD);
( R) Y  U- v# Y6 r! V5 }8 o* N0 N( g0 W9 |& |' A+ p* _
m_pwImage = new WORD[sizeof(WORD) * m_wWidth * m_wHeight];
# U2 V' B0 H/ R1 f+ F1 `6 U; d1 u% M" f; P: Y8 T: m
UINT nSize = m_dwImageLength;
) s( p  G+ C. z3 K& n8 r" r; u: ~7 b% c3 u' {" d0 m
ReadFile(hFile, m_pwImage, nSize, &dwReadSize, NULL);" ?, x: v& E' S: @+ o$ d) g
# [. B9 [  n6 b8 p& n. m
CloseHandle(hFile);. g7 n" L9 r9 }
}- R' p. h% i: D3 k, k% |
m_dwTemLength = 3 * m_wWidth * m_wHeight;1 J, {) J9 k! U. c
//重新构件一个BMP头然后在写入到新的文件; O1 i( d, V6 W8 U" t5 K
. O/ D9 T, [5 G- _8 b
bBmpFile.bfType = 0x4d42;//'BM'0 d6 @% D- F4 U7 i
bBmpFile.bfSize = m_dwTemLength +  sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);! T0 T% N  D* G  f& J
bBmpFile.bfReserved1 = bBmpFile.bfReserved2 = 0;  b, i' i) Q# Y
bBmpFile.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //: I; F0 K. C! p9 }
//4 u  K" N, m0 J6 P8 ]) q& e$ G) U0 f
bBmpInfo.biSize = sizeof(BITMAPINFOHEADER); //以下是为BITMAPINFOHEADER结构赋值, e1 T, A% v' j0 W# P  \
bBmpInfo.biWidth = m_wWidth;' g, T0 a5 o1 y: D+ g; Y
bBmpInfo.biHeight = m_wHeight;# I" g' ^# ^' n0 k; n# i
bBmpInfo.biPlanes = 1;5 e0 ]) g8 p+ H4 e* J
bBmpInfo.biBitCount = 24;% o4 I4 _; J1 H
bBmpInfo.biCompression = BI_RGB;
) n7 p7 e- h' QbBmpInfo.biSizeImage = 0;8 h& N4 e. o! H3 _
bBmpInfo.biXPelsPerMeter = 0;
6 ^4 {) ^& W5 r% z4 abBmpInfo.biYPelsPerMeter = 0;. n# \0 @6 C2 j) p2 O
bBmpInfo.biClrUsed = 0;
, ]4 F1 o. k( O7 N2 d# SbBmpInfo.biClrImportant = 0;
3 t  a. u: @  b/ v4 |% a% e/ C* D; C  q% \# H4 @6 S* o- h/ @+ a
///////////////////////////////////////////////////////////////////////////' p- c. M  Z9 J. A. u
//倒转图像数据
& L* I/ e0 C" iBYTE *pOrgImage;) W1 s2 d7 C4 g0 J2 o5 P" b) S0 C
pOrgImage = new BYTE[m_dwTemLength];
& w7 u! A  o5 C3 R8 r7 F0 e& j' S3 i1 X
BYTE bsBlueColor, bsGreenColor, bsRedColor;
0 m4 {5 c+ r. h1 e; a$ m* S0 R6 E//6568 ?: J, K. E/ E, t
DWORD dwBMask = 31;# o  ?- }% ]& H0 a' P8 ?' y
DWORD dwGMask = 2016;8 a' V& x9 u; n( |% H1 f
DWORD dwRMask = 63448;0 S" F9 p7 v" S
$ w6 {+ [- w% D& V' |! s
BYTE bBShift = 3;
" X" V) h! a  Z; O- EBYTE bGShift = 5;
, L1 W8 i% c; e5 G# H3 sBYTE bRShift = 11;
( i; B) M4 k9 X. V+ N8 y; e% Q, K. O( }3 E& s! v
// wPixel = ((byRBit >> 3) << 11) | ((byGBit >> 2) << 5) | (byBBit >> 3);" F5 H' b+ T& F7 ^
/** T) z1 F' X+ J: Z" B/ D
WORD dwBMask = 31;- W/ F: Z1 \! w& t* x
WORD dwGMask = 2016;/ ~3 @, C2 q& V. i* u0 P
WORD dwRMask = 63448;
' U. n7 P8 Q! B2 G; y4 G
" b8 Y8 {/ D5 g% U" dBYTE bBShift = 0;7 i6 T7 Q9 \+ a6 K$ ^1 E+ t' M
BYTE bGShift = 5;% U% I+ \% q7 h- v  |: c. [( k
BYTE bRShift = 11;
8 f" ]3 `% G& i*/
. n+ O; s; f3 b0 D2 t  x, [WORD nXSize = m_wWidth;
/ K, n2 `: \4 m: ~) A& rint nByteAlignCX = m_wWidth*3;//(((m_wWidth * 24) + 31) & ~31) >> 3;5 G& W. q, i$ {
* ^( D6 A; {8 \- s( \1 r* P7 `3 m% b
str_Text.Format("%s New File 16Size %d 24Size%d",strFile,m_dwImageLength,m_dwTemLength);# `: |2 V* X# v" z; ^3 L" G! N
AfxMessageBox(str_Text);2 V" h( ~( q0 o2 M, I5 F
3 Y. `$ O2 q6 p( u7 T8 |. b
for (int nYIdx = 0; nYIdx < m_wHeight; nYIdx++)1 T8 v9 E* K. l3 v+ k* F& l2 ]* A
{9 ?! B! E2 H/ A
for (int nXIdx = 0; nXIdx < m_wWidth; nXIdx++)
) o) b+ q5 K$ f+ p{
3 e" [5 `) V, l2 L+ P. r//分色处理
5 k9 T. D  n( L# G# f/ ^bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] ) >> bBShift); ! k7 L! c) `! G/ c. E
bsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bGShift) << 2 );
+ f% g# o8 ?8 x5 \9 r) ybsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bRShift) << 3);5 N) o6 n2 ~3 O# D/ e- s; n/ N
/* bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwBMask) >> bBShift);
* `; A7 Z+ r* ?4 {3 ^6 |  c$ r% [bsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwGMask) >> bGShift);) }, A# X* r0 c, q. v1 o
bsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwRMask) >> bRShift);+ r$ W0 {+ i. `  X/ s* i9 L: `
*/
% d/ l" M8 E1 J: E8 b, j" H- [pOrgImage[(nXIdx * 3 + 2) + (nYIdx * nByteAlignCX)]=bsRedColor;
* O+ g% l4 R& E3 F" d" j- E* dpOrgImage[(nXIdx * 3 + 1) + (nYIdx * nByteAlignCX)]=bsGreenColor;. B% U" U/ K# A- n  w& Z& Z& H8 t
pOrgImage[(nXIdx * 3 + 0) + (nYIdx * nByteAlignCX)]=bsBlueColor;
- m. Z" _+ y" p* y9 d, a/ M}
+ S/ D* R$ K9 ^9 Z& h$ t7 g}
/ J: Z! A$ q* K" F; p: B# k: _, u9 U9 R# b+ P/ m' f" h, U
DeleteFile(strFile+".bmp");. K6 p5 l' z2 N# u0 B6 }7 q- `
    if(!m_SaveFile.Open(strFile+".bmp",Cfile::modeCreate|Cfile::modeWrite|Cfile::typeBinary|Cfile::modeNoTruncate))# }/ ]2 D8 ^. }* s( y
{9 `! G; B- d3 n3 m# B& f: e
AfxMessageBox("建立文件发生错误!");  q) n  x$ z& |3 S$ ?! s
        return ;9 i( }0 Z0 _% y' ~
}4 V; V9 P7 g5 u5 |
m_SaveFile.Write (&bBmpFile,sizeof(bBmpFile));
6 S8 p4 ]9 O3 V# v m_SaveFile.SeekToEnd();; }; L$ x% V* n/ R9 Y. |
  T# B$ q. H" b& l% {: U: ~; K) B
m_SaveFile.Write (&bBmpInfo,sizeof(bBmpInfo));! K* k. E5 r1 U% `0 _; m2 w
m_SaveFile.SeekToEnd();& W1 R% ]8 o5 j% Q: z
, J( \+ p6 ?2 X, a3 r' ]' I; W6 \
m_SaveFile.Write (pOrgImage,m_dwTemLength);/ O' G1 q$ }5 Q8 G8 Z7 F( U
m_SaveFile.Close();
: p! N1 g$ C; K- z5 x' `
4 M" s* {# n" \$ j& a$ w if ( m_pwImage )4 I& d) y- k4 {4 M# x9 P
{ # G) G6 w% R% Z
delete m_pwImage;
/ H5 a& M  A% [/ y# U5 m' z  n( V m_pwImage = NULL;
7 I) s: H6 Z: J4 Z4 o: j( O }
9 ^- j) X/ o# Y+ |5 g if ( pOrgImage )
) H& \; V! ~: ]! P! n) o% o { ' G/ f' q+ a) ]  m
delete pOrgImage;( V3 I+ y' U  g3 q! S
pOrgImage = NULL; . H3 W- Z  V5 y. F, G0 D* e
}
0 @1 L: }# P" N4 X4 v}! a$ x" z" I/ ^: M
catch(...)6 W4 W4 D( {2 F3 |; H3 p2 q
{. d" D4 |' d9 B, K9 P9 Y. d% Q
}/ t2 r# a, x' z5 F% k
}
3 _+ n7 S; X7 d  y* h9 ~
' u7 n2 E; q4 X4 z
; x. [: w4 M# O; `该代码只能用于研究和学习中。请勿用于非法途径。
7 e* [) ^1 q# v3 S. g/ g
9 t+ ]4 A$ W, k/ ^. n2 Z3 W呵呵。
$ p) D8 X& C( @, A0 ?$ e  M8 E$ K希望谁能结决图像16->24的问题请给我发一份。不胜感激
! m7 h: t' O; ?! _0 d7 L$ Z6 e5 ]: J7 F$ S) ~- I8 a4 ~7 Z
newsoil@163.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-9-30 13:05 , Processed in 0.039387 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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