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

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

[复制链接]
发表于 2005-5-16 14:45:06 | 显示全部楼层 |阅读模式
  茫茫长夜无聊,结果下个了QQT的小游戏。
4 u( @7 \" d" W$ b8 P2 ~哎太幼稚的一个游戏。) n; h9 m0 X( Y+ n
不过里面的小人物倒是有意思。于是就把察看了图片资源。% G% f$ O; R9 D: b. @3 ~4 H% ~& B

. \* k& Y& G# d+ D& i. Q& R呵呵~~有意思打开PAK保管发现第一个字节PK(ZIP的压缩格式),于是把名称该为.rar用RAR解压缩7 ?) N6 @5 A2 v( e# r
" x3 q1 m' H1 m9 T8 P
。。。。。。
( t0 W* z" w! L7 y0 v成功。) r( v  E$ C5 {
6 p* x# j1 r/ h$ s/ l; w3 y6 ?
/ j* d4 a: I! W% O3 m
结果打开一看全是*.img的文件。没见过~~~~~
$ i8 y5 w3 J' {8 O2 z0 a打开文件看晕 QQF.DIMG 什么文件格式。:( ~~~~~
' m/ Y+ M: A+ [; ~1 A% W
/ Y* P5 R& D% S: ?0 _5 h于是分析了全部数据有点想16BIT的图像。但是有是24BIT的长度长14个字节。
+ v6 C5 ~: g; D1 Z. y0 }
9 m2 r+ d* B# b) N9 ]. y7 _; ]。。。  Y5 {" ?& L: {2 _/ [

( z% r  _& n( I/ X# @哎不说了。给点代码自己去研究。不过有点问题。- a  g; q( h) _, t  W8 U6 Q7 r

$ Y' y2 Z" x" r我搞不懂直接在贴到屏幕上显示正常。# H& x+ z: o4 j( l% L) x2 q0 B

! J& n6 z; R3 ^) e# T% U2 T7 D写成BMP发现意思比较暗。。。% r! u+ k! @. E& V# w* ]8 Q+ f
- a& E" C, f% l6 n( n6 O6 r

, H! {/ i( G- m" [( q1 g: ptypedef struct tagQQBITMAPHEADER{ // bmih
& A$ y2 X7 N- o2 ~! ^8 f    char   szName[8]; //QQF.DIMG 标志   8( Y4 J1 D% u1 d2 |
DWORD  bC1;       //655364 M. G3 `' h3 Q! u- @
DWORD  bC2;       //24
7 @8 u' D, @& O- y4 VDWORD  bA1;       //
0 B. ?; F- ?- |5 b3 C6 i( {+ rDWORD  bA2;       //, E1 H/ _" e; W9 X# q
DWORD  bA3;       //- T3 S1 o5 X' a* b
DWORD  bA4;       //
- b9 C7 w: s# w4 C% F    LONG   biWidth;   //宽
4 A" q: I2 S7 R2 B. ]    LONG   biHeight;  //高. n7 J) f4 J, c2 g
   DWORD  biP;
+ p% X' L; A5 B: Y4 X    DWORD  biB; 2 g* O# w. j2 `7 _% ^3 ^& \
   DWORD  biC;
& t6 k* j& v, Q9 g: N7 \    DWORD  biS;
9 W  Q# G; \' I; v7 x    LONG   biWidth2;  //宽' C1 e4 n2 [1 f5 G; k" k
   LONG   biHeight2; //高
& n6 T) @# N4 m    DWORD  biClrUsed; 1 h! {. E7 t% @; ^  J
   DWORD  biClrImportant;
5 _" ]* F1 j) f3 T: c" a} QQBITMAPHEADER;
4 \% D9 c- O! J2 h. a. ~) m9 c$ d/ q8 C4 Q0 C7 B1 }1 V' i# N  a
, P1 Q& F8 p+ j% n. x
void CBmpToolDlg::ExpBmpFile(CString strFile)
2 h2 I  X% N' z{
& C* K* j# W3 ?+ H+ L7 |BITMAPFILEHEADER bBmpFile;
# h2 L" D; B% I% oBITMAPINFOHEADER bBmpInfo;- l% \0 v! W' H3 y8 A: J
QQBITMAPHEADER   bQQHead;
3 E$ k  [5 R1 E1 SDWORD  dwReadSize = 0;
) k. C+ Z) n. t: ]% h) H; p' B6 n/ JWORD  m_wWidth;
+ h, V$ O9 K  t$ XWORD  m_wHeight;
  n9 u* I- N: r. W/ tDWORD  m_dwImageLength;
