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

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

[复制链接]
发表于 2005-5-16 14:45:06 | 显示全部楼层 |阅读模式
  茫茫长夜无聊,结果下个了QQT的小游戏。1 g! i3 X* d- w, D6 i6 c- g7 h
哎太幼稚的一个游戏。
/ y) d& G+ \* s/ d% U不过里面的小人物倒是有意思。于是就把察看了图片资源。5 e6 e4 j2 a8 l: I7 R& n& f0 ?

( W. y3 q7 _% ]呵呵~~有意思打开PAK保管发现第一个字节PK(ZIP的压缩格式),于是把名称该为.rar用RAR解压缩  H* X# d7 q; L! ^$ t3 [
1 f$ u0 H: T6 F* n( L5 H, d$ t
。。。。。。2 V0 Z1 |2 ]' V8 [
成功。& q0 p( C* r5 j. v3 K7 I
4 a% b2 m1 y$ Z0 R) g" s' ]

* N: b" k" o7 W# H0 T& H5 v结果打开一看全是*.img的文件。没见过~~~~~* V9 k: T7 z6 V  x3 N9 Y7 D
打开文件看晕 QQF.DIMG 什么文件格式。:( ~~~~~1 k/ B+ S# B: F* ?7 ?, w

- W& [: [4 o! u- F# e4 Q5 ]于是分析了全部数据有点想16BIT的图像。但是有是24BIT的长度长14个字节。+ q5 F  w' n  C: V, Z+ A* H; D& [

1 `1 o; f& P) f0 K& w$ p  W。。。
2 D  z6 M$ O1 I4 c: P, F& ?! r
( B% g# {  h* Q5 f1 J哎不说了。给点代码自己去研究。不过有点问题。
) [' |8 {, Q* O* K) p9 v! Q% r. j1 w8 g6 F
我搞不懂直接在贴到屏幕上显示正常。
, X/ Q  h7 J, m( a. s4 `' h* m7 t/ [2 Q/ P
写成BMP发现意思比较暗。。。* g4 r  j9 s3 e  W# d. z

* ?; b) R: [  Q  Y5 H8 C# A. J- j1 }8 t
typedef struct tagQQBITMAPHEADER{ // bmih * f& c" @/ |* v0 ^7 Z; m/ k2 S/ X# t
   char   szName[8]; //QQF.DIMG 标志   8
3 S9 w1 P( `% ]3 H! l8 [DWORD  bC1;       //65536* i2 q! ~' \2 z! t- v0 O' Y
DWORD  bC2;       //24# ]9 T; V6 }, n+ n0 y( `# E1 O
DWORD  bA1;       //
8 F+ q" Y* k0 s' b1 ADWORD  bA2;       //. P1 }. }/ g8 v
DWORD  bA3;       //
& X2 b7 Q" g( M) L% cDWORD  bA4;       //
3 u$ H$ I6 {" A# A$ A$ H    LONG   biWidth;   //宽8 u( Z2 P. a4 I8 B% _9 }- f
   LONG   biHeight;  //高
' V) d1 }; [# s" m; @    DWORD  biP;
/ w5 I) Y2 X' c+ ^6 ~7 R5 F    DWORD  biB; 4 `6 G& @; R1 m# `$ d/ o( G
   DWORD  biC; ( _' l$ m) i$ _" j$ K( Q8 F
   DWORD  biS;
0 r2 }9 t) e+ Y    LONG   biWidth2;  //宽2 Y( h2 H7 F. S  V
   LONG   biHeight2; //高" c6 [* O2 |' q& {$ `/ B& J
   DWORD  biClrUsed;
( l" `: ?0 n7 f1 e( C9 H    DWORD  biClrImportant;
5 {) T/ [5 _( v! [" x4 ?; u$ W6 W} QQBITMAPHEADER; 7 F$ r9 ~' _2 {: h4 q1 Z

6 _; l8 q" L% j( a, q8 z
) |" D* m6 R# {9 U$ M& y( svoid CBmpToolDlg::ExpBmpFile(CString strFile) % W4 d; G2 A& l1 Z
{2 ~4 \" ?& g( |3 Y
BITMAPFILEHEADER bBmpFile;& p( p, h# I& C; N$ g
BITMAPINFOHEADER bBmpInfo;
. d, @% Z$ d7 k% k" SQQBITMAPHEADER   bQQHead;
; i/ u7 K3 ^. W9 M8 f5 \DWORD  dwReadSize = 0;
  O$ K- N0 d9 D) H+ A! S: iWORD  m_wWidth;
) C% x" R7 G8 wWORD  m_wHeight;$ V# c: M+ G. k0 R( B" P3 ^, [: ]
DWORD  m_dwImageLength;) q# d- @4 k; Y2 L* i# ], y0 d* g
DWORD  m_dwTemLength;) d  y; S! `$ q
WORD  *m_pwImage;
/ [7 h) R+ Z" r  ?3 B8 {( s! ^CFile m_SaveFile;
1 r4 C+ E  D8 q$ c  U" C) [; D' b9 UCString str_Text;) |# N; I" ]# h  F1 \9 A- @0 L& Y6 \
1 g3 O$ M1 D4 u, j$ X$ w! c- L# l
try% K1 L- A6 c/ t% [
{
- k6 w& E7 f# f# a2 e# J( w! g$ Q7 Z1 |+ v& C5 l6 K
HANDLE hFile = ::CreateFile(strFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,! `+ D) w, j; u4 U
FILE_ATTRIBUTE_NORMAL, NULL);
9 y9 @; t; z9 i6 k$ @, t  i3 ?1 E0 P. B* ^/ I0 }* w8 Z
if ( hFile )
: ?5 X  x4 @- [  o, @{; N  a2 B+ t1 C6 u/ I
ZeroMemory(&bQQHead, sizeof(bQQHead));
. g, ]( ^4 Y4 L+ XReadFile(hFile, &bQQHead, sizeof(bQQHead), &dwReadSize, NULL);
$ y/ _5 \. u" g& T
/ h1 k) a, c  U0 p) t4 v) w& Vif(bQQHead.szName [0] != 'Q')return;
9 @0 O$ c: _5 z( n: ]% O0 q, M$ N3 C; D8 i6 w7 _9 o
m_wWidth  = (WORD)bQQHead.biWidth;9 {/ O9 @& g; c0 A
m_wHeight = (WORD)bQQHead.biHeight;+ P) U1 i$ ]9 Y5 J6 ^9 b

