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

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

[复制链接]
发表于 2005-5-16 14:45:06 | 显示全部楼层 |阅读模式
  茫茫长夜无聊,结果下个了QQT的小游戏。/ j: t& n5 \+ ]" y! y8 l
哎太幼稚的一个游戏。
2 L" t+ s: c. C  W4 f$ a/ [不过里面的小人物倒是有意思。于是就把察看了图片资源。& Y& e: _4 c( [1 `2 a

( D  p2 e4 Q  w7 V3 W7 X* X' R+ c; x呵呵~~有意思打开PAK保管发现第一个字节PK(ZIP的压缩格式),于是把名称该为.rar用RAR解压缩
% w3 w7 }. l! y6 P% k5 E! K" u: O: K- P8 f6 L4 r5 D
。。。。。。
' v% b% v. V8 Q; M. q, V成功。
( s( |# k* k9 A: ?) C+ Q) x: {0 c2 H+ a- j
$ x. n- _; w2 ~1 B) Z- I) r5 o8 |
结果打开一看全是*.img的文件。没见过~~~~~  P. s" ^8 u0 M8 x  v3 B3 M
打开文件看晕 QQF.DIMG 什么文件格式。:( ~~~~~- q- L2 I6 A2 I( U9 Y3 w, X
( C- g$ P7 N( Q; j
于是分析了全部数据有点想16BIT的图像。但是有是24BIT的长度长14个字节。
' X& w+ p; _  g, C6 ~7 }
9 W7 P# ]8 V8 u5 g& W。。。
  o/ [- \" ^5 X' E' M# `6 Q$ e; F8 H+ d2 ]  K
哎不说了。给点代码自己去研究。不过有点问题。
/ H: y6 p1 R9 c. g2 u( W1 ~" [5 o
# N$ y, x  R9 {1 |: X! d. l( s5 Y我搞不懂直接在贴到屏幕上显示正常。
' S; D. C. k4 J  R7 C3 D2 U' B; p( G
写成BMP发现意思比较暗。。。' u  I( o/ x( w2 o* W: p

' u$ m4 z. C+ F7 ?( W. F3 |3 h% r! l+ @7 Y# V, F- y
typedef struct tagQQBITMAPHEADER{ // bmih
/ k& I9 K; A7 |. ]1 F    char   szName[8]; //QQF.DIMG 标志   8
& v% N2 s1 K( g  QDWORD  bC1;       //655367 v/ j, ?& H% u: ^0 m! X" \
DWORD  bC2;       //245 r4 D' x( s0 k0 J' E$ ?' v
DWORD  bA1;       //
+ D& L' O+ Y8 PDWORD  bA2;       //
  o0 ]3 I0 |& P: hDWORD  bA3;       //
: q4 e0 l1 ]  XDWORD  bA4;       //; |: ?: C% u" X4 P) ?
   LONG   biWidth;   //宽0 Q$ C% j) Z+ l' i0 H0 B  ]
   LONG   biHeight;  //高
$ d- p9 R& f% C4 B0 T& P8 w. a    DWORD  biP;
& {$ b+ O; _6 U( d) p    DWORD  biB;
8 h6 y* T" G$ o    DWORD  biC; / j: r1 E, R! r4 ]1 c1 \
   DWORD  biS;
1 H! @/ p, T$ S6 k2 ~  s    LONG   biWidth2;  //宽( k' C8 F4 |2 F' w
   LONG   biHeight2; //高( I  Q  x8 F/ Z% D6 u! q( i
   DWORD  biClrUsed; + P9 U) A) H6 W) ]
   DWORD  biClrImportant;
0 P' g3 v5 @1 E6 [" X} QQBITMAPHEADER;
8 Z  ~! s9 i9 A6 X9 m' P
$ c( V) P, O; `9 `: W& I- n( ~* W7 R2 G) O" k
void CBmpToolDlg::ExpBmpFile(CString strFile) ( M! g( \- c) w- E- Q
{
7 O  d3 A1 L, j9 }) QBITMAPFILEHEADER bBmpFile;
( r" ?# r9 ]/ }( }! T+ @5 |BITMAPINFOHEADER bBmpInfo;0 L( {  J. y! U0 m+ o7 B# B
QQBITMAPHEADER   bQQHead;
$ I% W6 L5 `, @1 k% f$ a- r6 G' UDWORD  dwReadSize = 0;
8 ~0 n) s# U' r' qWORD  m_wWidth;3 U4 {2 Y0 w4 w) D2 r' L. q
WORD  m_wHeight;
; h5 I, ?3 G7 M4 ?5 WDWORD  m_dwImageLength;% r8 s  N" n* T6 w8 i
DWORD  m_dwTemLength;2 k/ _2 m) j' \" c
WORD  *m_pwImage;
0 Q6 [) S; S( X$ U7 r  f7 oCFile m_SaveFile;
: {' y9 a$ n2 S$ H5 Q4 X8 b$ YCString str_Text;, ?/ N  _& a. K& t# B

, v1 M! v; i5 j) u try
* c4 u* A0 k8 }& b% g* \ {& k. H' _5 A8 Y( _( w# I, W& X1 |

* _& k# `# E, _, C3 V9 x! b4 C+ EHANDLE hFile = ::CreateFile(strFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
  C( Y# _1 m  P; `  F) ?/ n, m* \FILE_ATTRIBUTE_NORMAL, NULL);5 K' \" |0 f" E9 l( I- x6 @

7 s, N, Y4 x- S+ Vif ( hFile )0 A- t1 G+ R" z4 u2 I% M3 l
{
+ i/ x1 X/ m. V0 F# Y' W7 UZeroMemory(&bQQHead, sizeof(bQQHead));* ]! M; J0 {2 Q2 o% s
ReadFile(hFile, &bQQHead, sizeof(bQQHead), &dwReadSize, NULL);  C/ z1 _: O7 i$ }
* ]4 x/ ?: i2 x8 R) ~# c! }/ l
if(bQQHead.szName [0] != 'Q')return;
; _* b& t9 M/ ]' k0 p1 h3 \
% a9 ]) o) r8 T+ `0 A; p9 }m_wWidth  = (WORD)bQQHead.biWidth;
) _  q6 y% G/ L: U; B" am_wHeight = (WORD)bQQHead.biHeight;& X) q0 m1 s3 w
& N- L$ H4 Q7 Y5 J+ X  L4 e; i3 s
m_dwImageLength = m_wWidth*m_wHeight*sizeof(WORD);: |; w6 ^& h3 B" l( W, c% g4 B* m
# @$ N  b* }% @: z; d' u, c, z
m_pwImage = new WORD[sizeof(WORD) * m_wWidth * m_wHeight];
1 |7 X. @) L, f& v
- \* `2 L8 a/ a+ r2 _$ [. _$ d$ xUINT nSize = m_dwImageLength;
, ]' ^* I! [$ Z
) R7 R4 Z; u4 Q$ lReadFile(hFile, m_pwImage, nSize, &dwReadSize, NULL);
! ^6 j; }2 s9 [3 {) |3 H2 C# L; L8 I  L; v# u, m  j: g
CloseHandle(hFile);
! q- l$ N, ?. W6 u& M4 [}
8 q- F1 C4 c( _: Z  Gm_dwTemLength = 3 * m_wWidth * m_wHeight;/ E' M; S2 ?. U8 k( Z, I
//重新构件一个BMP头然后在写入到新的文件- l% o% _: n. o. T. p/ q5 }+ g

( a# p, M5 e3 q2 X1 u# DbBmpFile.bfType = 0x4d42;//'BM'
/ l; C# Q& X& c( F8 ObBmpFile.bfSize = m_dwTemLength +  sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
5 q0 o' y' S& c2 V' L& |9 @bBmpFile.bfReserved1 = bBmpFile.bfReserved2 = 0;: L5 X+ h" C" k( U, c
bBmpFile.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //
4 P* w) W9 e/ a. K2 ?7 p, H//
* v$ a7 M1 m3 u4 Y' pbBmpInfo.biSize = sizeof(BITMAPINFOHEADER); //以下是为BITMAPINFOHEADER结构赋值
; c% k. d4 j0 BbBmpInfo.biWidth = m_wWidth;
# {: O0 r# A- {5 }4 Y; l* K# cbBmpInfo.biHeight = m_wHeight;% z. a, s' H. o" }7 t8 Y; w
bBmpInfo.biPlanes = 1;# V# _0 h3 O& v
bBmpInfo.biBitCount = 24;
' C8 S; v6 Y- b5 j9 E2 E6 IbBmpInfo.biCompression = BI_RGB;8 Y# c/ I! o: k
bBmpInfo.biSizeImage = 0;, }0 @9 k$ k, f: i9 t
bBmpInfo.biXPelsPerMeter = 0;% C5 t# K- }6 }$ M5 X! M
bBmpInfo.biYPelsPerMeter = 0;
' |% w1 u7 P* DbBmpInfo.biClrUsed = 0;
) n" K1 _3 z" ]( p0 x1 QbBmpInfo.biClrImportant = 0;5 d2 w2 P/ Z  m$ Q3 G0 A

3 i0 k6 n% Q' V///////////////////////////////////////////////////////////////////////////
* M+ q5 w) E, f//倒转图像数据
4 Q1 V) X+ V2 X9 E. `' B; P+ `BYTE *pOrgImage;, |6 t' ?3 W+ R5 }
pOrgImage = new BYTE[m_dwTemLength];" @3 }. X$ p5 B  N
1 X. M; r6 i5 V) @
BYTE bsBlueColor, bsGreenColor, bsRedColor;
5 H0 w. J+ C1 Y//6569 [" e8 g% ?7 O9 R7 V% {
DWORD dwBMask = 31;9 _7 z1 G, y: c7 M- s
DWORD dwGMask = 2016;& }5 l4 g6 f# j' @5 {  F6 ^
DWORD dwRMask = 63448;
2 a! w" K/ }7 G5 v3 v1 c1 [$ b8 k9 w8 P( o, ^) C, N9 O
BYTE bBShift = 3;- t0 f. V* C$ M
BYTE bGShift = 5;3 f* k0 }& n' Y. p
BYTE bRShift = 11;8 P8 D  S6 F& o; _3 e4 @

