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

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

[复制链接]
发表于 2005-5-16 14:45:06 | 显示全部楼层 |阅读模式
  茫茫长夜无聊,结果下个了QQT的小游戏。
9 N9 d& T( @  r- s哎太幼稚的一个游戏。/ f# S, j5 [6 v7 ^# t6 Q
不过里面的小人物倒是有意思。于是就把察看了图片资源。
$ ?8 Q* C, y4 z5 v5 z. D7 X) D" g8 {2 V) R: z5 P6 |
呵呵~~有意思打开PAK保管发现第一个字节PK(ZIP的压缩格式),于是把名称该为.rar用RAR解压缩7 e# q" e0 k! }; w' R

4 ~' G5 C2 H5 m。。。。。。* C9 f( t1 N! m& b3 @* C. M
成功。
" u0 k" r9 K% m; a5 {. ^
! j9 Q$ x# L* d$ N3 a# x% S
- I* S6 ]: a5 i' m结果打开一看全是*.img的文件。没见过~~~~~/ Y+ j9 N) K* m! l
打开文件看晕 QQF.DIMG 什么文件格式。:( ~~~~~
7 ~. a2 C4 {# s$ @- L5 s' p" |" e% _: B. B% b
于是分析了全部数据有点想16BIT的图像。但是有是24BIT的长度长14个字节。% [' S0 ~. P5 b" P! ]- d

# ~+ m% f: C' M0 J. i。。。. \/ M" d7 C: g: N  b! c
  x/ S& T& J9 E" Q( m
哎不说了。给点代码自己去研究。不过有点问题。/ y, h- K; u9 r: f$ n* F

$ o9 Q+ \* E6 _3 v/ b1 X我搞不懂直接在贴到屏幕上显示正常。
% z+ n" a) N# F5 ~: ]6 R# Q. v* \) v/ T! T
写成BMP发现意思比较暗。。。2 a. ]( K: O9 g: m* E

( H) t) i7 c9 R. z7 V" c0 _- \( F% i* w) r4 T1 |
typedef struct tagQQBITMAPHEADER{ // bmih & Q: }/ _7 L8 }( W/ o6 L5 G2 d# j1 y
   char   szName[8]; //QQF.DIMG 标志   8
, @& V$ V4 h* A" O' \: WDWORD  bC1;       //65536" K+ o8 h5 v/ e3 w" p  r
DWORD  bC2;       //24; J9 @% O& i0 _6 c$ S$ d
DWORD  bA1;       //: h% e: e: O) q3 o9 X' i; L8 n" L
DWORD  bA2;       //
/ D  \1 J: @: J$ CDWORD  bA3;       //5 H( i' m9 d* Q6 p
DWORD  bA4;       //
% M! r. q7 ^' d% t& o* Q    LONG   biWidth;   //宽
7 |7 l$ n; n1 A+ b    LONG   biHeight;  //高
; U" Y1 u1 I$ x    DWORD  biP;   O2 I7 a6 {6 r% d
   DWORD  biB;
9 s$ l% u( ]' Q# n# W    DWORD  biC; 1 L* C, U6 k  r5 b4 r9 x. r
   DWORD  biS;
! C" A$ R  J, [* M% o" b: x# M" I    LONG   biWidth2;  //宽
; P6 X3 B% r- l$ ^9 x    LONG   biHeight2; //高3 k7 J9 o* Y0 W& m, f! t
   DWORD  biClrUsed; ) I# A+ V9 V8 c. n7 y
   DWORD  biClrImportant; $ \  V6 H4 {& E; k' f  l
} QQBITMAPHEADER; - q/ c  I1 |) u. W# m3 g. d
0 e' d3 U1 H4 k: O/ ]2 c
+ ], j! _0 C1 i
void CBmpToolDlg::ExpBmpFile(CString strFile)
( c$ I* D* r4 z: W{
( P. s/ ?( S2 ?BITMAPFILEHEADER bBmpFile;
( N2 _7 ^; f1 E2 {3 f' m/ T& L; qBITMAPINFOHEADER bBmpInfo;
+ h1 [9 K7 O  t: i8 bQQBITMAPHEADER   bQQHead;
7 a; K9 R. r0 ?' }+ oDWORD  dwReadSize = 0;
, l0 d1 c9 Z) v# GWORD  m_wWidth;
: W( U+ }3 s$ l3 Q* dWORD  m_wHeight;
4 d- u6 `2 a, H/ w. Z1 O! ]DWORD  m_dwImageLength;
0 b$ Q' H1 J# ~7 {' }DWORD  m_dwTemLength;% A9 t! z. D( {6 Q
WORD  *m_pwImage;
9 u" K) t" U. N. J! n9 rCFile m_SaveFile;
1 R& w5 m& B- U  s# GCString str_Text;
9 i3 m3 D  M, T, @, Z& l
) x- i( j# P" |7 l! a. Q. ]$ C try
9 X$ o% g6 l6 S' ?; t1 }4 u {
* M3 a& [5 n! c8 ]* C1 ?: }& m) v* I* L
HANDLE hFile = ::CreateFile(strFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,% D5 f  k" l9 e* _% q9 c* _& c
FILE_ATTRIBUTE_NORMAL, NULL);
# U& Y; K5 x9 w4 A% _; Y8 X
/ ?# n5 Z0 ?6 n* t1 Dif ( hFile )+ T9 m: Y) v5 ~% S& i: b( Q/ K  B% R
{
6 ]8 ?+ b8 O  G: B% k8 u* }, K  e. {ZeroMemory(&bQQHead, sizeof(bQQHead));
7 M" ^0 K' N9 J$ fReadFile(hFile, &bQQHead, sizeof(bQQHead), &dwReadSize, NULL);2 d( n1 U0 h$ P: j* H0 f

2 t3 [4 f9 p3 N7 b- C/ L2 iif(bQQHead.szName [0] != 'Q')return;
# U9 p5 f! [7 k4 I, X: i$ M
/ j/ G8 O$ Y3 z! {m_wWidth  = (WORD)bQQHead.biWidth;
8 }8 Z* A$ y/ r4 vm_wHeight = (WORD)bQQHead.biHeight;* Q) B8 b0 Z- Z2 F
0 G4 l" R  `# |" P, Q
m_dwImageLength = m_wWidth*m_wHeight*sizeof(WORD);: X( j5 w2 ~% g3 E

. N- i% A; B6 }9 E2 gm_pwImage = new WORD[sizeof(WORD) * m_wWidth * m_wHeight];, k+ O  x1 G2 `+ i/ m2 k

# }1 M* v3 l$ Y1 o; O  c+ k' \8 YUINT nSize = m_dwImageLength;
! u1 R7 N# ?( Y% K/ R  \) c. Z2 x: M3 K; W, @" ]
ReadFile(hFile, m_pwImage, nSize, &dwReadSize, NULL);
  V- T  `( {5 v( T/ m- q; Z. [8 ]# \( E7 O( x" J5 I$ |* g
CloseHandle(hFile);' o8 x1 f+ e& E* @" B
}2 v; F" k3 {: f. l
m_dwTemLength = 3 * m_wWidth * m_wHeight;" h2 |* e! [0 W: _
//重新构件一个BMP头然后在写入到新的文件) v0 e/ g/ y$ [, S% n) ~
* y) i  P$ y7 V
bBmpFile.bfType = 0x4d42;//'BM') Y2 U6 }5 C. s+ r( b0 f5 m
bBmpFile.bfSize = m_dwTemLength +  sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);$ C, u9 G! _; ^) v0 k
bBmpFile.bfReserved1 = bBmpFile.bfReserved2 = 0;! l4 u! Z- R) {# D
bBmpFile.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //
1 d: a6 I  M' S6 x: p0 k7 z; a; K//
0 L% B2 U9 H- `- c: dbBmpInfo.biSize = sizeof(BITMAPINFOHEADER); //以下是为BITMAPINFOHEADER结构赋值" g: E' y' p6 L- n/ Z- B  G( J
bBmpInfo.biWidth = m_wWidth;
# j7 ^9 K, x3 v) |bBmpInfo.biHeight = m_wHeight;
. z% @- o4 X, `7 Q# kbBmpInfo.biPlanes = 1;
" s2 S0 i' Z7 l; Z& D* VbBmpInfo.biBitCount = 24;
" U: m! J2 a' n( p& bbBmpInfo.biCompression = BI_RGB;
6 d, {; I/ v  A& C/ H+ qbBmpInfo.biSizeImage = 0;
$ i2 u* z9 R$ [* ]4 m. M% G" qbBmpInfo.biXPelsPerMeter = 0;; m) e. e9 n, Y" c- o/ o1 r% H2 N
bBmpInfo.biYPelsPerMeter = 0;) K0 F0 |/ F/ i* H* j! W6 }( }7 N
bBmpInfo.biClrUsed = 0;
0 ]2 c  z# w! ibBmpInfo.biClrImportant = 0;
- [, K. o, V( v6 m: r. ?8 h
$ H1 z  |2 x+ N///////////////////////////////////////////////////////////////////////////
$ R1 C; X2 G8 ?, v' r. Y//倒转图像数据
3 a+ p3 C) o, S5 xBYTE *pOrgImage;
2 D  K: J, z' M$ {  B* g0 ^pOrgImage = new BYTE[m_dwTemLength];
! w0 Z$ b, Z" x
, E3 Z1 L* w+ HBYTE bsBlueColor, bsGreenColor, bsRedColor;
, s1 A% Q' m8 O' Z; Q- _) X3 T6 i//656
8 A$ i* B! z9 R+ {: J( ODWORD dwBMask = 31;! e. r9 H2 f7 ?) Q  o$ C
DWORD dwGMask = 2016;
0 `% Q( q: \% ]- eDWORD dwRMask = 63448;- E  N) V8 s, n9 V- M& C
# ~. ^- k8 F, U% d
BYTE bBShift = 3;
: i) I9 W' N  ~+ [; YBYTE bGShift = 5;- F$ j6 `4 c# o$ z. \
BYTE bRShift = 11;# w! I- K  L# E/ Q) }
, a, Y3 f2 o2 ~4 r. e& I
// wPixel = ((byRBit >> 3) << 11) | ((byGBit >> 2) << 5) | (byBBit >> 3);
) Z% I. V7 ?4 [& H- {( O/*
3 Y; `& `5 ~9 M5 TWORD dwBMask = 31;
! a; C, c- O3 U& Y/ T# c. oWORD dwGMask = 2016;# ^+ O8 Z% q7 t( t
WORD dwRMask = 63448;
- |3 z. I0 E9 Y* q
+ r( N# W, {. cBYTE bBShift = 0;* N/ [" }0 x3 X: Y% M1 N8 G
BYTE bGShift = 5;9 a& n4 a+ }; W/ {
BYTE bRShift = 11;
) F, s$ m' @9 D) C! j) n*/( J0 s7 c7 `8 A$ A4 }7 x# u
WORD nXSize = m_wWidth;2 m. W$ P! M# I# }' _% e
int nByteAlignCX = m_wWidth*3;//(((m_wWidth * 24) + 31) & ~31) >> 3;
) I1 W( |9 r7 O2 p* j
* H/ s8 O- i. c  C9 Mstr_Text.Format("%s New File 16Size %d 24Size%d",strFile,m_dwImageLength,m_dwTemLength);
. L! Z! J+ `" Z4 AAfxMessageBox(str_Text);
7 r9 v9 Q- \. C' h1 i
9 d0 n0 `/ B5 I+ @" i7 rfor (int nYIdx = 0; nYIdx < m_wHeight; nYIdx++)
' f, C  c2 g& z; W2 E9 e1 R1 n{" B% G, O3 ?! L. N  F  U) D
for (int nXIdx = 0; nXIdx < m_wWidth; nXIdx++)
& X1 e% G+ ]: w) L7 a+ d. Z" r{ ! O% `' a1 `6 n+ |
//分色处理2 x- h, u$ L8 n$ ?" k5 r+ I
bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] ) >> bBShift);
$ S7 i7 h. N$ VbsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bGShift) << 2 );' B  m: _. P) y
bsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bRShift) << 3);
6 q+ C5 e" }# y' J! O' u+ |$ \/* bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwBMask) >> bBShift); 0 U1 C& a: @0 v& J2 t
bsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwGMask) >> bGShift);
" l; ~/ j& O+ D) P3 MbsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwRMask) >> bRShift);
5 ?) C" q' z: u* L/ z, K*/
. R. z( O  Q% j. @pOrgImage[(nXIdx * 3 + 2) + (nYIdx * nByteAlignCX)]=bsRedColor;
& i4 Q" X/ ~2 @2 J! \. B# K$ a$ {; TpOrgImage[(nXIdx * 3 + 1) + (nYIdx * nByteAlignCX)]=bsGreenColor;; A0 T7 O( F& d# r
pOrgImage[(nXIdx * 3 + 0) + (nYIdx * nByteAlignCX)]=bsBlueColor;) u. L# H" n% }  p2 g, x
}
1 I% r5 D5 Z% t2 U6 F& N4 Q; e1 }1 T0 y}
$ s# F& t( o; O1 ~8 }' R* ?5 f
' S$ a( S) l" d8 Y7 t$ @ DeleteFile(strFile+".bmp");
) a5 \0 V8 e! a8 v8 _! p4 F+ \1 b     if(!m_SaveFile.Open(strFile+".bmp",Cfile::modeCreate|Cfile::modeWrite|Cfile::typeBinary|Cfile::modeNoTruncate))
# E7 L& q1 w8 F) D: |1 s; f+ z {
2 b; U. |: Y$ u  [# ^' N AfxMessageBox("建立文件发生错误!");
1 j+ G2 b9 J/ i         return ;% k0 `% r  y% I& D9 `, Q
}% f  ?$ u0 M0 |; W, j# d
m_SaveFile.Write (&bBmpFile,sizeof(bBmpFile));
" y5 M: D7 l6 z4 A. ^8 g* v m_SaveFile.SeekToEnd();
" H( B2 D- R  f5 P; g8 w# A/ f- h1 F: D( K7 O# O" d
m_SaveFile.Write (&bBmpInfo,sizeof(bBmpInfo));  F3 n+ Q9 T. j; k& b' W' s
m_SaveFile.SeekToEnd();
; E2 a' \) j( h7 L
( D* G- a* g' H. j m_SaveFile.Write (pOrgImage,m_dwTemLength);
  X* v' H) l4 Z. L/ t* n m_SaveFile.Close();- Q& Q% N+ U+ _- I

" f% B) Y4 `0 O4 o0 n9 ]9 N7 z if ( m_pwImage )) u5 j+ {0 Y- M" l  k6 P( h
{ $ a/ p4 Q2 S0 d1 G- L( s; r4 A* Q
delete m_pwImage;& i9 f6 g/ H; ^5 B
m_pwImage = NULL;
9 |3 J3 ^% O0 G! ]5 ^1 j' y' w }/ o8 W! m9 X" w' C7 u1 c" `
if ( pOrgImage )
6 R. w" }/ E( c7 _; F& ^/ R$ D0 @8 j { : Z2 w9 ?" ]0 {& x5 k6 n( q4 i
delete pOrgImage;
' N4 z2 N/ ]/ }$ v" ~3 n3 l pOrgImage = NULL;
+ D+ x0 y, `: c7 V) m }' i, i" @1 }) z7 g) Y2 R8 R  `
}
# Q5 n* @- ]4 f; o8 @catch(...): r+ x5 T" N& ?- l- Y
{
  B3 @* Q# \; y}  I2 a2 S  ?2 @1 h- H
}. z% @4 X' X$ p3 Z6 O( ~0 M4 z6 Z

0 x% p2 T2 K+ b/ U) }+ r2 t, v. j! f0 N; h( T- w
该代码只能用于研究和学习中。请勿用于非法途径。
/ \( e6 f6 X+ P& ]% h! K0 G& ^
. p3 o. w* S( a$ t/ B) Z0 e呵呵。
! v8 H+ q+ C2 E) w希望谁能结决图像16->24的问题请给我发一份。不胜感激
3 i* S( D- a+ V1 N1 F( L) p' e( k9 }* P" ?  v6 R
newsoil@163.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-13 11:52 , Processed in 0.018646 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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