/ t% h2 h+ T3 U9 R) rm_dwImageLength = m_wWidth*m_wHeight*sizeof(WORD);
9 S- _: ]. T: t, x( M' I+ T# D! x" b1 i( k( ~
m_pwImage = new WORD[sizeof(WORD) * m_wWidth * m_wHeight];; q6 ]1 v' g* a) F, e% Z+ l
9 T& w- B( _- [
UINT nSize = m_dwImageLength;
) ?6 L2 c1 Q  f6 _$ i) y; n/ |( F! T& k- N% }
ReadFile(hFile, m_pwImage, nSize, &dwReadSize, NULL);, {& J; V6 t! Q5 D$ m; u2 i6 v

6 Y$ Y2 m. N% xCloseHandle(hFile);
# d7 i+ K' q' F' n1 \0 p9 P}
+ b$ E2 d- }/ @, p9 {m_dwTemLength = 3 * m_wWidth * m_wHeight;* M+ S6 z2 C  R. R. F
//重新构件一个BMP头然后在写入到新的文件" D. ^$ X  S! n4 d; Z" T/ T

% f9 z$ L4 F  |+ F8 LbBmpFile.bfType = 0x4d42;//'BM'
: k6 @1 p1 v' g9 H7 s! ]bBmpFile.bfSize = m_dwTemLength +  sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);2 ~0 a9 T+ J3 {  l  K
bBmpFile.bfReserved1 = bBmpFile.bfReserved2 = 0;
  H6 a4 V5 T3 g" V8 W$ d* u' e+ @' abBmpFile.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //
9 u1 B7 z, P+ w% N/ u//5 N. U8 a% v7 S6 t
bBmpInfo.biSize = sizeof(BITMAPINFOHEADER); //以下是为BITMAPINFOHEADER结构赋值
  N: P+ @9 I- U% AbBmpInfo.biWidth = m_wWidth;( j1 q( b5 H2 T4 U# x) [2 |
bBmpInfo.biHeight = m_wHeight;
4 F9 ^" n$ O$ t  R% g" ZbBmpInfo.biPlanes = 1;
6 Y* {/ M1 O3 V$ b" T9 HbBmpInfo.biBitCount = 24;" p' n8 s4 j9 t% H0 N9 n
bBmpInfo.biCompression = BI_RGB;4 u, p) U7 d! y8 n
bBmpInfo.biSizeImage = 0;; k, n. }7 k9 |0 A! b( W
bBmpInfo.biXPelsPerMeter = 0;
0 z8 _% x! m- c. Q2 j/ ebBmpInfo.biYPelsPerMeter = 0;
2 s3 w) b. W4 D' S6 c9 EbBmpInfo.biClrUsed = 0;
( ~" t  j( v1 {7 PbBmpInfo.biClrImportant = 0;
- P* g  |( v( G
- q4 {7 E! g4 i2 z, M- i$ M/ O" y; Q$ e///////////////////////////////////////////////////////////////////////////
% V# b7 c' Z/ H$ b! k//倒转图像数据
( V8 d5 p* N1 ^+ G+ Y8 F5 |) ~BYTE *pOrgImage;
# T1 ]; T0 m( G1 GpOrgImage = new BYTE[m_dwTemLength];
) m8 B7 a' u% R1 X4 B) k2 s
, J% ?6 d/ s$ D; N" jBYTE bsBlueColor, bsGreenColor, bsRedColor;4 P) M" n) F7 D9 y
//656
0 ?% \' m& x2 ~; a7 `8 _. fDWORD dwBMask = 31;
0 j0 t& a, k6 ]! Y& {1 ^- GDWORD dwGMask = 2016;
! }2 n* M. y- ^DWORD dwRMask = 63448;  N/ @  p5 }6 J
, S1 k. ]8 t/ s2 k! \9 w
BYTE bBShift = 3;& s7 ], L: c- |& g& [1 W0 w) w# O* ^
BYTE bGShift = 5;( h, X8 l6 g' J7 D! v
BYTE bRShift = 11;
, c( ^  p3 y% V& k8 R6 u) }8 b) Y- A/ g" J! Z$ N
// wPixel = ((byRBit >> 3) << 11) | ((byGBit >> 2) << 5) | (byBBit >> 3);1 F' N9 b1 z: p) B- ^3 T6 v. X% G! v
/*
4 L  e' o$ p0 x) l( b$ QWORD dwBMask = 31;, G; b2 D  j+ n$ D7 D2 N# Z9 c
WORD dwGMask = 2016;
% {, Z" s4 Y  U6 h5 MWORD dwRMask = 63448;* U, _$ T8 Y4 d( i8 S% w- B
& T! S2 i" ~% p$ D! |+ r
BYTE bBShift = 0;
/ l( g: g# z8 a  f  W4 P5 D7 I/ F/ pBYTE bGShift = 5;
0 L) `, [$ F+ e, f. h' r# A1 OBYTE bRShift = 11;
4 R% o6 ]# a; \) d$ L/ `*/
8 C/ [5 ?, n8 D2 Y2 r6 yWORD nXSize = m_wWidth;6 V1 @1 b) ^3 t' f/ v
int nByteAlignCX = m_wWidth*3;//(((m_wWidth * 24) + 31) & ~31) >> 3;
! i7 f. |. a4 R$ K0 k
/ L! l4 }. J: C3 N1 v, p# mstr_Text.Format("%s New File 16Size %d 24Size%d",strFile,m_dwImageLength,m_dwTemLength);
; @% A( [; B2 q3 I* N( ?AfxMessageBox(str_Text);7 }: M. C$ ]3 X) z$ e3 }; _