- s$ R$ ]* n. P9 ~; I1 P// wPixel = ((byRBit >> 3) << 11) | ((byGBit >> 2) << 5) | (byBBit >> 3);. b; d: a- Q# p
/*
$ J* u# [  v2 z$ mWORD dwBMask = 31;3 \* j/ a% R9 y
WORD dwGMask = 2016;/ F3 F. W" [9 X5 ]# [
WORD dwRMask = 63448;
& k' M3 u0 D/ G: V0 N, h7 p  Q# |
# h+ {1 G$ P- aBYTE bBShift = 0;$ X5 Q0 h8 Z1 j* K- A  L# b* A
BYTE bGShift = 5;
2 ~; g! v4 h. P* F0 DBYTE bRShift = 11;; X0 q$ I/ C* {& T9 b! e: n
*/5 g3 d% P" C8 m; H2 X$ `
WORD nXSize = m_wWidth;
  T  i% k3 D( e. I: gint nByteAlignCX = m_wWidth*3;//(((m_wWidth * 24) + 31) & ~31) >> 3;
9 j( L" L" h# |  o% X* p* E* k6 V9 ^5 u* F; c1 ]
str_Text.Format("%s New File 16Size %d 24Size%d",strFile,m_dwImageLength,m_dwTemLength);3 s" O# b5 X- a* O' R# u6 f' E
AfxMessageBox(str_Text);
3 x, y+ t, z$ q: h% o% V8 s' ?; w( @" o
for (int nYIdx = 0; nYIdx < m_wHeight; nYIdx++)
, |# X# m0 n/ _& w* B' A2 H  A- m{% {, N; X4 g/ ]' X1 d. Q
for (int nXIdx = 0; nXIdx < m_wWidth; nXIdx++)
5 A3 ?# d3 W5 |; q5 g* k! }2 d{ 6 f  J5 B$ R( F: ^
//分色处理; _: D% }9 H0 z
bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] ) >> bBShift); 6 a) q5 T1 t) C/ c
bsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bGShift) << 2 );
+ H9 H% L  R  e1 C( e* G5 UbsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bRShift) << 3);/ ^/ H) z- \( h8 p
/* bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwBMask) >> bBShift);
+ L3 g( e& @. dbsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwGMask) >> bGShift);/ ~8 Y% t# I% Q' d) k. L
bsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwRMask) >> bRShift);" x& c" G. C3 e9 q8 S" @
*/' G" c7 q0 O( v! G8 L# ]* C5 E9 J% C
pOrgImage[(nXIdx * 3 + 2) + (nYIdx * nByteAlignCX)]=bsRedColor;
$ q& Q3 g% U- O/ W) A1 G( dpOrgImage[(nXIdx * 3 + 1) + (nYIdx * nByteAlignCX)]=bsGreenColor;- M. i3 p) r4 e' z: z& U9 ~
pOrgImage[(nXIdx * 3 + 0) + (nYIdx * nByteAlignCX)]=bsBlueColor;- n1 m8 M3 j) c" D  J; S- x: @
}8 i- P9 T" ?1 n1 e6 ?) Y2 u
}
, W+ [  l" g) n- l5 l
1 I, ?4 ^+ A8 Z7 J DeleteFile(strFile+".bmp");( L- }1 H  S% O5 M, i3 J
    if(!m_SaveFile.Open(strFile+".bmp",Cfile::modeCreate|Cfile::modeWrite|Cfile::typeBinary|Cfile::modeNoTruncate))( z( T4 x; [# ^4 `
{
3 G7 ]: e6 y" H- n0 Y+ s9 U AfxMessageBox("建立文件发生错误!");# d: k" K4 j! B6 e6 _; _
        return ;9 y% F8 r5 `/ M! A+ y. ?5 A5 E
}
$ X; W. h, k6 Y# I, G/ p' }$ ~ m_SaveFile.Write (&bBmpFile,sizeof(bBmpFile));
8 v' J; O) ?/ K8 H% B1 ^ m_SaveFile.SeekToEnd();
$ b" n4 D  _% N
+ I& g& E( V8 D5 l# @4 x m_SaveFile.Write (&bBmpInfo,sizeof(bBmpInfo));) k7 Y2 @: |( w) T  B
m_SaveFile.SeekToEnd();
- E2 ]" z. ?) Q- X* p/ H+ X5 z  ]  _) ]" W; A/ N
m_SaveFile.Write (pOrgImage,m_dwTemLength);
2 S) a; ^& Z$ J' F; R$ b m_SaveFile.Close();
" E5 ^! U) D# K7 F3 E" |$ {& c0 ~' Q
* x9 E. `: n( K* Y6 E if ( m_pwImage )
2 i* W5 p2 s' t: I) n) J { ) i7 N( _: [6 _" G
delete m_pwImage;5 [" C) b1 ?3 t. A1 _" f4 g- z
m_pwImage = NULL;
+ m7 I) C3 y& V! N9 ^/ K2 V }  D( @7 A, t8 k, g4 o6 _1 ]9 C0 y
if ( pOrgImage )
4 N" v. W8 I) \" n3 ] {
7 t: @$ d' W7 q# R5 H' i delete pOrgImage;1 g$ T, G2 P4 g1 w
pOrgImage = NULL; # a' e: v: h: M) x  C. {3 E: D7 Y
}
6 V8 z" r% o; x) l6 v3 b}% c& o. }& R# n1 C* L4 Y
catch(...). ]7 I3 a  ~6 n) A$ E4 B4 b
{# {9 k0 l  A; F7 O
}7 |; X0 [1 N# M0 C" s; l6 H
}* i5 ?/ W; |9 o+ J# t
; M' b0 h! V2 H
' m1 P5 m; A, o" h& N
该代码只能用于研究和学习中。请勿用于非法途径。
" M+ O2 D' L9 ^' E6 S7 m) V  e! z& l& \* L6 f8 y7 [9 b/ F  g
呵呵。
: f1 ]8 n  X% a* L9 ?) D. k希望谁能结决图像16->24的问题请给我发一份。不胜感激
* i# m" _3 g4 w
8 k- ~. I$ P3 z" _' i2 p; vnewsoil@163.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 10:32 , Processed in 0.019051 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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