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

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

[复制链接]
发表于 2005-5-16 14:45:06 | 显示全部楼层 |阅读模式
  茫茫长夜无聊,结果下个了QQT的小游戏。
: d0 n- I: B; J* _, V1 h" `哎太幼稚的一个游戏。, m0 I6 B2 o5 T
不过里面的小人物倒是有意思。于是就把察看了图片资源。
+ O0 G2 V; m3 k6 ?& [8 r  k
2 Y, l, S+ ]/ v  F7 x; i呵呵~~有意思打开PAK保管发现第一个字节PK(ZIP的压缩格式),于是把名称该为.rar用RAR解压缩
( j2 l9 `: i( F: p8 |/ {
: |3 L6 E4 r6 a2 O) \9 Z。。。。。。
1 M% n  w5 r% Z& n成功。
& M, Y  U- W5 p% K8 D3 W3 C
' B5 K) C6 u2 P; A, Q" x$ G7 t8 {3 k
结果打开一看全是*.img的文件。没见过~~~~~
  d% s* e1 R& I) _. {- y2 K打开文件看晕 QQF.DIMG 什么文件格式。:( ~~~~~
8 x0 K7 S5 w  U7 I: k/ ~% M; }% T# E0 {) W
于是分析了全部数据有点想16BIT的图像。但是有是24BIT的长度长14个字节。) c! U( U) X$ w( z# D0 o
6 @! S) z- q' P$ W0 J. F* h4 w
。。。' N  ~1 ^  b9 x  {1 E
! E1 g: l  p  p0 T& W
哎不说了。给点代码自己去研究。不过有点问题。' t; V7 L1 q* o
& q2 ?  |" F9 y7 }* p
我搞不懂直接在贴到屏幕上显示正常。$ T3 K  s$ n+ {5 O. n* q2 n

  a7 I4 {" h# U* E- t写成BMP发现意思比较暗。。。
% X( A% T  M/ b; `( {8 A4 z* |, i- V! f' B0 C  V

' M3 m6 h" ?- g  P5 ?. b' Gtypedef struct tagQQBITMAPHEADER{ // bmih 2 c6 `0 f/ }% n& |' E
   char   szName[8]; //QQF.DIMG 标志   8
' X. u  k5 w3 u! H. |) xDWORD  bC1;       //655364 R$ v  E9 {8 j# R# i) L% i
DWORD  bC2;       //24
# ~9 A+ U. f' |2 W8 TDWORD  bA1;       //
0 e) F2 V; ~& i, Y: rDWORD  bA2;       //
; g& \% N! s3 J, a! S1 c4 a5 \DWORD  bA3;       //
8 M1 N* M. k/ x% ~DWORD  bA4;       //* t, Y+ o9 H% x- m5 C  g' J& `- ]# U
   LONG   biWidth;   //宽0 Q8 m) D9 A% N- J+ D" N
   LONG   biHeight;  //高0 r+ u$ q, a0 C/ n; \3 K' a
   DWORD  biP;
6 \+ q) \* S' l0 O) E7 o    DWORD  biB;
# ~1 X- o) l+ L* U7 h    DWORD  biC; # H% W4 _2 ~$ Q. X5 N4 C% T' _5 U
   DWORD  biS; # x5 s* n0 M1 M" z" y( I5 L3 x) I
   LONG   biWidth2;  //宽
9 X- W1 j. W) c( U; t. u    LONG   biHeight2; //高& |! X6 _/ p0 |1 i  T' R( o
   DWORD  biClrUsed; ( }) K; f5 s, R/ H: n8 [% W
   DWORD  biClrImportant;
# c9 B+ z- K/ Z# G  R2 v} QQBITMAPHEADER; 3 I9 h: V0 S- N, r" X. x* l1 U

2 K/ F9 C% E: c9 |( W
' c1 S" ~5 D3 S% B: _& |void CBmpToolDlg::ExpBmpFile(CString strFile)
! q( f4 W' F& t2 K  ^/ }  w{/ K' C2 I  y! @0 W
BITMAPFILEHEADER bBmpFile;/ c4 v/ D4 Q5 \5 j" c
BITMAPINFOHEADER bBmpInfo;
; Q. c" j# }+ ?3 \" h  B4 aQQBITMAPHEADER   bQQHead;# P% b4 X" V* n# H
DWORD  dwReadSize = 0;
9 V& G8 ?/ F1 R1 ~; n3 g( P& n! v. DWORD  m_wWidth;4 y! _& J1 X* M+ g: T
WORD  m_wHeight;
1 |' h! Z0 L3 p9 PDWORD  m_dwImageLength;
& @0 ~. v, J, H! }DWORD  m_dwTemLength;# r% m% @$ q8 G. i& l
WORD  *m_pwImage;
3 O; |4 e" }# q' ~9 r+ H2 j: hCFile m_SaveFile;. f2 G7 P0 Q! u8 o1 y0 m/ y; R7 p
CString str_Text;/ k8 g$ Y2 W0 s) B% z+ U8 t4 w; \

* }" r$ E# z$ f4 n/ j/ c try) c( ~( x* c& q- |/ L
{! x/ [; Z1 p- Q& z( W5 C3 p

: y: Q% c2 g% N/ t& K" ]% O# dHANDLE hFile = ::CreateFile(strFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
& x, U4 K) s4 l; l2 j  p; P3 EFILE_ATTRIBUTE_NORMAL, NULL);4 Q4 C+ o# m- u8 g! r) j
  b3 A- T  a& C7 u% {
if ( hFile )+ @: X; g- S* S* R
{
9 T; _$ L- @! [% o4 n9 L7 \2 Y% L; XZeroMemory(&bQQHead, sizeof(bQQHead));  O' X* z2 a- e: q0 g
ReadFile(hFile, &bQQHead, sizeof(bQQHead), &dwReadSize, NULL);, h+ l. \1 u# Z$ p

6 m. d! ?; N# p$ z- E9 N, Oif(bQQHead.szName [0] != 'Q')return;
5 z6 A. p+ z: \" X  x
) W, B: c8 C6 x- B& E) P1 c2 m" o/ g( qm_wWidth  = (WORD)bQQHead.biWidth;
7 s3 u) n, T6 m% J( s6 um_wHeight = (WORD)bQQHead.biHeight;
; x+ h. U9 q& J5 [8 Z; U( |, D1 O$ R: p7 t( }3 h3 B% o
m_dwImageLength = m_wWidth*m_wHeight*sizeof(WORD);# P- [! n$ j$ ]7 t5 R  H* ^
+ u* p) a* \. j- C8 k
m_pwImage = new WORD[sizeof(WORD) * m_wWidth * m_wHeight];
  Y* Y  [" d$ S/ N0 U1 ^4 n
* d0 ~8 n2 m+ i/ R7 N# h- VUINT nSize = m_dwImageLength;7 N& }. a* z, I

5 S+ `" ~: k' Y; @( Q' {, v  H% pReadFile(hFile, m_pwImage, nSize, &dwReadSize, NULL);# C/ z% a* v" x2 q8 t

1 t) G3 ~( M. s6 Y8 [. f3 |CloseHandle(hFile);# m3 s+ u: f* d1 b8 I
}
# R" t) u5 f1 B# f: bm_dwTemLength = 3 * m_wWidth * m_wHeight;( K" m+ J: M+ V- r' b* `2 [' o
//重新构件一个BMP头然后在写入到新的文件. l  ]& M% b) W0 p2 ]+ \

( ]' y: b1 Y( M4 E9 _6 ZbBmpFile.bfType = 0x4d42;//'BM'0 Y9 I% K: B  ^" M( ~/ p
bBmpFile.bfSize = m_dwTemLength +  sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);4 j3 B- j- s- C& P! H) w
bBmpFile.bfReserved1 = bBmpFile.bfReserved2 = 0;
. l- r. A/ b% Z& D" s6 L  Z& [: SbBmpFile.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //7 s% P# |4 Q6 r% \5 j
//
1 E; A7 P% X9 EbBmpInfo.biSize = sizeof(BITMAPINFOHEADER); //以下是为BITMAPINFOHEADER结构赋值
$ I7 T% j8 x7 @bBmpInfo.biWidth = m_wWidth;
! t+ L8 j! P6 l) J- S6 ibBmpInfo.biHeight = m_wHeight;. N0 \7 M4 v5 W! l4 k/ d
bBmpInfo.biPlanes = 1;
6 P0 n- R8 Y" ?8 M0 ]2 MbBmpInfo.biBitCount = 24;
  o9 P. k1 l( z, u- M/ A: CbBmpInfo.biCompression = BI_RGB;1 x& ^' }+ p$ A. H" l* \  H
bBmpInfo.biSizeImage = 0;+ j! h$ b) T4 s8 M+ c( e* m3 x4 [; z
bBmpInfo.biXPelsPerMeter = 0;' Q; b! b5 x- a0 f3 u4 m( ]
bBmpInfo.biYPelsPerMeter = 0;
' l; `' _$ l2 V. VbBmpInfo.biClrUsed = 0;" F0 j1 A, b  H) G$ p
bBmpInfo.biClrImportant = 0;; E; ~% G) }" t" G; F# d" }

, |8 `4 f" r- A///////////////////////////////////////////////////////////////////////////
( d( h! \" E. m% W- U$ \+ C//倒转图像数据8 K% _2 K2 \1 {) n. E8 H8 n6 x0 y' u
BYTE *pOrgImage;  ^3 N, h) z. x0 W! P
pOrgImage = new BYTE[m_dwTemLength];- a" J1 Z; w4 i1 `

" I7 D5 F% ~1 }; _BYTE bsBlueColor, bsGreenColor, bsRedColor;
' _6 J3 z* Q8 s8 Q//656
' H1 H# @. `$ c  f: d% R0 S4 o7 t8 bDWORD dwBMask = 31;
. t" _$ O, A) F: R4 B, UDWORD dwGMask = 2016;0 j: k% g. F( M  P/ ~; ]3 m
DWORD dwRMask = 63448;
9 {( a1 q4 ?7 d7 x  S
1 I& Z! }3 x# o) X$ yBYTE bBShift = 3;7 T, W( q. ]/ G
BYTE bGShift = 5;- b! v0 U( C3 J! ?
BYTE bRShift = 11;3 d' h  ~' ~( G

( I7 M: ?! b+ d// wPixel = ((byRBit >> 3) << 11) | ((byGBit >> 2) << 5) | (byBBit >> 3);5 D9 b, N- v/ G% N3 o' U
/*
8 h( T1 P$ k- d2 Y1 O4 I! BWORD dwBMask = 31;4 F9 D& ^) D: H, l1 g
WORD dwGMask = 2016;2 P' P% a  g: e, o
WORD dwRMask = 63448;
. c; \/ `- [$ d
* r4 l. ^& r+ R: f! b' ]BYTE bBShift = 0;3 y- e$ p5 p6 X8 j
BYTE bGShift = 5;
) p! f& `9 a0 F$ {4 T: Q; ^; ~BYTE bRShift = 11;
8 W* }) }( \4 |6 E7 _$ q*/
4 h, R' I4 u3 y. q' iWORD nXSize = m_wWidth;
  l. W* p* m+ oint nByteAlignCX = m_wWidth*3;//(((m_wWidth * 24) + 31) & ~31) >> 3;& _2 h1 @# Z5 C/ Z$ x% Y$ s# q5 u
' e6 a$ l. u* v; u, a3 J, d- p
str_Text.Format("%s New File 16Size %d 24Size%d",strFile,m_dwImageLength,m_dwTemLength);
$ M6 {' t7 {: Q8 b+ XAfxMessageBox(str_Text);
* A9 M% x; B( i# M% t" F2 j+ }" e
& v- s9 B; V. W; W) d. e# qfor (int nYIdx = 0; nYIdx < m_wHeight; nYIdx++)
' q8 m% ~* c4 W5 H{
/ F/ C  E5 G3 W% o1 n# s- ~; b/ Sfor (int nXIdx = 0; nXIdx < m_wWidth; nXIdx++)
: V' c# {/ L4 p# N6 r) f! i6 x{
1 Y3 N) ]$ ]9 Z//分色处理/ i5 t+ `4 {) o0 `  B
bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] ) >> bBShift); % n1 _  C# }6 t9 l6 `' b
bsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bGShift) << 2 );
# v5 A& B0 g$ Z# x; V/ q4 K6 v4 DbsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bRShift) << 3);
5 [( F5 O, H' S$ M8 e/* bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwBMask) >> bBShift);
0 C7 h% N2 ^1 l7 ]  n; T1 ybsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwGMask) >> bGShift);
6 l  c& h& u$ U. i- vbsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwRMask) >> bRShift);5 `2 s$ g1 N) _! r5 Q( ]0 p
*/3 T" H2 t9 l$ [: L# o2 {& O
pOrgImage[(nXIdx * 3 + 2) + (nYIdx * nByteAlignCX)]=bsRedColor;
0 l% A( l3 M# C* s. o0 V8 s; fpOrgImage[(nXIdx * 3 + 1) + (nYIdx * nByteAlignCX)]=bsGreenColor;; s: g6 x% P' }4 Z' ]
pOrgImage[(nXIdx * 3 + 0) + (nYIdx * nByteAlignCX)]=bsBlueColor;( |, u( l# ~, L+ ?: H5 A) |
}: b) C. ]7 t3 Q" g1 \4 q
}3 y$ m2 }: n+ ^3 f

8 a8 Y) g2 |2 J5 w2 x  m DeleteFile(strFile+".bmp");/ L. m8 J8 Y1 O
    if(!m_SaveFile.Open(strFile+".bmp",Cfile::modeCreate|Cfile::modeWrite|Cfile::typeBinary|Cfile::modeNoTruncate))  A$ D- E1 T6 Z3 q" s$ Y6 X
{. M3 x- A# H+ a8 `: R
AfxMessageBox("建立文件发生错误!");
4 O! M- t, L9 u6 \! I0 e& H         return ;
" u  b( i# T; Z% I( k1 @. G }
. b% @1 |! A( f$ l  y9 \ m_SaveFile.Write (&bBmpFile,sizeof(bBmpFile));% c- _8 P* j3 w" O5 j
m_SaveFile.SeekToEnd();
9 A+ P, }# V3 S) z& ~( L+ l5 y+ |: G
m_SaveFile.Write (&bBmpInfo,sizeof(bBmpInfo));$ n+ {  j9 y% V8 a
m_SaveFile.SeekToEnd();5 t  [. [: y0 u! V; @

9 l+ m5 r! e& }- A. U; @7 w m_SaveFile.Write (pOrgImage,m_dwTemLength);' `7 D! F, b- w' q+ d# f
m_SaveFile.Close();
2 S- B/ d, H) s0 D* ]# k. E" |- Z2 B0 m( \* p8 F
if ( m_pwImage )
+ f! Y5 Z5 k% ~, Z( X {
2 T0 D! `4 ~1 N2 ]( V" z9 b2 u0 H delete m_pwImage;
8 \( T7 _' n" h' d3 S6 k2 T m_pwImage = NULL;
+ @) K( i( V. t6 \6 M }
7 d4 f% J( d. i6 t, ] if ( pOrgImage )
6 @8 ^4 A  q, b1 }4 R { 3 m4 Y! w& J8 T! |# ]0 c
delete pOrgImage;: J9 w- S8 u" y# N% i1 t
pOrgImage = NULL;
# y# {& H1 l% j  y/ V }( v3 J( ?* I, a$ d; t+ z2 Z! \
}
" n& q2 w9 }6 J3 T' C2 S& d/ n5 j9 Lcatch(...)& Y: s: ^9 S5 X8 t
{5 n4 [% E1 `+ A# f; ^5 u) P& z
}9 B% L) j# t6 x4 k7 ]9 b* z, u
}, }+ y9 [% Q# X7 T% s: p* f7 B) t
. j, X6 W: z: K' W; ~( s

. H" T* F" f4 K' C该代码只能用于研究和学习中。请勿用于非法途径。" R! v  f8 X8 O; K7 v

7 M% O4 r3 V# L6 ^; P2 W0 A& L呵呵。: D* U0 s" A4 \- e
希望谁能结决图像16->24的问题请给我发一份。不胜感激
9 l& @7 W# _+ U" t) i# Y2 W& {
9 r  H1 c8 p) \- l# T, Knewsoil@163.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-19 22:26 , Processed in 0.036994 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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