9 J6 R0 s2 r1 l: s; o& |for (int nYIdx = 0; nYIdx < m_wHeight; nYIdx++)" H0 n0 V: C# R! T2 J
{; W! N- p  N( P
for (int nXIdx = 0; nXIdx < m_wWidth; nXIdx++)3 `1 r( E* m6 k7 W1 g! h( P
{ 5 `" f' o2 f: Q9 t0 X  d9 o# t
//分色处理
2 d) }3 e4 X7 c; ^& D7 c( R; CbsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] ) >> bBShift);
+ G# k, Q! Q, N/ P  h4 ZbsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bGShift) << 2 );
2 l* }- r, U' {bsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bRShift) << 3);, l7 k: V; r' x* B0 @2 Q; Q
/* bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwBMask) >> bBShift); . y8 ]3 o- R/ t* t* K+ Y+ L- X
bsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwGMask) >> bGShift);
7 x4 d$ r2 x& H/ rbsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwRMask) >> bRShift);
: C8 S* t/ A5 z& W0 z" E*/7 Z' P  c6 H3 O# j4 D! A
pOrgImage[(nXIdx * 3 + 2) + (nYIdx * nByteAlignCX)]=bsRedColor;
$ [) j# G* a- t$ GpOrgImage[(nXIdx * 3 + 1) + (nYIdx * nByteAlignCX)]=bsGreenColor;
3 V. q1 O& R( f+ g2 QpOrgImage[(nXIdx * 3 + 0) + (nYIdx * nByteAlignCX)]=bsBlueColor;
/ U7 b9 N0 Z+ @0 v}
* f( N- ^' w( g' d) j}2 t3 \5 ]9 ?" D' C, E: [+ @

