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

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

[复制链接]
发表于 2005-5-16 14:45:06 | 显示全部楼层 |阅读模式
  茫茫长夜无聊,结果下个了QQT的小游戏。
- x! j* k7 _! z8 j4 v哎太幼稚的一个游戏。$ X4 b" ]: Z! h5 A! T
不过里面的小人物倒是有意思。于是就把察看了图片资源。7 D. L7 r3 a& j
: ~1 t; T- g) O6 d/ e; {
呵呵~~有意思打开PAK保管发现第一个字节PK(ZIP的压缩格式),于是把名称该为.rar用RAR解压缩
+ Y2 B0 I  V0 Q# n3 ]; y1 c: W( T; d6 y& Y; w' n$ r5 z
。。。。。。% j9 X* ^3 F" H, h) }
成功。
% p( B! w! W, e9 p) V. M1 P) l/ ~' r* x' j! ^5 r/ c
4 U" i* g( Q1 P9 |; M
结果打开一看全是*.img的文件。没见过~~~~~
) A( l( A. C. Q打开文件看晕 QQF.DIMG 什么文件格式。:( ~~~~~
, g, f5 ?8 O2 T* _: h5 O! g4 P
! U7 c' Y0 ]" N* |6 i, n于是分析了全部数据有点想16BIT的图像。但是有是24BIT的长度长14个字节。! ~* d7 J% _6 e
: J& m7 W4 C" S
。。。# `  F) b4 X2 T
- p- T+ \, G, L/ q; C
哎不说了。给点代码自己去研究。不过有点问题。% s. A, R$ i+ F5 d

' [/ B' I% b' X/ h+ j# z我搞不懂直接在贴到屏幕上显示正常。
5 v4 u5 `" {* H1 a
) A# c5 L/ A/ u1 \: X! F' T写成BMP发现意思比较暗。。。" Z& y+ d! F6 w4 R/ p! U
2 Y  p# x7 k/ V% T. y+ q

; T/ @$ ?$ w0 }+ G! Btypedef struct tagQQBITMAPHEADER{ // bmih
  P3 q0 ?9 v4 ~5 I; F    char   szName[8]; //QQF.DIMG 标志   83 \" q: }3 \8 t/ Y1 A
DWORD  bC1;       //65536
( E6 s2 x% l  H  cDWORD  bC2;       //24& `2 P* d$ ~' d
DWORD  bA1;       //) u3 s- O7 E5 Y. G$ a
DWORD  bA2;       //, b6 h0 p' Y% m
DWORD  bA3;       //
' A) I( P/ _& S' X( ^) o4 VDWORD  bA4;       //) s0 Y' O8 T( [' y  \
   LONG   biWidth;   //宽
( n9 c2 F, [# R5 c% {    LONG   biHeight;  //高  `$ x* L7 O2 e) a0 Q
   DWORD  biP;
, ~) B& M- ^, _2 d, l$ L! G5 X    DWORD  biB;
) }/ p- ~# ]$ [# X$ Z    DWORD  biC; * u$ k$ Z" [3 `$ K1 G  d
   DWORD  biS;
( T7 f0 @5 E$ y    LONG   biWidth2;  //宽
+ B/ A9 v: P0 H3 C/ Z    LONG   biHeight2; //高9 n+ q+ ~6 Q* T" P1 t; z
   DWORD  biClrUsed;
* ]" L# e. K& \3 t8 Y! t    DWORD  biClrImportant; 5 A, y' D9 p+ F6 b; h( I: x6 L
} QQBITMAPHEADER; " C( H# u: f. `$ s- ], J
5 ]2 K" t/ T+ U4 |7 N

