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

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

[复制链接]
发表于 2005-5-16 14:45:06 | 显示全部楼层 |阅读模式
  茫茫长夜无聊,结果下个了QQT的小游戏。* f0 V  |9 c% F" B# k% l. L. F
哎太幼稚的一个游戏。
' M6 M- U( c# [( y不过里面的小人物倒是有意思。于是就把察看了图片资源。! b9 H' P5 g5 H2 w& R

( Q, R9 e- N% F" z" G) I呵呵~~有意思打开PAK保管发现第一个字节PK(ZIP的压缩格式),于是把名称该为.rar用RAR解压缩
3 s( @2 S6 n" H3 [/ G# ~
& a9 `  n; ^: g5 e( H。。。。。。4 `9 H8 k" D: T& b
成功。$ S% m8 U/ q; k  S7 _/ X  x8 R9 F

( }+ }! b0 C2 X; j3 }/ r3 l, T" ?$ f: A: Z9 D2 ?3 {
结果打开一看全是*.img的文件。没见过~~~~~! [; e1 K3 a, w* Q- }* _
打开文件看晕 QQF.DIMG 什么文件格式。:( ~~~~~
- f$ U6 C7 h) y- g. U& }2 _+ u( r2 X+ o3 ]
于是分析了全部数据有点想16BIT的图像。但是有是24BIT的长度长14个字节。' ^* `; n( Q* `) e$ r" A  T! L6 ]9 l

2 e  E1 C& H7 `# Z。。。% ^/ a3 A, ]: c) g5 B

; ?8 M9 B) v" I& h哎不说了。给点代码自己去研究。不过有点问题。
+ Z1 O  u- S3 r7 \7 E: n4 m) z# J( g2 P, y4 N/ @. q, ?4 \+ ^
我搞不懂直接在贴到屏幕上显示正常。7 Z8 a$ b$ f4 h
) F2 @: \* C$ P; u" n. q( {( d
写成BMP发现意思比较暗。。。
& T8 u+ f' b8 j, t' I1 T9 L  G( r, K) e
+ J5 q1 m" K- o$ ~. V$ B% j
typedef struct tagQQBITMAPHEADER{ // bmih
5 k. c/ D3 ~2 q2 a  r6 W    char   szName[8]; //QQF.DIMG 标志   8! l' A+ @; u- i2 B
DWORD  bC1;       //65536
& R: D) g! [* e  jDWORD  bC2;       //24* L! W3 |& k# k3 y0 W" M/ p
DWORD  bA1;       //: X" X: b+ m! R9 ~5 Z2 p/ e: X
DWORD  bA2;       //
1 ^5 q" L/ V5 Z* |1 b  H- _  XDWORD  bA3;       //9 w- }1 T$ m/ q3 F& U7 T4 |
DWORD  bA4;       //: ?3 z; r4 x. w, O, X
   LONG   biWidth;   //宽0 K( [; O4 y3 h0 H1 U, j+ {4 c( Z
   LONG   biHeight;  //高1 C+ m% ?. Z( M& o
   DWORD  biP;
$ L/ J+ ]4 K; U( G    DWORD  biB;
* J0 ~& q2 ^) t% `0 V( m    DWORD  biC; + C3 o! w  u) H/ Y4 r: F
   DWORD  biS; ! s# F$ O# a/ L% q! ^. L7 _, P) X
   LONG   biWidth2;  //宽! c* F' i2 f: W! L
   LONG   biHeight2; //高! E4 H$ O! F9 r9 R' g( Z% `
   DWORD  biClrUsed;
4 L7 e0 Z& H/ \; I+ I    DWORD  biClrImportant;
8 J6 ]* Q" p. Z' w5 Z* c} QQBITMAPHEADER;
; G" r/ m; n" R( L: k  Q  g+ ]# E9 U8 {7 _

