找回密码
 注册
查看: 8914|回复: 0

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

[复制链接]
发表于 2005-5-16 14:45:06 | 显示全部楼层 |阅读模式
  茫茫长夜无聊,结果下个了QQT的小游戏。
- ~* V( K2 N( V! K2 @哎太幼稚的一个游戏。
/ z' Q' e, n- l4 w$ u7 p8 C& x不过里面的小人物倒是有意思。于是就把察看了图片资源。
4 ^8 z' O  g0 J0 }' ]+ U7 u% s4 r5 U+ m/ Q# ]) P
呵呵~~有意思打开PAK保管发现第一个字节PK(ZIP的压缩格式),于是把名称该为.rar用RAR解压缩. E! t9 h5 R# s0 @

/ d: a5 U" S+ q/ _。。。。。。) A5 ?% O% n. e0 ~% t9 h
成功。7 w* m5 ~4 D3 o( s8 A* `5 o, f

) C- h% C8 t3 {8 v) Q5 H6 ^5 U2 p/ ?$ F4 u! S
结果打开一看全是*.img的文件。没见过~~~~~5 n& f$ k6 X2 ?0 m4 n; r
打开文件看晕 QQF.DIMG 什么文件格式。:( ~~~~~2 b: K( b( k, N% _5 G9 B

" X4 P# I( f2 [- X于是分析了全部数据有点想16BIT的图像。但是有是24BIT的长度长14个字节。
  P% h) j' `+ F% c% ]/ q9 X! j# N% N$ @. z
。。。
  C. [( m7 e2 W9 E% p) D/ d- |- D- [) Q* y
哎不说了。给点代码自己去研究。不过有点问题。  K9 N! H' y- `9 Z) I/ s

* E4 B* _% }" J4 x$ Y/ f" u我搞不懂直接在贴到屏幕上显示正常。$ L! F& j/ N* V! L

) `  L+ ~$ G7 I' p& C写成BMP发现意思比较暗。。。
: @5 y+ I2 M- m# v
* q: c0 N/ \- h2 P7 T3 ?( w3 R6 b# g
typedef struct tagQQBITMAPHEADER{ // bmih
  [6 G" x1 u4 a7 e& C& X    char   szName[8]; //QQF.DIMG 标志   8
4 e2 A# P2 f$ a3 h3 V# p! i8 A& hDWORD  bC1;       //65536
/ S+ d0 Y, }% r! w. `3 m* O& @DWORD  bC2;       //24' f- z5 j9 r) A5 R) c; @
DWORD  bA1;       //
; I) f+ d, Z2 |& B$ O5 TDWORD  bA2;       //
7 y% U7 c% y# ^0 bDWORD  bA3;       //
- \: ]6 V2 `, C' B. |; V* cDWORD  bA4;       //
9 q/ s, y7 k! ?6 B! H    LONG   biWidth;   //宽# F" e( J. v$ b/ e: X& g2 p& u
   LONG   biHeight;  //高
( R9 x0 T0 @* h0 d    DWORD  biP; ! l0 _( J" ]# ]/ h: f: b- k; ?( q: K
   DWORD  biB; $ E# D( I5 E. B5 e8 }5 r2 y0 f
   DWORD  biC;
5 {$ q0 p6 w9 k! h    DWORD  biS; ( j9 R7 k$ j3 t3 d
   LONG   biWidth2;  //宽
+ w5 e& ]! d$ T6 u; m) L2 ]# R    LONG   biHeight2; //高9 J( e* m2 |# z
   DWORD  biClrUsed; * l* o+ s+ W* c# V# ]- L6 _
   DWORD  biClrImportant;
$ p+ h& |5 m+ r0 z* O- j) r5 x  V} QQBITMAPHEADER; ! `. l, U  a" a. t; u

