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

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

[复制链接]
发表于 2005-5-16 14:45:06 | 显示全部楼层 |阅读模式
  茫茫长夜无聊,结果下个了QQT的小游戏。
3 a6 c2 _2 {/ ?6 G% [! M哎太幼稚的一个游戏。
7 H" b0 q1 L( J  g/ e- x9 y7 \不过里面的小人物倒是有意思。于是就把察看了图片资源。2 C  D- J) E5 t9 Y1 G& Z6 G
' G' u: @& ~' _0 V) `+ U$ d
呵呵~~有意思打开PAK保管发现第一个字节PK(ZIP的压缩格式),于是把名称该为.rar用RAR解压缩9 s. h8 G5 {$ a# ^# w$ H& u( z8 u
/ ~4 n  L0 D) H" G" o; x* y
。。。。。。
) \0 y: @; Q5 P成功。( X2 `; @4 b% U* g) r2 @+ B
/ u( R8 p  ?" b+ Y; z

' p% O9 q( h5 u: f结果打开一看全是*.img的文件。没见过~~~~~
8 B# b+ U5 e5 h# P- k  J7 h打开文件看晕 QQF.DIMG 什么文件格式。:( ~~~~~' p5 D/ }, Z' \3 j$ B

/ n/ ]2 h2 k' [于是分析了全部数据有点想16BIT的图像。但是有是24BIT的长度长14个字节。  |3 h( `1 B3 P% f
& N* I) ^. r, H8 X6 `/ m1 l, Z
。。。
- a: y7 m# \, s: k( A
% m+ F* h* U+ t! [7 A1 G哎不说了。给点代码自己去研究。不过有点问题。9 D9 l3 ^+ w$ V& D# M

3 _2 ]- F9 [! m; Q7 A: Z) d我搞不懂直接在贴到屏幕上显示正常。0 l  A; m8 {7 J+ C8 f& O9 ~4 E
1 B1 G2 l5 D7 O* o$ O. C
写成BMP发现意思比较暗。。。
5 ?1 ~; W4 y1 P/ z) Q/ {8 S6 {) c! b" ~
# u1 Z5 x1 q- W* x
typedef struct tagQQBITMAPHEADER{ // bmih # `! z) Z; k6 r6 |
   char   szName[8]; //QQF.DIMG 标志   8
) ~% D& i. ]; O& h, z% ]! BDWORD  bC1;       //65536! }* T. W, E; }
DWORD  bC2;       //24
5 e: f3 K0 R; Y+ N" i* F. MDWORD  bA1;       //6 k' B2 Y) R- J" m' }1 P
DWORD  bA2;       //* c3 D9 H+ I1 Q% U, x
DWORD  bA3;       //. @( K: Y; E4 P3 Q, ~
DWORD  bA4;       //! l2 [% L5 N% k' n6 Q4 q7 @
   LONG   biWidth;   //宽
$ `. j, p4 j) C0 W! K! U    LONG   biHeight;  //高( ?$ {/ C, Q7 a* X9 g' i
   DWORD  biP; # }/ p/ u# u: t
   DWORD  biB;
8 a( a. v/ q7 R% u    DWORD  biC; ( r4 k9 {7 e6 F4 w, X! J
   DWORD  biS;
: p+ ~3 l% `- B; F7 m* G8 U    LONG   biWidth2;  //宽$ G7 o: H) {  Z% @( M# ]. {4 {
   LONG   biHeight2; //高