+ q  }2 J2 t: S" }* m. T' xvoid CBmpToolDlg::ExpBmpFile(CString strFile) $ _' m. E5 S% {, g/ }
{
# {9 M! \7 t# \4 c1 J4 CBITMAPFILEHEADER bBmpFile;
2 H# \. f, t) E7 f, }$ kBITMAPINFOHEADER bBmpInfo;
% C" |% H% C7 f, K5 [  KQQBITMAPHEADER   bQQHead;
4 m4 d  c( Z) `$ _& BDWORD  dwReadSize = 0;/ g. O% V# u" R* d) U. h; V3 @' X
WORD  m_wWidth;
% m" r$ i* e8 U" u) P: E2 CWORD  m_wHeight;/ l0 s+ \0 n- r
DWORD  m_dwImageLength;
! v# U1 g+ H6 L1 y9 L$ s5 i: TDWORD  m_dwTemLength;# K  a2 j- c; E" Y" s8 e, `( c+ [
WORD  *m_pwImage;- M' M  V( W/ g8 F/ m& k# H
CFile m_SaveFile;
' J1 r4 T, h$ d& g6 S# G- }( F% lCString str_Text;0 D0 R3 j3 F: ~9 l2 N

# c7 k9 f* O/ q3 n, I  M try4 T) {; N. `6 S% k: I
{
# A9 H/ _# f4 F8 x) g# S$ R9 a( a* B* ~$ B5 L4 |: n4 ]  @( S
HANDLE hFile = ::CreateFile(strFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,! L* c9 p$ D1 @: k. i8 ]& A
FILE_ATTRIBUTE_NORMAL, NULL);
! m" ~4 s& }0 |1 ^
6 p1 K% j) u: s& ~' |/ Vif ( hFile )
+ p  G+ P1 [2 `' X{+ z7 t/ B( G) x- L) O
ZeroMemory(&bQQHead, sizeof(bQQHead));
* M/ K0 ]+ L+ N0 b: `: X) [, SReadFile(hFile, &bQQHead, sizeof(bQQHead), &dwReadSize, NULL);
1 e% G% g! d8 ]! H. x. R7 a, ~: {2 ]+ E0 e
if(bQQHead.szName [0] != 'Q')return;
6 x4 a" C) Q! n* a; T% z8 S3 s1 @0 R8 r% J
m_wWidth  = (WORD)bQQHead.biWidth;) V$ R) V6 o$ _
m_wHeight = (WORD)bQQHead.biHeight;
% W: N, R& Z& b4 W  ^: z: s5 S$ ?1 l  Q$ z
m_dwImageLength = m_wWidth*m_wHeight*sizeof(WORD);* P, H5 e& H# z7 k
) e  B! [( }) a- N- E$ M
m_pwImage = new WORD[sizeof(WORD) * m_wWidth * m_wHeight];, A/ U5 x+ e. i2 v* Q! L% b/ D
" ^$ @" |6 M) b; ?6 x; `/ C
UINT nSize = m_dwImageLength;, L# Z' K( w4 y7 B- A+ S
4 [6 ?* P  \. g! V
ReadFile(hFile, m_pwImage, nSize, &dwReadSize, NULL);( h3 g  D) u# n: m/ b* h

$ P- |+ y4 q1 H& I" Q2 {% hCloseHandle(hFile);
+ a6 O9 K- V( D) J1 z}
3 W7 f. H4 t  ~" s% i6 vm_dwTemLength = 3 * m_wWidth * m_wHeight;
" \( x: M& g2 X6 C% ^4 h//重新构件一个BMP头然后在写入到新的文件4 c1 n2 N1 `4 |- @2 E' I; n7 _% N