- z! X7 w# v  a1 K
2 L' V3 J! j7 l9 G9 m3 I# Wvoid CBmpToolDlg::ExpBmpFile(CString strFile) ! g* y6 p8 E3 f- Z% f
{* {' D/ E. ]; R
BITMAPFILEHEADER bBmpFile;9 B" {& Y1 V; m: N/ v3 z, K
BITMAPINFOHEADER bBmpInfo;" d, O& P9 O! o  W. S. q7 s
QQBITMAPHEADER   bQQHead;; k! f' K0 }) w' \
DWORD  dwReadSize = 0;7 I  _; V" |- j3 s5 _
WORD  m_wWidth;* Z* b* K. [0 d% h/ z" o) @  ^
WORD  m_wHeight;7 O# o6 S" [) z3 i# D( X* |
DWORD  m_dwImageLength;! g! y% o  @% g8 U+ v- F: y
DWORD  m_dwTemLength;% e6 T+ d- j1 A- ^( Z7 z) {9 E
WORD  *m_pwImage;
, H* n, L4 W# ^" q5 WCFile m_SaveFile;2 R/ X% K% v) y6 Y
CString str_Text;  [* l2 C- _6 j0 d8 B& c
* ^/ F% L$ g0 i  `7 `# w# R
try% o6 b9 F0 J, h5 V* n5 c& Q! p
{5 p8 F/ {  @7 m  Y

5 @+ ~( R8 e# N/ k' l4 q5 PHANDLE hFile = ::CreateFile(strFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,9 [4 E; i, Q1 U, Z8 A8 R7 ^
FILE_ATTRIBUTE_NORMAL, NULL);
0 O) J5 g% ]. q9 U9 v( R% F6 N4 c' y% w( a
if ( hFile )
1 T9 N8 ^% q  f! y: n# K{; t; \# r- k! |: v% X1 ~
ZeroMemory(&bQQHead, sizeof(bQQHead));7 D6 i4 y2 j; G1 B- K% j3 F. h& ^
ReadFile(hFile, &bQQHead, sizeof(bQQHead), &dwReadSize, NULL);& d% D, ]2 H* c1 D3 }
2 q' C1 k5 w8 c! f* D
if(bQQHead.szName [0] != 'Q')return;
! f0 A. ]: c. W; d+ Q7 y/ g6 J# ^. u  b& _
m_wWidth  = (WORD)bQQHead.biWidth;
8 x9 Z" }8 v6 q* X) d3 |2 m: M( nm_wHeight = (WORD)bQQHead.biHeight;
" a0 T8 i' F" P( Y3 a* e* B
8 l! |5 L1 e) r8 T' O( j6 ~/ lm_dwImageLength = m_wWidth*m_wHeight*sizeof(WORD);
7 z  L9 D& X$ h5 f' \" a0 L0 t' @- `+ p6 X. g
m_pwImage = new WORD[sizeof(WORD) * m_wWidth * m_wHeight];  |8 Y9 q6 ]( t9 y0 p8 d' H
: [+ q) }! ^: @4 `2 Z1 H; t1 `% E
UINT nSize = m_dwImageLength;4 d' t$ C- u4 g) W
1 E4 O: J" }. P" b! R
ReadFile(hFile, m_pwImage, nSize, &dwReadSize, NULL);* X& p4 [- O1 p& M/ K; m3 N; B$ [' {: W

  |2 ?4 e, v/ e* f0 ], \; `6 yCloseHandle(hFile);9 L4 @' O" f8 m6 x! Z
}8 B* {0 v' d" v) y7 k
m_dwTemLength = 3 * m_wWidth * m_wHeight;
# m" `0 y7 _3 C& S1 N//重新构件一个BMP头然后在写入到新的文件
$ }4 i% B; h* ~: m( [  Q& X
; Z+ O& t: ^- X  `& r$ ?bBmpFile.bfType = 0x4d42;//'BM'0 t1 S' Y* m8 e6 I; [: F
bBmpFile.bfSize = m_dwTemLength +  sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
2 Y& k3 Y# p( K4 rbBmpFile.bfReserved1 = bBmpFile.bfReserved2 = 0;3 T: o9 F5 I5 b
bBmpFile.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //1 j6 L8 k" Z+ f# p- r% m
//
& p. i. `; j0 D- obBmpInfo.biSize = sizeof(BITMAPINFOHEADER); //以下是为BITMAPINFOHEADER结构赋值
- Z% r" N5 o' O! w8 k, f2 r; LbBmpInfo.biWidth = m_wWidth;
" ?  a0 B9 |% U1 V! NbBmpInfo.biHeight = m_wHeight;% F! P6 f* S. M
bBmpInfo.biPlanes = 1;' T2 d2 E. E% o
bBmpInfo.biBitCount = 24;
2 {7 c0 k0 s2 `' A' WbBmpInfo.biCompression = BI_RGB;& F: B* F# e8 ]9 A
bBmpInfo.biSizeImage = 0;
( R+ M1 l4 p2 s6 `! {% T' a4 W3 zbBmpInfo.biXPelsPerMeter = 0;* l) i6 O  q! i" t! u9 ?5 L$ J% Q" ^
bBmpInfo.biYPelsPerMeter = 0;( q$ D4 P! F8 \" H9 A
bBmpInfo.biClrUsed = 0;
/ a; P: d  d! k6 K/ |bBmpInfo.biClrImportant = 0;9 T) B7 k1 w8 j
( A( F4 w, Y( G9 ^5 Q
///////////////////////////////////////////////////////////////////////////, ?2 N' E# w" [, C3 b# {0 S( S9 {
//倒转图像数据
" w3 U0 j- X( w) |$ ^9 b) eBYTE *pOrgImage;
8 F$ x" l- C6 g% CpOrgImage = new BYTE[m_dwTemLength];
+ @( X/ ~( o4 g! D8 \2 c% [* Q) t0 G: M
BYTE bsBlueColor, bsGreenColor, bsRedColor;/ x- H% t1 ]4 Y9 P
//656
4 G! _1 ]% Z6 x# U) jDWORD dwBMask = 31;
+ I5 d9 v% d6 xDWORD dwGMask = 2016;# _  u2 w  g. N3 a
DWORD dwRMask = 63448;! b: P2 |+ z! S% c$ o/ b

0 E' a/ f2 I8 `/ ?/ BBYTE bBShift = 3;( y! q, S3 f& h
BYTE bGShift = 5;) o. y" ~+ R3 P$ u/ ~# v
BYTE bRShift = 11;; d- }. W3 g. Y' y, ~

1 j' j! p3 m+ ]) x// wPixel = ((byRBit >> 3) << 11) | ((byGBit >> 2) << 5) | (byBBit >> 3);9 B0 [9 t8 y# R2 s* h
/*
. S) d; x4 L8 k- C: d% OWORD dwBMask = 31;
7 _: N# n% x5 d( x3 GWORD dwGMask = 2016;* e/ o3 d- p' }9 m2 E: g8 s
WORD dwRMask = 63448;6 G5 m) W1 P( W+ }! ]: X" F
& P' J& \2 @7 Q" g7 L+ {
BYTE bBShift = 0;
  w, K7 d4 L% ^) nBYTE bGShift = 5;: x1 _7 C/ o8 n; j+ A
BYTE bRShift = 11;% U3 p: x9 Q  y
*/
9 j( c4 o+ Y2 h$ r* a& j$ H& hWORD nXSize = m_wWidth;
/ d$ D8 a. ]+ sint nByteAlignCX = m_wWidth*3;//(((m_wWidth * 24) + 31) & ~31) >> 3;2 L. Y, t# ?+ G8 S8 x/ O
* @! j' `* p$ S' R) {% n
str_Text.Format("%s New File 16Size %d 24Size%d",strFile,m_dwImageLength,m_dwTemLength);
' b; q' C# |; _) _- s8 D5 JAfxMessageBox(str_Text);
, r* e& J+ [* t9 x  L/ p
! k7 @  Z8 p, n) H- Dfor (int nYIdx = 0; nYIdx < m_wHeight; nYIdx++)
; U' u$ l' ^6 R( b3 e# R{
& ^5 g& T0 v( g# z" K- ]. \for (int nXIdx = 0; nXIdx < m_wWidth; nXIdx++)
& B* K/ S/ d6 a" i9 Q# n9 z{ # G4 {0 D2 n# G# Q* ]6 D
//分色处理
: s0 \, c+ R* G! f3 a5 A% N" tbsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] ) >> bBShift); , L% p' S0 k' `
bsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bGShift) << 2 );" v  `) D+ D& V: @) g
bsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bRShift) << 3);
+ B' s$ g5 F  E0 \# }5 M/* bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwBMask) >> bBShift);
+ h& R( \1 ]" R3 ]0 C6 `$ b) M1 ?' BbsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwGMask) >> bGShift);
' o& Y7 r) _/ HbsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwRMask) >> bRShift);& _: l) J" [: {1 ^( i+ F1 B+ B5 Q
*/9 W" M2 H* o: }2 [" Y# c
pOrgImage[(nXIdx * 3 + 2) + (nYIdx * nByteAlignCX)]=bsRedColor;# G! q# K* V# |9 ^/ }( \5 f! M  N
pOrgImage[(nXIdx * 3 + 1) + (nYIdx * nByteAlignCX)]=bsGreenColor;
1 K9 h; ]" A/ ~9 d, a1 H% apOrgImage[(nXIdx * 3 + 0) + (nYIdx * nByteAlignCX)]=bsBlueColor;
9 ]) u7 ~, e( M) e: D  L2 e) R}/ ^+ ]% L# J2 y* ^9 {6 T: d
}
* U* j6 F# @& C/ g2 R0 m$ I
/ o6 f3 y; M8 Z8 Q3 Z% b DeleteFile(strFile+".bmp");% w* ~9 M6 x; W9 {
    if(!m_SaveFile.Open(strFile+".bmp",Cfile::modeCreate|Cfile::modeWrite|Cfile::typeBinary|Cfile::modeNoTruncate))
$ f3 D, ~" ?0 T# d' B {
/ x2 W0 K+ s( A) t+ l3 P  h AfxMessageBox("建立文件发生错误!");
! ?7 e' }5 i  f7 a% J8 z  f         return ;
2 }. u' Z9 T# ]- C9 s }  I0 e1 ]+ p2 o$ N
m_SaveFile.Write (&bBmpFile,sizeof(bBmpFile));
- Z1 H- S0 r( G4 }; S m_SaveFile.SeekToEnd();! o% [& G- |$ D& J! p) z. n