$ @2 {6 a$ g% d) R DeleteFile(strFile+".bmp");, Z8 N2 U) w) H/ i* M2 }
    if(!m_SaveFile.Open(strFile+".bmp",Cfile::modeCreate|Cfile::modeWrite|Cfile::typeBinary|Cfile::modeNoTruncate))
9 |. b. r8 z) v. L  b {' l# z% ~- d- [% C0 c% x9 J) R2 M
AfxMessageBox("建立文件发生错误!");9 K. f- S$ k7 K& D8 z# j
        return ;0 U% k1 J3 E7 }  v% x
}% P# y" a9 Y4 M
m_SaveFile.Write (&bBmpFile,sizeof(bBmpFile));
& D8 e+ n3 i0 w% O/ U! O m_SaveFile.SeekToEnd();
7 ^9 l) H8 g& c; ], ?& g8 p4 ?" w2 k. G
m_SaveFile.Write (&bBmpInfo,sizeof(bBmpInfo));7 l! ~6 _% U" _7 v5 i
m_SaveFile.SeekToEnd();
9 l  Q9 Y8 u* x( \; D0 E; V! c  z2 M6 j2 B  R( B" h
m_SaveFile.Write (pOrgImage,m_dwTemLength);
7 X1 \* E; w& o  `. ] m_SaveFile.Close();* J# X9 ~  \# D

; E0 u: v) p( D7 v* r2 e if ( m_pwImage )# b( E. R+ `6 k( x/ P: g8 S
{ 3 {+ |/ R* m6 ~9 k3 W  Y
delete m_pwImage;/ [& A# Y# w& g; P: X
m_pwImage = NULL;
9 P: I; z: ~, d* Q }( ]; k$ e$ W- v3 e
if ( pOrgImage )8 u, V& }8 A( x" E1 {- o
{
. L' J* b- _% ~. A& e  Z! T# g7 H delete pOrgImage;1 w! s5 j: W/ E+ a" g: R* C
pOrgImage = NULL; $ d- K  V# d" v
}
! W3 e1 B+ O6 O: J2 T}, x* ?7 `2 Z# Y; r, G4 s
catch(...)
0 x% H$ d/ j7 N2 x* A3 y6 N{
" T' ^" ?  m8 o, J}
7 I* \6 W( h. x# L}% I  Y3 {, K- j+ w: w( h- |# ^

/ y" E) @0 U9 U6 H
! K! f# S$ H/ t3 j( L8 j5 E* n该代码只能用于研究和学习中。请勿用于非法途径。
' o# C$ I$ g3 I5 |/ [0 }2 g1 G) y+ ^& d  r  s8 @& d) p
呵呵。2 l9 y  m. d' a
希望谁能结决图像16->24的问题请给我发一份。不胜感激8 o1 x+ W2 a4 g, U% Y

1 V; m+ T: \4 d( Q! C( h% {newsoil@163.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 11:03 , Processed in 0.015954 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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