. o! N, p0 M  z3 ~9 `DWORD  m_dwTemLength;
3 q. t" j) g: K6 u! fWORD  *m_pwImage;
& m3 f! i/ z# \' kCFile m_SaveFile;2 d" c6 E. D2 ^; N
CString str_Text;
, M! ]( y: z5 q% ?
9 y: U# K' F) d4 t6 a# u try. z: `* x) P/ r
{' \9 P3 f# c$ ^' }. V1 Y6 S3 n

4 ^4 B8 ~" b0 e- w% OHANDLE hFile = ::CreateFile(strFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
; h/ {- v2 y/ T0 cFILE_ATTRIBUTE_NORMAL, NULL);" C9 ?# w- r. f
* \+ u7 E, F4 y# b( q# X
if ( hFile )
/ G4 h3 `9 d4 x+ T1 v! t. u: y{
0 m9 m- ]$ H" `* r- z) W6 GZeroMemory(&bQQHead, sizeof(bQQHead));) c2 {6 s9 G, F) i+ X$ i: O9 z( q
ReadFile(hFile, &bQQHead, sizeof(bQQHead), &dwReadSize, NULL);
9 P! x0 _% u6 \+ X+ T( k2 G) j$ {/ n% P" x: ^) q( G
if(bQQHead.szName [0] != 'Q')return;
) [; c7 A  A  a5 j# Y
; `- l9 L4 i1 Km_wWidth  = (WORD)bQQHead.biWidth;( Z6 f3 V1 d4 C& Y2 A7 Y8 o
m_wHeight = (WORD)bQQHead.biHeight;- {* F' K  d4 B, N$ \( K- ^

: n& d# m0 K% Y' d, c0 j8 lm_dwImageLength = m_wWidth*m_wHeight*sizeof(WORD);% H8 e2 `% g. l

2 [" F! a) @" Z- h, ?m_pwImage = new WORD[sizeof(WORD) * m_wWidth * m_wHeight];2 {9 Y; ~4 l& K& Z
5 j4 K9 p9 n5 J1 `' v( O
UINT nSize = m_dwImageLength;% j: ?) F& `3 w! ?! B9 X& i$ W
# }3 h* z% K" g- T
ReadFile(hFile, m_pwImage, nSize, &dwReadSize, NULL);* o! N' u( I+ h% Z9 x
3 V' n* Y& r: T) ?. O$ E! a3 R
CloseHandle(hFile);* T0 _  X* f$ a& M8 H' D
}
$ B: x7 j( K7 \6 |, q/ qm_dwTemLength = 3 * m_wWidth * m_wHeight;
+ P1 q& D9 i7 F//重新构件一个BMP头然后在写入到新的文件1 G7 x7 s. m+ y# ^: e7 k- B* f* {
3 |( |6 b6 `& m$ S6 J9 D7 G
bBmpFile.bfType = 0x4d42;//'BM'
; X- M: U4 Z8 P8 b5 s' c5 hbBmpFile.bfSize = m_dwTemLength +  sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);. k3 z: D/ W$ e) o6 ~
bBmpFile.bfReserved1 = bBmpFile.bfReserved2 = 0;+ I& {$ {- P  q5 d( v+ }% m
bBmpFile.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //6 s% ?/ ~) g: k- L7 c' ?
//
) H$ R) k( b. _) ], o* ZbBmpInfo.biSize = sizeof(BITMAPINFOHEADER); //以下是为BITMAPINFOHEADER结构赋值
+ a# g2 W5 Z, u4 ]6 u& _bBmpInfo.biWidth = m_wWidth;7 X$ S4 K! w+ ~5 h. K7 ~9 W
bBmpInfo.biHeight = m_wHeight;
" C7 e1 F" g2 J5 H1 T' u3 h8 S8 u% CbBmpInfo.biPlanes = 1;
+ c3 b* L0 X! J) A/ GbBmpInfo.biBitCount = 24;
- ]7 u, X; o% U$ h: h$ n+ |bBmpInfo.biCompression = BI_RGB;
. ^$ q" v- w5 P8 o+ P1 J4 QbBmpInfo.biSizeImage = 0;/ _: x! Z0 K) F5 W: j. ^/ @
bBmpInfo.biXPelsPerMeter = 0;; R2 H4 ~% `9 \9 B$ V( a3 l5 P
bBmpInfo.biYPelsPerMeter = 0;
# A' x. P; p  Z$ UbBmpInfo.biClrUsed = 0;
5 ^4 ?- G6 R! q- t8 I! KbBmpInfo.biClrImportant = 0;( B: Q9 `! V! V6 N( R
9 D4 g. r0 X# I# Q0 a3 V5 G
///////////////////////////////////////////////////////////////////////////2 l+ v  C! g# V; H. P& a, E
//倒转图像数据7 [$ h9 G& x& L' C# u/ A$ u0 ~
BYTE *pOrgImage;
" |# n! r1 c2 s! t- H. V- XpOrgImage = new BYTE[m_dwTemLength];
+ z3 {. N) z7 o& T; u/ `; a. n! |0 t$ T- [) i% O
BYTE bsBlueColor, bsGreenColor, bsRedColor;. y% s/ ^: ]. ]5 q! ^
//656
1 s! S7 @( V$ b/ N  iDWORD dwBMask = 31;
/ v1 u: R- V4 e- _DWORD dwGMask = 2016;
/ t# w* t8 p& p; b1 P- q# y7 ^- [DWORD dwRMask = 63448;
8 D5 l" f9 O- S3 G* f: B/ t3 Z1 l0 D2 S" Z+ M
BYTE bBShift = 3;
. ]1 `% l, o" d5 s! ABYTE bGShift = 5;
  L3 A$ w0 j8 H# DBYTE bRShift = 11;
. [# r, T- R+ r. M8 n9 `) H# R& Z8 l- n6 i+ @
// wPixel = ((byRBit >> 3) << 11) | ((byGBit >> 2) << 5) | (byBBit >> 3);3 U* [2 R& V& L  g; @9 G5 c
/*
! U' `; Q7 k' v5 dWORD dwBMask = 31;
0 d. ]; }6 D2 _! rWORD dwGMask = 2016;
' E$ g4 a, `" X7 q5 Z* e# R2 _WORD dwRMask = 63448;
  W7 ?+ ^3 S  t+ H
$ j7 R! v+ _6 @4 P' F/ q  c! H, dBYTE bBShift = 0;# S! F3 E) q4 Q
BYTE bGShift = 5;- q/ \. Q/ |" h& H( q: G
BYTE bRShift = 11;
% x9 ~) a4 Z; P$ m# K8 Z! x*/
( I' T" R/ S$ D5 _2 B; KWORD nXSize = m_wWidth;
9 H2 B9 c6 k- ?( S- E8 R- hint nByteAlignCX = m_wWidth*3;//(((m_wWidth * 24) + 31) & ~31) >> 3;% T0 L0 g; P; E+ `) ^

1 A7 c- s; \9 @str_Text.Format("%s New File 16Size %d 24Size%d",strFile,m_dwImageLength,m_dwTemLength);
7 ^8 f; I' p! N  ~AfxMessageBox(str_Text);
+ V6 h( m- t- _9 F% e' \3 j( v2 }5 U* ]" ^7 x
for (int nYIdx = 0; nYIdx < m_wHeight; nYIdx++)4 R& }' F( Z0 j$ n# ~8 u
{
& ?3 B/ d, h  B* F2 L  Lfor (int nXIdx = 0; nXIdx < m_wWidth; nXIdx++)0 p% P* v! P3 W; |. e  c* y
{ + v4 A$ C' l( n3 z% a( [
//分色处理4 j, |; a( P% f
bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] ) >> bBShift); / G7 B- |+ w! }& k
bsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bGShift) << 2 );
0 Q' ?; ?( r1 FbsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bRShift) << 3);
! s  A3 V" I9 a' A3 q/* bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwBMask) >> bBShift);
9 N/ e8 Z! I* I$ Q+ f) Z' absGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwGMask) >> bGShift);6 {0 b5 E! M3 D7 ]/ E& _0 C
bsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwRMask) >> bRShift);0 O2 |1 u9 ?) C5 P! g( k% x; F2 g
*/5 l& s9 P+ ^7 p) ]0 H
pOrgImage[(nXIdx * 3 + 2) + (nYIdx * nByteAlignCX)]=bsRedColor;% n! G. U3 i% h, k1 H# @
pOrgImage[(nXIdx * 3 + 1) + (nYIdx * nByteAlignCX)]=bsGreenColor;
( J. O9 q0 ?' N4 u) k* PpOrgImage[(nXIdx * 3 + 0) + (nYIdx * nByteAlignCX)]=bsBlueColor;4 {9 G9 ?% G$ m/ U) t
}) I: Z. P( u1 L1 D+ @( A8 m
}0 I  _' i4 z0 u  B8 B/ ?5 K
4 I* I" `+ ^0 o
DeleteFile(strFile+".bmp");- l5 j& q4 ~* |0 E+ x4 p8 S7 G
    if(!m_SaveFile.Open(strFile+".bmp",Cfile::modeCreate|Cfile::modeWrite|Cfile::typeBinary|Cfile::modeNoTruncate))8 q( \! d6 }+ m. r5 e& [# P+ i
{
$ W( M9 Q4 ~# A& F: s AfxMessageBox("建立文件发生错误!");
9 o1 V2 B3 s: A' {. ^) a/ M         return ;
6 x0 D9 v9 C+ K0 B# P }4 S9 c: s# u, j' ~: b
m_SaveFile.Write (&bBmpFile,sizeof(bBmpFile));' @- m3 h/ v/ `9 g5 A* H- Z) F) }
m_SaveFile.SeekToEnd();% v$ C. t" l" Z" b2 M
  k& N. i; C& e5 n
m_SaveFile.Write (&bBmpInfo,sizeof(bBmpInfo));/ a$ ?7 {( x& `6 m) F' d9 h0 L
m_SaveFile.SeekToEnd();
' d: V& l2 q) l' u* e4 ^. r
' j( a  g' V) r& w/ V% X m_SaveFile.Write (pOrgImage,m_dwTemLength);
# I1 w* P& `( b  O/ Y  j m_SaveFile.Close();1 `, w2 f9 |4 t
2 E1 R, R, ?& C
if ( m_pwImage )
# ]. z2 m2 ?8 y0 H9 z { # g4 T. t/ Z) @9 B8 Q8 ~+ K
delete m_pwImage;6 a0 j! `. c9 H! t' [8 n
m_pwImage = NULL; 2 E7 q2 J5 z( `9 |
}
$ ^+ v8 c% _  }& ~( P4 e# x5 T if ( pOrgImage )' M9 {& F. J2 Q  [+ x
{ ! Z) H2 S% ]$ Y& U, W" k# C( r1 c
delete pOrgImage;' C2 M8 n- |: h" I
pOrgImage = NULL; ) X( \8 g( ^8 P
}8 h6 U5 j: ^3 \, L
}- F8 {4 K/ p/ x0 V- w$ R
catch(...)6 n# B( s2 ~4 |. }3 j" ~
{- _5 l! S' |9 \/ j' v1 n9 T
}% m2 Q, p7 v3 z6 p
}3 K7 N+ S4 q" Y- b
  J, `% f! }  d9 j+ N0 |9 q: v

3 p1 F. [  d, p% R该代码只能用于研究和学习中。请勿用于非法途径。% d6 `+ `  `3 ~( F8 W
5 |/ e9 U3 e* j: R2 s
呵呵。
  b6 J9 \& f, \+ l" p8 |希望谁能结决图像16->24的问题请给我发一份。不胜感激
# j( f3 i$ L+ |/ e7 N1 @5 }, o6 E" R) c5 s8 ?
newsoil@163.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-9 04:39 , Processed in 0.034627 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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