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

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

[复制链接]
发表于 2005-5-16 14:45:06 | 显示全部楼层 |阅读模式
  茫茫长夜无聊,结果下个了QQT的小游戏。: s; T! F1 D( |2 [" }, [5 s
哎太幼稚的一个游戏。) a* b' s9 ?1 O. Y9 ~
不过里面的小人物倒是有意思。于是就把察看了图片资源。
7 [& M# ~# L' \0 U3 `
+ O& Z2 _* p7 y2 Y6 f* |呵呵~~有意思打开PAK保管发现第一个字节PK(ZIP的压缩格式),于是把名称该为.rar用RAR解压缩
' F% ^, q) C$ F) o, f" b" j5 q6 h' i  K9 l
。。。。。。
) l+ H+ a7 H9 J$ F! d成功。" Y; B3 D3 n0 C" |
* j; [# D; s. x3 Q) |; S( c9 V; D

( ]: t" _/ {5 \8 A- K结果打开一看全是*.img的文件。没见过~~~~~9 C: e7 t2 d3 m  n% M! I
打开文件看晕 QQF.DIMG 什么文件格式。:( ~~~~~7 w! |# X6 ~; Z# E  }5 |( q0 y5 p
; B2 g* m, i/ r' Q
于是分析了全部数据有点想16BIT的图像。但是有是24BIT的长度长14个字节。& J6 H" N9 W  n' M' M5 f

5 ?* R! k( u. x。。。
6 s: Y0 z( I* `" {
9 d" C& E3 j8 L( A& W! j+ W哎不说了。给点代码自己去研究。不过有点问题。
- V3 P1 U+ ]* A( W- L
( ?, k/ `6 Z; Q$ U0 H% u! J我搞不懂直接在贴到屏幕上显示正常。4 }9 n$ z$ S8 t! S
5 f- K+ ?: I$ I) R
写成BMP发现意思比较暗。。。% C: G5 h6 ^' b. I+ H- `- C

% [( P( L) _+ l8 x7 M! O0 a9 q, l% F7 i4 s* n4 g
typedef struct tagQQBITMAPHEADER{ // bmih
# q5 K7 e, @2 \) k2 \8 F8 Q    char   szName[8]; //QQF.DIMG 标志   8
, e( F) _2 j! L& rDWORD  bC1;       //65536
) E8 R/ w8 z, ?- Y) W2 p6 [6 gDWORD  bC2;       //24+ c2 y$ V- `, K2 ]* V  g& b- Z! L
DWORD  bA1;       //  g) ]4 e& {' G( `  E9 o: B  L
DWORD  bA2;       //
9 `" W0 {! ]' x8 s: ^2 y- _3 eDWORD  bA3;       //; O8 J9 s$ H4 {+ ~7 {& V; l
DWORD  bA4;       /// l2 y1 V5 D9 c4 v  M/ V
   LONG   biWidth;   //宽. E4 w$ |5 X# l  h
   LONG   biHeight;  //高
+ _% J  Q- O: W% G. v( d. n    DWORD  biP; $ A: i- I5 @. ?3 h5 b3 b+ R5 t. X
   DWORD  biB; 6 ]: |9 t5 X" W3 v7 H- y
   DWORD  biC;
, s: l( \3 I! F; _2 e: y, p# {    DWORD  biS;
+ w( ^$ w# B: b8 Z. N    LONG   biWidth2;  //宽
$ V/ P5 `- k6 ]" A; U    LONG   biHeight2; //高" w3 c6 j* V# ~3 P
   DWORD  biClrUsed;
6 P  m; h; F  J3 o; h( s    DWORD  biClrImportant;
& X" Q' u" _2 B. ]3 @} QQBITMAPHEADER;
: j' v% |2 S+ Y% l1 |( a
. I( P4 I/ |  N! b$ L! i; Q! {4 C7 ^5 A( s; [
void CBmpToolDlg::ExpBmpFile(CString strFile)
3 H" c+ ]( d4 G! p{
. G, p. v0 h. z  c% n: g# pBITMAPFILEHEADER bBmpFile;
, b$ g4 B+ S  FBITMAPINFOHEADER bBmpInfo;7 G, t! o7 @- [- ^
QQBITMAPHEADER   bQQHead;
# `" p8 h0 M- h5 j0 VDWORD  dwReadSize = 0;8 _$ ^/ L) q2 m  D% d
WORD  m_wWidth;, I1 B5 a9 ^8 N9 K
WORD  m_wHeight;
8 x; S6 g/ D8 ~! \* |DWORD  m_dwImageLength;. z- d7 R, Y% ]- ]4 g
DWORD  m_dwTemLength;
! d1 w" I$ d7 m8 N! m; zWORD  *m_pwImage;" }' k" j  v" t' Y  @
CFile m_SaveFile;
. i" ]7 m' g4 t1 ?2 d+ ICString str_Text;
$ \& h- g# ]5 a$ \9 z4 K, K% W$ k* V0 r9 k
try
5 c. i* Z: w( w/ }4 ]- R0 G* S {3 z! A+ M3 C4 N: W/ Y# V' y- @* {
9 Y" f+ \; F: C9 q; `
HANDLE hFile = ::CreateFile(strFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,1 _+ j& ]$ m7 b6 {" M8 M& j- x, j
FILE_ATTRIBUTE_NORMAL, NULL);1 _* y9 I8 i2 w. ]! m! A
2 A7 S% z% [% b
if ( hFile )1 t& D! m" F5 I( v
{
9 P- |0 \: M8 F( k9 }( _0 r/ I7 EZeroMemory(&bQQHead, sizeof(bQQHead));
3 l3 b: h# [$ _# WReadFile(hFile, &bQQHead, sizeof(bQQHead), &dwReadSize, NULL);
' G) P  Q3 N' W/ Q* [$ G: e6 n/ J. o3 J" v3 B9 B* ^
if(bQQHead.szName [0] != 'Q')return;
6 g6 W, P" |0 z/ J" X1 k* J. K$ b, L7 O+ U8 k$ _( \7 {& I
m_wWidth  = (WORD)bQQHead.biWidth;
, x/ r) }# R9 G! ^2 K7 S/ Om_wHeight = (WORD)bQQHead.biHeight;0 y, {% c9 D1 U0 J0 O

) \% Z2 B4 R3 ~" h/ J$ H6 q& f1 fm_dwImageLength = m_wWidth*m_wHeight*sizeof(WORD);5 Y+ x1 X6 F+ y8 z% G5 ^9 G! j) }

7 ]% R0 x) A, \m_pwImage = new WORD[sizeof(WORD) * m_wWidth * m_wHeight];: A2 q' W% R% w% V7 O& I

$ f' o4 C! N) d" V5 V+ C: hUINT nSize = m_dwImageLength;: g1 c2 \: u  _0 h0 n

$ d) \' j& f* Z6 nReadFile(hFile, m_pwImage, nSize, &dwReadSize, NULL);" J1 x, J  x& A

% f) u: F- ?4 PCloseHandle(hFile);
% m5 \# _3 _. o}4 \8 g: x+ G  V6 w$ t- `
m_dwTemLength = 3 * m_wWidth * m_wHeight;
, t5 ~  u9 j* z, ~//重新构件一个BMP头然后在写入到新的文件' e* y8 {' u7 D2 y

; f( I& j& v1 }bBmpFile.bfType = 0x4d42;//'BM'
0 J7 T0 T- g3 U! ^1 BbBmpFile.bfSize = m_dwTemLength +  sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
/ l0 H. H6 s3 A" _# I6 NbBmpFile.bfReserved1 = bBmpFile.bfReserved2 = 0;
2 f: W, s2 N% \3 @$ d# [/ ObBmpFile.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //
) h" [3 |7 c5 @//1 P6 v0 q: L5 V
bBmpInfo.biSize = sizeof(BITMAPINFOHEADER); //以下是为BITMAPINFOHEADER结构赋值
9 W+ G7 t- S, V1 a$ @% cbBmpInfo.biWidth = m_wWidth;
7 o0 w" N# `' v0 w! ?! N; [7 ]bBmpInfo.biHeight = m_wHeight;7 P: ^1 u2 t( o
bBmpInfo.biPlanes = 1;
9 M. g( m7 N9 M; T/ xbBmpInfo.biBitCount = 24;5 X* m4 b/ Y5 f$ N' E! T* C& q
bBmpInfo.biCompression = BI_RGB;0 F3 I0 d' I2 q6 U9 X
bBmpInfo.biSizeImage = 0;
" i- P) V! f( c* nbBmpInfo.biXPelsPerMeter = 0;. r2 O; L) S& b& o' g( o
bBmpInfo.biYPelsPerMeter = 0;) [  R* B& z6 h+ u
bBmpInfo.biClrUsed = 0;
' u! v. R2 _1 i% s1 xbBmpInfo.biClrImportant = 0;) O% y2 s! S$ f9 X& b
9 \8 N3 V) \4 o" U* P9 u# D# ^7 o
///////////////////////////////////////////////////////////////////////////! R' l, r1 A$ [& F6 W* {
//倒转图像数据& x2 `6 I$ X% }$ _& |
BYTE *pOrgImage;+ N$ E" C( }' ^; p: G: y( ^; ~
pOrgImage = new BYTE[m_dwTemLength];2 @9 v. j0 n" D9 ?! \5 ~- z' p

1 O) s9 M9 o7 n+ lBYTE bsBlueColor, bsGreenColor, bsRedColor;9 G2 y8 {: c/ Y
//656
( d5 g9 m5 D0 G* F/ m+ wDWORD dwBMask = 31;9 G2 f' @# t) Q) v. h" y6 G
DWORD dwGMask = 2016;
9 L( z) F0 M8 vDWORD dwRMask = 63448;: C$ H( H$ Y$ C; }" L
  a3 a3 j* l6 ~* N; x1 X
BYTE bBShift = 3;4 ~  |6 R2 w0 W( m5 t
BYTE bGShift = 5;2 R# B5 p; C+ }+ O% H+ C8 {( q
BYTE bRShift = 11;3 s7 J7 _/ d! s$ C+ F: I5 G: Q: u2 Y
- z0 R3 @3 V- U5 `2 n  D! W  }
// wPixel = ((byRBit >> 3) << 11) | ((byGBit >> 2) << 5) | (byBBit >> 3);0 ^$ v2 A- ~% D& x4 V
/*
" y- B& }1 V0 Z! _' JWORD dwBMask = 31;' h9 l9 ~% }% Z2 N5 H6 ]' m
WORD dwGMask = 2016;
. `+ ?: S- N, V, x) D! S; y" qWORD dwRMask = 63448;$ Y  h0 h  Y# M, K1 m  }
/ B( h, v3 R$ ]( ?6 A; }4 z
BYTE bBShift = 0;. k% P1 A1 E0 K
BYTE bGShift = 5;. `5 I( R% R9 E& K8 A; u
BYTE bRShift = 11;
' X5 n) b; h7 C- A0 Y! L9 z% X6 o: A+ l*/
2 `* A: m/ _9 m% N! a# j7 E1 [  TWORD nXSize = m_wWidth;
' a6 F. Z4 g4 a7 a5 \: A4 Q7 |int nByteAlignCX = m_wWidth*3;//(((m_wWidth * 24) + 31) & ~31) >> 3;% A' i! V  ?8 ?8 b0 y* h- r
2 w$ t4 W$ \3 s0 `
str_Text.Format("%s New File 16Size %d 24Size%d",strFile,m_dwImageLength,m_dwTemLength);4 j/ I% m) Y* ^$ i
AfxMessageBox(str_Text);7 @1 k: Y1 u8 K$ Q3 {: \& U5 o
5 y- v! p# @' h  H2 o
for (int nYIdx = 0; nYIdx < m_wHeight; nYIdx++)
! F$ b8 g. S+ M4 s+ {) b0 L{
; n' y) s) E! ~+ S: B; [for (int nXIdx = 0; nXIdx < m_wWidth; nXIdx++)
  N* J) P  r. Z; R1 O- z6 ~9 k5 l{
5 `: k# c5 h4 q0 Z3 D3 v2 ]//分色处理
0 v; X4 E' |! E9 V# |* Y& ibsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] ) >> bBShift); ) l. Y# p/ t% X# w& @+ T( v
bsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bGShift) << 2 );
# M& H. P" V: ~bsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bRShift) << 3);
: L, {7 P5 A: Y4 N/* bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwBMask) >> bBShift); 5 k) |0 u/ v) }+ E. P
bsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwGMask) >> bGShift);
0 {5 E0 K1 |: cbsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwRMask) >> bRShift);
+ _' t3 {8 h# o' G0 K' i*/( q' V5 q1 J) W8 Q: t
pOrgImage[(nXIdx * 3 + 2) + (nYIdx * nByteAlignCX)]=bsRedColor;$ N& m4 F; u! b# c9 I0 _) F5 ^
pOrgImage[(nXIdx * 3 + 1) + (nYIdx * nByteAlignCX)]=bsGreenColor;
0 A# C7 f( k/ L" {& {7 |pOrgImage[(nXIdx * 3 + 0) + (nYIdx * nByteAlignCX)]=bsBlueColor;/ [/ o; `5 g1 ^) F1 b# _
}
6 v- X+ U, ?0 w" S* c5 P) B% S' k}
5 C8 N5 h! X) O7 ^
" p  I3 m4 b# {+ Y: \* O( ^ DeleteFile(strFile+".bmp");, S" Y  P) r4 L& U
    if(!m_SaveFile.Open(strFile+".bmp",Cfile::modeCreate|Cfile::modeWrite|Cfile::typeBinary|Cfile::modeNoTruncate)): ~7 E$ o5 `. V- V" g. }' M
{; r& B- R' V  `
AfxMessageBox("建立文件发生错误!");
; a+ q3 l/ T; @) r         return ;
: q6 p8 g* F& n4 { }1 F" F, f( G8 F
m_SaveFile.Write (&bBmpFile,sizeof(bBmpFile));
+ n8 E% s7 ?8 ?( z8 `  i m_SaveFile.SeekToEnd();
  Z! x8 G  i1 X! q3 Z6 r3 j3 \* x7 U
* L: z3 p; V" c" p) j( j$ q& ~ m_SaveFile.Write (&bBmpInfo,sizeof(bBmpInfo));
6 f8 U* R& @8 \6 ^: y' f0 a m_SaveFile.SeekToEnd();
  o6 ?& Z# Q4 D- Q$ x
8 c5 t  B- l: E# y8 X m_SaveFile.Write (pOrgImage,m_dwTemLength);
: `: e- z' k4 B; u m_SaveFile.Close();
3 s. X$ U/ ?- d- Y4 L( y" n3 ^
$ ~) J" ]: r& p: T6 |2 Z* _  u if ( m_pwImage )" m8 A" x; ^0 x( W3 [
{ " ?- k$ Y. T) g& R( S4 f( j" |
delete m_pwImage;
' h) I% Q! K/ k3 f3 f) A m_pwImage = NULL; / @& d& K: O9 ]
}
  C2 j$ G$ I/ d" E& a& j8 C1 k if ( pOrgImage )
" B7 J) A) x' J {
* e( n% A$ h0 n) Y4 M5 ~( f delete pOrgImage;2 l; r6 S9 x7 }, A5 j" ?
pOrgImage = NULL;
  E; G9 S  W; b( q2 }  \# n+ G/ A  H' E# r }/ P/ O& J& V5 i# \3 A
}0 P9 b- T# s* d2 i" s3 S: B9 z
catch(...)
* Q: k( r9 P4 T7 ~" G- I{
- F- [# a0 c' O& u0 S1 Z6 o}: d5 e0 D/ p. S; o% S* T
}
. K0 O; ]+ N: N8 M3 ]& g% c" j
. N, j5 G' q+ E& B& t* p1 r/ u/ S/ D9 u
该代码只能用于研究和学习中。请勿用于非法途径。
- v9 B3 I3 z( J( f+ X; j' z7 F8 q  X5 a9 O4 [( o5 w9 P
呵呵。( y2 g4 f+ z3 s+ R6 h7 C' @' z
希望谁能结决图像16->24的问题请给我发一份。不胜感激
! I& R- t) ~7 y$ t
3 |& U7 n* ~3 x3 @$ G, F6 g" onewsoil@163.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-15 01:38 , Processed in 0.018009 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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