& f0 _0 f! z; H2 r    DWORD  biClrUsed;
2 R/ D! i; t3 x9 g4 ]2 E3 V    DWORD  biClrImportant; + W! A6 }  r4 C1 U
} QQBITMAPHEADER;
; i8 _* H6 w; d* ^- X& _% d
, H. R8 v# c8 U1 l3 `7 ~
9 x1 p( l! Y# k+ Mvoid CBmpToolDlg::ExpBmpFile(CString strFile)
3 D' z2 [2 Q& b) M9 N0 h{) L2 L* a+ n$ H6 Y
BITMAPFILEHEADER bBmpFile;
& j4 y8 [* k* f# V' A: f+ t4 k# P' OBITMAPINFOHEADER bBmpInfo;
3 A. I4 \: P, G$ c1 Z0 U3 qQQBITMAPHEADER   bQQHead;
: z5 _4 s, n, a: h" a5 t/ f9 IDWORD  dwReadSize = 0;( K) _2 o" l  s
WORD  m_wWidth;
7 V1 [' a& c, V6 [+ {: [WORD  m_wHeight;
" q6 `( N3 B6 ]5 eDWORD  m_dwImageLength;9 d. K$ P& F0 N2 N" F
DWORD  m_dwTemLength;' j3 K0 Q+ e/ U( D0 l
WORD  *m_pwImage;# X* C+ L4 U& d
CFile m_SaveFile;$ h! [: S, l8 o! r  M9 P$ ~
CString str_Text;
7 ^, @4 `* J5 e: J+ ?) Q' s
5 x% a( T" _+ k, \9 @ try4 O+ r, [! I# r
{
8 l& G7 B( Z6 n' r3 J
3 C" y1 Q3 b7 ^/ a7 o. zHANDLE hFile = ::CreateFile(strFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,& S+ q$ j. e" F3 p$ g0 Q
FILE_ATTRIBUTE_NORMAL, NULL);9 L: p% I4 B0 e( ~/ l+ o5 @+ U

  Q  [- E8 R3 w) b* C. L' Bif ( hFile )7 q4 Y! t! V7 n+ S- y& R
{
7 X! n& a0 i, T, bZeroMemory(&bQQHead, sizeof(bQQHead));" I$ W- k! t1 s  v8 n
ReadFile(hFile, &bQQHead, sizeof(bQQHead), &dwReadSize, NULL);
$ k8 c$ Z% r& O: G. B- C; q
& Z3 T# L% _. |) Q8 e" h6 @if(bQQHead.szName [0] != 'Q')return;
+ q) E0 E2 l* T- `" t
5 i( W. H9 h: R! z6 mm_wWidth  = (WORD)bQQHead.biWidth;- z  D5 O5 S' H" G0 G
m_wHeight = (WORD)bQQHead.biHeight;
; ~- T/ a, u$ B, z/ C7 A) Y/ `8 _( G+ Q& Q1 [
m_dwImageLength = m_wWidth*m_wHeight*sizeof(WORD);
  Y6 l3 S7 ^- m7 @" K6 @9 I+ {) p
( L$ ^# r- R6 q6 ]' Z/ r9 V$ m0 }m_pwImage = new WORD[sizeof(WORD) * m_wWidth * m_wHeight];, l  Y4 T, d) k0 F

, f- _+ o  c& G: y& AUINT nSize = m_dwImageLength;
! P& v' ?$ S) V& ]) ]$ o
4 ?9 P8 l) K5 ^. v1 [7 ?$ _: `ReadFile(hFile, m_pwImage, nSize, &dwReadSize, NULL);  [. P3 ]2 X6 O. H' ]' x

. \8 I8 G& m6 T' z: wCloseHandle(hFile);: P8 y, g$ P- ^" ?6 _* t
}# ^: ~' D5 O8 ^1 M* C2 c: P
m_dwTemLength = 3 * m_wWidth * m_wHeight;, ~3 G3 i# x/ ^; W! W9 ~
//重新构件一个BMP头然后在写入到新的文件( h& l+ t6 _" x8 I0 t
, f1 I; H7 U: r( S; S7 a7 K
bBmpFile.bfType = 0x4d42;//'BM'0 u$ e+ v: [; W' }5 G' \0 t/ Z
bBmpFile.bfSize = m_dwTemLength +  sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);9 B% \/ x" Y0 W% f1 _& ^8 o
bBmpFile.bfReserved1 = bBmpFile.bfReserved2 = 0;( K) E6 w. [" Y/ s
bBmpFile.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //
8 p8 E4 a6 z9 Q6 M; s9 O/// T7 ]% v  |% `" j1 ^
bBmpInfo.biSize = sizeof(BITMAPINFOHEADER); //以下是为BITMAPINFOHEADER结构赋值
) q. X+ G2 k; Z, A! b1 C* T0 ^2 e. V* [bBmpInfo.biWidth = m_wWidth;
, z+ |) Q4 z: A2 l" ObBmpInfo.biHeight = m_wHeight;( U9 X$ w# O9 D7 I3 X, |
bBmpInfo.biPlanes = 1;$ [. _1 G$ I+ E. y1 L
bBmpInfo.biBitCount = 24;  m, f# l6 O4 Z
bBmpInfo.biCompression = BI_RGB;4 ?# v, i: Z# W+ S/ N
bBmpInfo.biSizeImage = 0;+ Z3 K; a5 @8 ]/ g" }3 h
bBmpInfo.biXPelsPerMeter = 0;
1 f2 s- ~/ Y( G/ @bBmpInfo.biYPelsPerMeter = 0;
" n6 H/ o0 U* L, jbBmpInfo.biClrUsed = 0;. A! A. ?6 n8 L5 O5 {9 V
bBmpInfo.biClrImportant = 0;
* X% U: `: b' q1 j! E- y0 \6 s9 p
" L) j& h( ]' [7 @- Y  T7 y///////////////////////////////////////////////////////////////////////////* w) I& {9 t; {3 `2 r% u  J
//倒转图像数据, q2 X5 `8 x5 R( v. l
BYTE *pOrgImage;
) X" Z) c# M/ [6 p. x, hpOrgImage = new BYTE[m_dwTemLength];
+ G0 w# B) K% `; [. c& V% Q% o) r, R% l: }6 ?% v
BYTE bsBlueColor, bsGreenColor, bsRedColor;
2 ~4 Z' ~1 r/ q# k4 O. a1 g8 a//656
- X9 ]. _& y8 m$ ]DWORD dwBMask = 31;( l( O2 y, }8 C
DWORD dwGMask = 2016;
' P7 P" M: A% m  {% Y, Q$ [& ^; _DWORD dwRMask = 63448;! I9 w: F6 l5 N
+ ?; G4 X3 g$ b# Y; z/ m
BYTE bBShift = 3;! k0 b0 E. r& s/ h, j+ R
BYTE bGShift = 5;# i3 U* L! I# I2 v
BYTE bRShift = 11;) n1 _0 @: a8 A" E( X- x
/ Z  t: M, q9 D% P
// wPixel = ((byRBit >> 3) << 11) | ((byGBit >> 2) << 5) | (byBBit >> 3);. b: [2 E- L  W7 @
/*, _( S' A6 f! J9 U( u9 p* l& i
WORD dwBMask = 31;, ?# J! ~3 M% b! m3 c0 Y- Z) ?9 |
WORD dwGMask = 2016;
, X1 t9 Q$ R6 _* _# _$ L5 x* V7 l/ yWORD dwRMask = 63448;0 e8 `* T* H# N2 z/ U! w3 @: r  n- B6 W
, r4 f- x5 h/ a
BYTE bBShift = 0;; h' a$ Z1 l) x* _1 B$ \- W
BYTE bGShift = 5;
$ p) S" w4 |/ x$ k1 V% ?BYTE bRShift = 11;3 E* B9 H# Z1 ?5 R) e9 I! i
*/
, L, M- C* g; t$ k  u4 D: ZWORD nXSize = m_wWidth;- I) U1 c( D# ]7 F7 c' l. c
int nByteAlignCX = m_wWidth*3;//(((m_wWidth * 24) + 31) & ~31) >> 3;5 E! ], @5 t- a+ h
) W9 Y6 x" L0 w. r. c& W
str_Text.Format("%s New File 16Size %d 24Size%d",strFile,m_dwImageLength,m_dwTemLength);  G  L8 x7 Y4 q2 M0 M8 h
AfxMessageBox(str_Text);
' t8 k) Q- l. H: R
3 F+ v% R5 X  gfor (int nYIdx = 0; nYIdx < m_wHeight; nYIdx++)
- N3 G1 v) ~7 p/ q8 l; l{$ _2 {5 `3 H, T
for (int nXIdx = 0; nXIdx < m_wWidth; nXIdx++); [/ }- F  B2 O* t
{ 3 E2 A2 p: a: \% N* D$ ~& L" m
//分色处理) p$ d) A& k1 L& E- ^8 f- |, t
bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] ) >> bBShift); 2 {1 S1 j8 J/ H3 `. G8 m
bsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bGShift) << 2 );
) W4 o6 `4 ?) ~2 M3 o% @bsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bRShift) << 3);
; W! p+ a# ~4 [/* bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwBMask) >> bBShift); 8 V6 _  L( Z9 k) n% ^, O
bsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwGMask) >> bGShift);% N0 L* q  A- I' a
bsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwRMask) >> bRShift);4 ^) q; ~1 ?' Z, U
*/" j7 q2 r% _" o$ F
pOrgImage[(nXIdx * 3 + 2) + (nYIdx * nByteAlignCX)]=bsRedColor;1 }0 c# s2 I8 d2 r
pOrgImage[(nXIdx * 3 + 1) + (nYIdx * nByteAlignCX)]=bsGreenColor;
; A* x0 n# {: B- B0 @  PpOrgImage[(nXIdx * 3 + 0) + (nYIdx * nByteAlignCX)]=bsBlueColor;
6 r0 `& k1 i2 g3 A; |  l# D+ G}
! _9 B' X# {0 M% K9 R& e. G}
3 b& K! R/ D* G# {. g3 W5 a, ]& c4 y5 I8 D, \
DeleteFile(strFile+".bmp");( }0 G) M& I9 g% d
    if(!m_SaveFile.Open(strFile+".bmp",Cfile::modeCreate|Cfile::modeWrite|Cfile::typeBinary|Cfile::modeNoTruncate))% Q. D# [, ~; K! A2 t3 K) U
{- c' w' Y/ j8 O: O
AfxMessageBox("建立文件发生错误!");
6 h9 ^5 o( F% h* U) l         return ;- N" N* |# a$ ]8 E2 h0 \! L& p0 c
}8 f* q2 D5 [4 S0 j6 {
m_SaveFile.Write (&bBmpFile,sizeof(bBmpFile));6 n% I! ]! ^% z5 E2 ^# V6 r
m_SaveFile.SeekToEnd();$ {+ X8 W2 t0 j$ S0 W

( f# ^/ R0 m1 S& Q m_SaveFile.Write (&bBmpInfo,sizeof(bBmpInfo));; q6 |. C0 G! W" K  N
m_SaveFile.SeekToEnd();
; `) u' V: b2 }' ]8 q, T6 n. Z
; K8 V4 `" g/ u0 } m_SaveFile.Write (pOrgImage,m_dwTemLength);& V: x& E& {2 V4 \
m_SaveFile.Close();
0 x8 K5 ?7 {' o+ \2 s$ ?2 b- ?& d. ^* M+ \
if ( m_pwImage )
, j7 n' O) ^, N( ?! ~ { / P  w9 @6 B2 m! n1 ~9 u
delete m_pwImage;
8 {1 j# _/ d+ B: W6 S9 d& V m_pwImage = NULL;
& P% v% Z3 W4 m* o9 i0 b }( @# x/ S* E% W
if ( pOrgImage )
7 P4 g& U% t) W/ K8 Q& [* B {
1 S) b9 t$ M. K- o0 R delete pOrgImage;
  M; |* }1 O2 p  i& ` pOrgImage = NULL;
2 w7 b3 i4 X% g3 A3 [1 X# z }
5 b9 O  b* i1 q: E& a' b. P4 Q* \}- j" m5 M( `7 n, M2 O( ~
catch(...)/ z- \# O2 J; G* _
{
. q7 G7 B8 _* v% _/ C$ m: R}
4 [8 ]" @1 U' {7 v}
/ g( f/ l6 w) Z7 \/ r
$ n; t* C/ K% s5 M- F3 w; O' z0 k2 \+ I/ i; W
该代码只能用于研究和学习中。请勿用于非法途径。
( e! F' g# x' P. x) ^1 Q* D2 u( d% j
呵呵。/ U+ y/ F9 }0 Y. t, d
希望谁能结决图像16->24的问题请给我发一份。不胜感激
) |: R" [6 N" C5 g. k) d% j9 J" H+ ]6 K0 F9 J# B: C
newsoil@163.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 06:55 , Processed in 0.017738 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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