1 R% u0 G( g( m" B# I) I1 z, jvoid CBmpToolDlg::ExpBmpFile(CString strFile)
* [& D' X' H. }* R# y{! t# S$ \5 O: i! l: L
BITMAPFILEHEADER bBmpFile;2 l6 D2 b* ?0 Q: Y6 {
BITMAPINFOHEADER bBmpInfo;
9 ?4 H2 t- G4 J7 I0 ZQQBITMAPHEADER   bQQHead;+ a! K+ b4 w- k8 S
DWORD  dwReadSize = 0;( K& S# Z+ S9 X0 a0 ]
WORD  m_wWidth;) n$ P3 T& A: p; |! N( {
WORD  m_wHeight;
$ V0 z5 U' ?" i. R* uDWORD  m_dwImageLength;
- B1 r3 b1 v: ?7 eDWORD  m_dwTemLength;
( P2 B& W( T* a7 R% Y' k' |WORD  *m_pwImage;3 P; `# K- T" @. f- U& |. n
CFile m_SaveFile;
, }+ t: Z) ^, e1 |! j" ECString str_Text;
3 T5 C. G* ~& g& j: ?" u/ F4 H- l0 X1 I' C% J0 i
try
7 n1 q3 s8 |: [, |" a7 x {" r% Z0 ^9 ~5 O  y: |  C* v- P2 {

9 r# r) D8 u* d% h. {+ LHANDLE hFile = ::CreateFile(strFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,; k, f* C# T" N1 B/ V
FILE_ATTRIBUTE_NORMAL, NULL);
3 e& g6 G# N( _& J+ E# s: H4 B' V* w3 _# |+ c' O
if ( hFile )! t; E* {2 ]! [" [' [4 C! c, j
{& ]9 N" ~- L  C) K' i
ZeroMemory(&bQQHead, sizeof(bQQHead));9 _( ~3 I0 W# p! f/ v  A
ReadFile(hFile, &bQQHead, sizeof(bQQHead), &dwReadSize, NULL);9 R" T1 X4 {: U. ?

- ^) `+ C- p: X$ y1 f* R1 Xif(bQQHead.szName [0] != 'Q')return;
6 m7 |+ i9 I' r( I* ~! }
! J3 z# g4 W+ j- R2 _. ?! {m_wWidth  = (WORD)bQQHead.biWidth;
; b' H$ _1 U+ R8 f. I7 ym_wHeight = (WORD)bQQHead.biHeight;3 l  ]  s5 o8 C0 X$ Z' H; i
; j2 g) t4 Y: R  q4 l
m_dwImageLength = m_wWidth*m_wHeight*sizeof(WORD);: y1 C( K' y! a# c1 M
' M4 o4 {, F  j3 v0 i) G
m_pwImage = new WORD[sizeof(WORD) * m_wWidth * m_wHeight];
5 v0 h1 P* T( x) b
$ d: j; k" T. k- E9 N1 Y* qUINT nSize = m_dwImageLength;
8 b) y4 E0 X- g+ `; M. ^% A  L6 ?" B% Y2 a9 T* u$ p2 Y* }% D1 _6 d
ReadFile(hFile, m_pwImage, nSize, &dwReadSize, NULL);" f* M4 \0 r9 q7 ^  \2 D1 D4 w
6 U' j2 z4 C, [; s" Y5 f6 T6 W' O
CloseHandle(hFile);
9 X6 T4 s" S2 b8 G* i7 {}4 [$ m) F  m  B1 z
m_dwTemLength = 3 * m_wWidth * m_wHeight;
- S2 B. {" Z+ e% M( t% m( y8 T7 ?//重新构件一个BMP头然后在写入到新的文件
2 S( f. m' u' t4 t
6 R- B+ c0 w* K$ L' }bBmpFile.bfType = 0x4d42;//'BM'& n1 V; i7 C7 w  B! f- ~
bBmpFile.bfSize = m_dwTemLength +  sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
1 m( b% a2 H' z7 zbBmpFile.bfReserved1 = bBmpFile.bfReserved2 = 0;
$ `3 s$ o. k  b  Y- S8 DbBmpFile.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); /// d: P% I! B* g; k  G6 R) ~1 C
//. y  E) M+ a9 f& B6 v
bBmpInfo.biSize = sizeof(BITMAPINFOHEADER); //以下是为BITMAPINFOHEADER结构赋值0 S' o. U$ ]8 |0 f4 p8 x
bBmpInfo.biWidth = m_wWidth;
6 B  g, z4 m; I8 U+ J3 sbBmpInfo.biHeight = m_wHeight;! g7 f' H: V. p: `7 v
bBmpInfo.biPlanes = 1;
2 M& H9 D# k9 P. S$ f# a/ [4 K  O: E/ [bBmpInfo.biBitCount = 24;, F6 [5 f$ J' q
bBmpInfo.biCompression = BI_RGB;
" M& {( I2 P7 m" ~1 D( \bBmpInfo.biSizeImage = 0;
$ [3 x: F! L9 Q% c% K" IbBmpInfo.biXPelsPerMeter = 0;
. S# t: z; s7 e" Z# q3 X& t6 NbBmpInfo.biYPelsPerMeter = 0;
5 O( N( c( T+ l2 |bBmpInfo.biClrUsed = 0;
' h! ]/ S; |) Y% R7 FbBmpInfo.biClrImportant = 0;$ \% `' |& l/ i: D, ~% b% U

0 n& W0 e9 r. s% G, M. c, X$ n" K& I///////////////////////////////////////////////////////////////////////////
+ e1 x0 h- z' W! u6 N/ J$ j//倒转图像数据% Y& Q  e3 t& v. b' |
BYTE *pOrgImage;
( N2 r) S2 k2 g; E7 m5 vpOrgImage = new BYTE[m_dwTemLength];
, V4 I6 Z' S4 N/ [7 u
" g7 c) ?1 [% c' p( mBYTE bsBlueColor, bsGreenColor, bsRedColor;% F( N  n2 a! W+ M. U
//656; [4 x( X3 v2 H" Q$ i8 n) a2 A) `
DWORD dwBMask = 31;
) `+ M8 O1 b+ }3 n+ J2 l. \7 S0 vDWORD dwGMask = 2016;, J2 p0 |6 g2 B- K
DWORD dwRMask = 63448;
5 |# [; e$ ]" v% h/ r
# P5 Z2 J1 K# OBYTE bBShift = 3;
; ~& O, B+ M" I+ gBYTE bGShift = 5;8 _- K) \# d0 A- e
BYTE bRShift = 11;, N; J# g7 \: a' r( X7 L9 q# x$ D" K

2 H" `0 S# r. d$ ^1 I! L// wPixel = ((byRBit >> 3) << 11) | ((byGBit >> 2) << 5) | (byBBit >> 3);0 n( C% O7 n/ ^: ?. C9 Z! V
/*# h2 C3 \7 r/ R+ _% ]/ l+ Z4 s
WORD dwBMask = 31;
- R$ V$ I9 ?' {4 O2 aWORD dwGMask = 2016;( A" r$ |0 D. @: ~9 N
WORD dwRMask = 63448;! H5 Z# R+ X8 v
: f% R; y! C  b' }3 `+ u' r1 Y
BYTE bBShift = 0;1 z; @8 x8 R2 o/ a2 F' m: \
BYTE bGShift = 5;% Y& C+ u+ b8 P
BYTE bRShift = 11;
' q) P" [  \2 N5 F! U5 I. C- M*/( P* P: K* m5 W) W
WORD nXSize = m_wWidth;% H: O' l* `: q. }/ j& \
int nByteAlignCX = m_wWidth*3;//(((m_wWidth * 24) + 31) & ~31) >> 3;
3 i3 _- ?" F8 v8 {) u
0 p3 s* U% w. q4 }7 ^1 |/ d: Sstr_Text.Format("%s New File 16Size %d 24Size%d",strFile,m_dwImageLength,m_dwTemLength);
+ d7 M. z7 T1 FAfxMessageBox(str_Text);
4 \" _% ~/ {" Q" w8 W  Y1 K) p
4 t" @/ ^% [. u$ K8 J3 rfor (int nYIdx = 0; nYIdx < m_wHeight; nYIdx++)
: g# e, s6 P. g{5 |: P# p. M4 ^% h  L! M
for (int nXIdx = 0; nXIdx < m_wWidth; nXIdx++)# i8 C9 d) U4 }% p+ z4 U. C" W1 K' `
{
: r9 }  J6 w1 {9 g//分色处理
. x5 U, q5 Y5 @$ DbsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] ) >> bBShift);   m$ F! Y# q2 F% I7 y$ A
bsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bGShift) << 2 );
1 g  K9 R/ k$ F* ~3 DbsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bRShift) << 3);
0 S' \" M* H( P9 t/* bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwBMask) >> bBShift); 8 r* O9 P6 C% V0 w
bsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwGMask) >> bGShift);
, V* q3 ]; B" `7 }0 E$ S% IbsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwRMask) >> bRShift);
- |; `4 e  Q8 |  P; H*/4 P, k) i) @! Y7 V2 }
pOrgImage[(nXIdx * 3 + 2) + (nYIdx * nByteAlignCX)]=bsRedColor;
: a) i, p$ H/ [2 E5 apOrgImage[(nXIdx * 3 + 1) + (nYIdx * nByteAlignCX)]=bsGreenColor;
; I+ w* s1 G% @1 ]5 n2 k0 m6 f3 vpOrgImage[(nXIdx * 3 + 0) + (nYIdx * nByteAlignCX)]=bsBlueColor;( W2 k9 Z2 ~. g' \# G, X
}! E  b* D$ z( _+ c9 u" o9 V- V2 ?: J
}1 d& ~. C& J/ i2 ~
/ ?: k' ~6 W1 U7 M
DeleteFile(strFile+".bmp");7 `$ g9 M3 |0 z: A
    if(!m_SaveFile.Open(strFile+".bmp",Cfile::modeCreate|Cfile::modeWrite|Cfile::typeBinary|Cfile::modeNoTruncate))6 ^, V( F) A, Y4 K& D
{. C# r6 l1 h; [0 E  e" S4 l" U
AfxMessageBox("建立文件发生错误!");
$ O! X3 T# c) r3 D9 B- x7 [* |5 ?         return ;
0 _4 V8 @/ \' B9 W; |5 A }
3 Q& j/ P5 @  F0 S; N m_SaveFile.Write (&bBmpFile,sizeof(bBmpFile));
3 ^7 B, I8 P! Z( p6 Q- W' u% k m_SaveFile.SeekToEnd();
7 ^6 n9 R- _- \5 n
' N& D7 y  L1 I m_SaveFile.Write (&bBmpInfo,sizeof(bBmpInfo));, U& \$ L5 Z1 X! R2 p- k+ o
m_SaveFile.SeekToEnd();& I# I% j  F& |2 R6 Z0 C6 G# Q- P5 T
' D4 k+ h3 n$ V( Q9 e/ ~5 |
m_SaveFile.Write (pOrgImage,m_dwTemLength);
' B; d1 X! p0 r m_SaveFile.Close();" N  c+ \' q9 p' z8 E- B
* E' d5 c+ _8 j6 O' l! U
if ( m_pwImage )
! n" u* D1 h; d8 f' E' {8 a {
; z! k% x" G$ @) j) ^: ?  {, j delete m_pwImage;
! v! ^8 F. F& ^, ?3 `' R, c. Q m_pwImage = NULL; 0 b) R" S) [/ O! {
}
* g4 ~# B0 Z" o, v5 ?4 P: h4 i- T if ( pOrgImage )! O  f2 e5 z2 M! `0 R7 `
{ 1 _- v6 ]! M. X
delete pOrgImage;  ]. L: V3 V6 a
pOrgImage = NULL;
- [: d/ W3 j1 s5 U" z2 o/ z# f }! D  y2 H5 s7 ^, r" |! G
}1 v6 x* h% y2 V6 X; Q
catch(...); H/ I1 U! v' g3 V# C
{
. P" h, e" A/ G' i$ i/ a, z}+ _5 J7 l+ M$ `
}7 a2 j  q" k* ^! q& o" K# ?! X1 {

; k7 N; ]8 ?! I2 w. g7 F
) H' U6 g' A) \$ b1 m' M该代码只能用于研究和学习中。请勿用于非法途径。
0 |4 H6 ^+ w6 ]# F0 ]) T0 j, a0 x. l% Z) @, u! d3 ^6 W1 H. g2 e- Z
呵呵。# W4 c: O* A4 j6 s4 b
希望谁能结决图像16->24的问题请给我发一份。不胜感激
! K8 z$ ~6 Q9 K* S1 |
8 w! [3 C9 a7 i( A! k, `( Vnewsoil@163.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-9 03:58 , Processed in 0.035035 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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