4 @  S6 T8 W; @. ^& L! x# p m_SaveFile.Write (&bBmpInfo,sizeof(bBmpInfo));
  E. l+ o7 D; S4 L( Y  S m_SaveFile.SeekToEnd();
+ s8 Y1 }( |  }
, @. }3 u1 Z0 v m_SaveFile.Write (pOrgImage,m_dwTemLength);% K8 K5 d5 }% z3 ^  S$ ]' a
m_SaveFile.Close();5 i5 L2 x3 w) E& Y8 K- b

; N/ ^! ]6 Y3 v& b3 `( z% j if ( m_pwImage )
" u2 O( B1 r' _! w- @ {
/ r2 e2 b$ z, m$ z" D2 `! l- f delete m_pwImage;
6 M: Q' I8 e" d' C* K2 N m_pwImage = NULL;
' w- h& b% R0 V& S0 Y( x8 l8 k }8 x9 }+ j6 e# j- N
if ( pOrgImage )
4 z( l, k, h' L/ _& \( ] {
& d9 u5 n/ B5 y0 w delete pOrgImage;. n% G2 f# P# o' f4 z% Y
pOrgImage = NULL;
5 ?/ ~7 q4 B1 z6 }" z; H" r }
5 _  a6 l2 w9 H1 g; r8 u}* r6 x  y4 W$ A9 d
catch(...); ~6 D% j9 v* M; j
{% H( `8 T% v. s$ a, `. N' D- u
}
" A* A0 W9 Y7 Q1 l2 A2 X" r}+ ~, F& {. A  P
6 A# O! u- h3 y& W; [
& z6 m/ ^2 y1 O$ E+ U7 y6 J
该代码只能用于研究和学习中。请勿用于非法途径。
3 P0 S! k! U8 T" D
! R/ A2 l, s$ a  `2 i呵呵。
  U* F4 h) Z% ^& a+ {/ s: T! D希望谁能结决图像16->24的问题请给我发一份。不胜感激6 b4 ?. R2 ?7 M' `, f; M3 U

4 _( u0 f* X+ D, ]5 vnewsoil@163.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 02:39 , Processed in 0.018339 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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