9 v2 a$ W. @3 `! {* c9 C9 zbBmpFile.bfType = 0x4d42;//'BM'% |/ S" |  l1 N* o. S. |& L: @
bBmpFile.bfSize = m_dwTemLength +  sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
4 u% @; f9 X' i( d2 g. ZbBmpFile.bfReserved1 = bBmpFile.bfReserved2 = 0;
' q2 ^9 z3 z5 `/ B# i% E6 X/ sbBmpFile.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //
. U% g# \0 d: j' j7 L$ {7 T& j//
% W# e- J: k) n# U5 v( n2 q: JbBmpInfo.biSize = sizeof(BITMAPINFOHEADER); //以下是为BITMAPINFOHEADER结构赋值! d5 `; \2 v0 d
bBmpInfo.biWidth = m_wWidth;: _% Y* L' i1 l& G2 T& ^% d
bBmpInfo.biHeight = m_wHeight;
" a! p1 c: k/ `bBmpInfo.biPlanes = 1;) _' C! l' v1 D+ _5 N
bBmpInfo.biBitCount = 24;" ^5 {+ h9 C- a3 R* N
bBmpInfo.biCompression = BI_RGB;1 O- R6 P. K6 |' u% I# g) e9 ?
bBmpInfo.biSizeImage = 0;
( F9 w. }. v2 J9 Y+ r/ Q3 m" K' x' ibBmpInfo.biXPelsPerMeter = 0;; _- h4 h+ R$ s& R& R! \6 O% Y
bBmpInfo.biYPelsPerMeter = 0;
- h2 [# t. S0 _% ^, x* tbBmpInfo.biClrUsed = 0;: Z+ b# _; ^' s6 [; D2 a  r
bBmpInfo.biClrImportant = 0;
) y* u% R* Z: t2 _0 d, Y( {# Q! m& I5 {5 g. X
///////////////////////////////////////////////////////////////////////////
$ U* n2 {4 M6 i" w( A. T//倒转图像数据
& X) x5 u: O5 F2 R; l3 `& YBYTE *pOrgImage;  a, b5 O% P: n- y- {) M3 i
pOrgImage = new BYTE[m_dwTemLength];( ?% n/ ]3 n+ i2 x$ z: F! A
" o# T- a! z/ M% l& q, x" B
BYTE bsBlueColor, bsGreenColor, bsRedColor;; k, V/ |3 E, N
//656, u: @1 H1 g$ a: j
DWORD dwBMask = 31;8 S6 c9 c  P3 c/ T' d, e
DWORD dwGMask = 2016;
- u1 P9 V) v) W! {DWORD dwRMask = 63448;
. C, u) d8 J  i7 ~% y* {; w
: O4 `* y- a2 E8 ?BYTE bBShift = 3;
4 \$ [  t+ R7 N* I# `BYTE bGShift = 5;
7 t+ H, ?9 U* c2 NBYTE bRShift = 11;& W, r+ O2 Q% v8 I& S7 n- c( E

' ^2 |! ^6 c5 C; [. j// wPixel = ((byRBit >> 3) << 11) | ((byGBit >> 2) << 5) | (byBBit >> 3);0 y1 B/ f3 o, _
/*, [3 c$ e/ G" J
WORD dwBMask = 31;8 E, _  r- x0 c
WORD dwGMask = 2016;
# }7 C7 R  X* ?3 E" @4 }8 rWORD dwRMask = 63448;
7 c; r. O; b- v
. y/ ^' k0 G! W" N* }4 YBYTE bBShift = 0;
: e$ v/ X& s  W( k7 SBYTE bGShift = 5;9 I" \; I  A- r7 B% I
BYTE bRShift = 11;: ]6 B0 x4 p+ t
*/6 Q2 h' j5 L/ N1 b3 n
WORD nXSize = m_wWidth;
9 a( W/ ?* e6 c. b3 i0 lint nByteAlignCX = m_wWidth*3;//(((m_wWidth * 24) + 31) & ~31) >> 3;
( X0 ^( V" }4 X6 l5 w3 t9 f. f/ c' }$ D8 d+ c# z: e
str_Text.Format("%s New File 16Size %d 24Size%d",strFile,m_dwImageLength,m_dwTemLength);5 I1 X! m9 U( U
AfxMessageBox(str_Text);. |) q1 n' q" ]. b

+ B# b, x8 F8 g6 T. ?6 ^- ?6 n( Pfor (int nYIdx = 0; nYIdx < m_wHeight; nYIdx++)
. m) U( Z/ F8 g- S7 L0 g, H{
3 v" M% k8 N3 U' R1 Lfor (int nXIdx = 0; nXIdx < m_wWidth; nXIdx++)) E& Q9 `% v2 u! s
{ $ S' g% @6 t" y
//分色处理- L( b5 M4 p# @$ g2 m
bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] ) >> bBShift); ' `* c: o% K0 `& m
bsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bGShift) << 2 );
* m% \1 |8 v# ^9 H' rbsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bRShift) << 3);
; V9 a* b# d3 \. ^$ x  F, v/* bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwBMask) >> bBShift);
" \& I* b1 ^# F) p; ]bsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwGMask) >> bGShift);
( ~8 \# d$ r. q/ y! |bsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwRMask) >> bRShift);
$ x, D) b! i- }1 G% l; D: E6 i*/
; F# T. z" p; [  i7 s9 f- M. r9 RpOrgImage[(nXIdx * 3 + 2) + (nYIdx * nByteAlignCX)]=bsRedColor;
/ p9 d& j( {- W4 t  tpOrgImage[(nXIdx * 3 + 1) + (nYIdx * nByteAlignCX)]=bsGreenColor;' g8 q1 U! n# n: r# F$ s/ a
pOrgImage[(nXIdx * 3 + 0) + (nYIdx * nByteAlignCX)]=bsBlueColor;
- B! I$ {! R* C, F$ F/ a& r: G7 d}+ G- R/ k' p) X, A: q& w: O
}: d; _$ v4 r) o# v; X+ o$ N5 D4 C
4 |* O4 R  C; _) A  V0 z
DeleteFile(strFile+".bmp");" {( d" k9 ]! |( I
    if(!m_SaveFile.Open(strFile+".bmp",Cfile::modeCreate|Cfile::modeWrite|Cfile::typeBinary|Cfile::modeNoTruncate))  @: X7 b* C$ J+ q' D% c0 h
{1 L1 u5 b9 `( p6 h; y! K+ l- b% r
AfxMessageBox("建立文件发生错误!");$ y- w: h9 E. L
        return ;) z" q  P- ~0 y# [& ?- P
}
% Q+ _# N4 _' B7 r6 Q m_SaveFile.Write (&bBmpFile,sizeof(bBmpFile));/ R* D* x; F6 S
m_SaveFile.SeekToEnd();
* {( h6 s3 g; Q& s$ G4 m0 i6 T" k: A3 H# y; v
m_SaveFile.Write (&bBmpInfo,sizeof(bBmpInfo));! j4 i+ k% a' U; ?$ m# Y! ]' I
m_SaveFile.SeekToEnd();
9 r( M! \- F2 G  O3 K  A7 T1 J( o% F/ q4 R1 P/ R' I' h" @
m_SaveFile.Write (pOrgImage,m_dwTemLength);3 Q  |9 Y# a1 s8 z
m_SaveFile.Close();0 C: b/ p1 H( l, l
% K# H! T9 @6 t, y
if ( m_pwImage )$ |! _" K+ e/ M5 y% U
{ 5 j# `# ^5 f/ X* c
delete m_pwImage;5 A9 G& Y& e( d8 R; R8 R5 I0 R
m_pwImage = NULL; ' S8 p9 p3 x  M4 A# s
}" H+ Z( J, `$ A( a! D
if ( pOrgImage )8 ?8 m" F4 `& D% d$ o' ^
{ ' m# ^/ N  W/ q6 o5 T
delete pOrgImage;
, j$ r3 q* i% |7 h pOrgImage = NULL; 5 n) G5 y0 B/ n0 M
}- L4 e! n+ d; a1 x1 A/ O
}
" u6 ]' P% j$ S# Z: I) kcatch(...)$ ^9 L$ A0 Z# L' ~2 p7 A
{
1 {# C  r. x0 w- M0 W# F}. I0 e" o$ }* Y# c! E7 T
}8 y) t- Y: o5 ^6 w$ E. s- o

- [. t+ @+ ?' g+ i$ |3 ^2 Y3 X! o. s$ y( y+ X  z" W1 ?
该代码只能用于研究和学习中。请勿用于非法途径。, P. J3 f  Z0 y% J  S

0 C4 Q. v. I6 I9 P6 T6 A4 \! W呵呵。
& y1 e* |6 P) |# A0 R2 a: U希望谁能结决图像16->24的问题请给我发一份。不胜感激) [2 c: t' B8 s* W4 d
  A: X& ?( X% z3 [9 b2 `/ a
newsoil@163.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-5 09:21 , Processed in 0.014964 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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