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

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

[复制链接]
发表于 2005-5-16 14:45:06 | 显示全部楼层 |阅读模式
  茫茫长夜无聊,结果下个了QQT的小游戏。2 G& f4 L/ b7 a  X
哎太幼稚的一个游戏。4 d* H9 x, s) M& s8 f
不过里面的小人物倒是有意思。于是就把察看了图片资源。8 u  O3 [. v) ]
2 P8 o1 l  v& |8 Y
呵呵~~有意思打开PAK保管发现第一个字节PK(ZIP的压缩格式),于是把名称该为.rar用RAR解压缩9 C7 b5 W1 S( \8 G6 v' V

' K% t& x4 i4 ^, u+ K。。。。。。2 p/ o( b$ z0 M  O  c$ Q: ^8 U) h$ ]
成功。8 @; T% h' \5 ]+ n

, T, Z% R5 y4 O2 ?, ~6 @& b' S% |  I) x- u
结果打开一看全是*.img的文件。没见过~~~~~) Z* ?8 `' r; ]# G  U
打开文件看晕 QQF.DIMG 什么文件格式。:( ~~~~~
  A9 h$ {1 n) Z$ a) F4 J/ u. y* g9 M1 U' l
于是分析了全部数据有点想16BIT的图像。但是有是24BIT的长度长14个字节。. [6 |  n( m5 D: a2 D2 F) {) T
  C( T5 |3 `$ L7 J% V0 P1 K) |
。。。4 z) _( M" N+ V$ x- ^& k; n
8 Y( F: u: V- q8 q8 L. I
哎不说了。给点代码自己去研究。不过有点问题。
4 R# w/ P/ R) j6 i
3 O, D: ~- A) V我搞不懂直接在贴到屏幕上显示正常。
9 y  |# h" \8 G4 n0 c' U/ N0 L: J8 _5 }7 h8 i, i" I1 t( B
写成BMP发现意思比较暗。。。" o1 T0 a4 i% Y2 n

% B# b) p' k9 f9 P3 f2 G5 u) y( c0 I$ V
typedef struct tagQQBITMAPHEADER{ // bmih
6 D/ s# |5 R' O+ @# j    char   szName[8]; //QQF.DIMG 标志   8
3 r, f% W; K) Z6 B0 |DWORD  bC1;       //65536
- w& }- P( D/ o/ \3 R+ v+ A4 v$ ZDWORD  bC2;       //24; ?. o2 L/ s3 R: o. u4 c
DWORD  bA1;       //
; J+ H& s7 S7 L; vDWORD  bA2;       //) U. Y1 z0 k9 T  }9 z0 h; L3 t$ y
DWORD  bA3;       //
' n$ t' N$ }  y4 r3 `/ v, ODWORD  bA4;       //
" c; u3 J/ {- i8 A    LONG   biWidth;   //宽- Y. \9 M# \. ^! ~& ~
   LONG   biHeight;  //高! Z7 q1 T1 O" O" ?; C4 f
   DWORD  biP; 9 f4 M" z* h* e/ J
   DWORD  biB;
7 \. P# u) t& q9 M3 m4 q7 H/ f    DWORD  biC;
: C" X% V5 [: s    DWORD  biS;
/ _3 ^# q4 H* `& y# D' g4 D( K* \9 M    LONG   biWidth2;  //宽0 n! I7 K( V& ?8 Q7 P/ S  I
   LONG   biHeight2; //高
: _1 j, }/ {: }; J6 B3 k- X    DWORD  biClrUsed;
* r6 \4 z: E" V4 J1 ^    DWORD  biClrImportant; # |3 Q7 K7 H6 w" U4 O) T
} QQBITMAPHEADER;
3 }) |/ Z, e: l5 q: e  g* J9 g. R
: a, U; \& R$ ]7 F: f/ k/ [
  g! l- Z- c6 j& n, B, |void CBmpToolDlg::ExpBmpFile(CString strFile)
4 S$ [; n+ j: K9 H: R/ [{1 _! I6 t1 E+ }7 C  _
BITMAPFILEHEADER bBmpFile;8 c* U" T/ t" c" R) k
BITMAPINFOHEADER bBmpInfo;
, p/ x/ l3 _9 zQQBITMAPHEADER   bQQHead;* C, Y  S/ d' M5 a# k
DWORD  dwReadSize = 0;. A* m7 o0 Y2 a: y. x7 Y9 H
WORD  m_wWidth;
1 w: F4 I9 U: s' w5 x; i& xWORD  m_wHeight;- g  y  a$ F9 r" |* t/ M; ]
DWORD  m_dwImageLength;/ F) U, `- Z( P# t
DWORD  m_dwTemLength;( C" Z& t: r' w, }
WORD  *m_pwImage;; L! x, M# S5 d" E# r( m. C3 ^
CFile m_SaveFile;
  q1 R/ w  ?; a. R1 k# zCString str_Text;2 Z% F1 K% d* z) @1 ?
8 l* q0 y  P' d( T9 ]
try
2 ]: N5 h1 U# |6 W: X! \ {" O6 S( j2 W! n& M% P9 i9 V. Z

4 Y5 r! e. f. {) @0 B0 M* DHANDLE hFile = ::CreateFile(strFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
4 P) G1 ~$ ^: E3 K% f5 ~+ g1 L5 MFILE_ATTRIBUTE_NORMAL, NULL);. E$ k* q( _/ u/ r# T. V2 |( d

; `% w+ b$ r* q. Xif ( hFile )9 o: X0 |' i  G5 m- G! q: y7 _- H
{; m8 z! j. i8 t/ n
ZeroMemory(&bQQHead, sizeof(bQQHead));
+ U& b1 d$ v, @ReadFile(hFile, &bQQHead, sizeof(bQQHead), &dwReadSize, NULL);
4 L( a. C# m" L' Q
: e3 y* x# t7 c- Rif(bQQHead.szName [0] != 'Q')return;
& N0 t/ B* q# C' G
4 `8 X1 }' ~  K; W9 Im_wWidth  = (WORD)bQQHead.biWidth;
' W6 Q7 m9 k+ y6 ]. y' vm_wHeight = (WORD)bQQHead.biHeight;
3 E- r9 n( c# z9 a5 h( d
4 q& O: V9 Y# ?1 zm_dwImageLength = m_wWidth*m_wHeight*sizeof(WORD);$ q$ m+ f8 @3 j9 {  W4 c6 c
* x- G; N9 l" W5 q# Z2 `+ O
m_pwImage = new WORD[sizeof(WORD) * m_wWidth * m_wHeight];
2 v# \5 w! U! ~8 n7 l( R- P6 a, V9 r' k. p% A  N
UINT nSize = m_dwImageLength;
! D7 D+ ?) k# [1 u6 y
0 |8 l, i' l8 B$ @) f+ f3 WReadFile(hFile, m_pwImage, nSize, &dwReadSize, NULL);
. H, m  H: W- m7 w" U1 O4 O
& E8 D: F5 N/ E; M7 hCloseHandle(hFile);/ F0 u* b$ s) D5 q/ \- ~6 S7 f$ d5 {
}
+ G! x" V% n$ n' r+ U& P$ Am_dwTemLength = 3 * m_wWidth * m_wHeight;
9 C( N. {! M# M* L) `! k//重新构件一个BMP头然后在写入到新的文件
* m- ]+ C( a1 t9 I/ j1 |
9 U; Q* W7 c4 BbBmpFile.bfType = 0x4d42;//'BM'- r$ _# {9 A' {) @% H  ~9 A
bBmpFile.bfSize = m_dwTemLength +  sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
0 T, D% `7 \/ n# w" X# h& \, {& pbBmpFile.bfReserved1 = bBmpFile.bfReserved2 = 0;; J7 }) F) s' O" t
bBmpFile.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //
* H$ f! D# _) L! h//% B& b% I) m. e, {
bBmpInfo.biSize = sizeof(BITMAPINFOHEADER); //以下是为BITMAPINFOHEADER结构赋值$ n4 l* ^7 E' J* M( y* J7 L8 k
bBmpInfo.biWidth = m_wWidth;. E0 _2 t+ w2 [5 |
bBmpInfo.biHeight = m_wHeight;. ]$ o4 m& k* @7 c" V
bBmpInfo.biPlanes = 1;
+ @6 P* c+ J0 g, s& Q" V4 [/ XbBmpInfo.biBitCount = 24;3 z3 g! G! S& e
bBmpInfo.biCompression = BI_RGB;
  F, T+ b5 h7 j4 ebBmpInfo.biSizeImage = 0;& T# `$ D+ \" {/ B! F. O  ]
bBmpInfo.biXPelsPerMeter = 0;/ y+ R+ D8 |" D8 }( V' b
bBmpInfo.biYPelsPerMeter = 0;
8 B, H5 |! G4 O2 f& O/ Q% F5 y& rbBmpInfo.biClrUsed = 0;
) L1 Q6 Z7 U; p) pbBmpInfo.biClrImportant = 0;: O% w/ @9 v! V2 d' i. ]3 ^8 s
5 s, I& Z$ z% l* L0 I" p* Q
///////////////////////////////////////////////////////////////////////////
* ]' w' Q. P/ U, c& Y8 Y  `% R//倒转图像数据
/ P6 q+ o# U0 G4 e. B% N2 U' e% G) e: XBYTE *pOrgImage;0 D5 b; p* w1 j: m: T& F/ ?
pOrgImage = new BYTE[m_dwTemLength];
$ x; U) X* o5 V3 _4 Y
6 r/ s0 P2 ?: ~) w, C; a3 k2 ]BYTE bsBlueColor, bsGreenColor, bsRedColor;4 H4 G! n. l( D* _0 S; F
//656
+ a+ C* i. r/ X5 Z$ [" U6 |DWORD dwBMask = 31;
' f8 |' Z. P7 e% K. p% K4 c5 wDWORD dwGMask = 2016;5 B" z  g  k( E- Y) w0 x
DWORD dwRMask = 63448;
' g7 I) B9 E( F, o5 j0 Z+ l8 z; D8 O
. U+ b' @1 `6 r; \7 n5 u  Q( UBYTE bBShift = 3;
+ r, a2 P7 C0 {, m# K5 Y9 w: B7 J# yBYTE bGShift = 5;
6 G4 F7 Y* k+ R) M$ J7 @+ [BYTE bRShift = 11;, t3 `$ N' q% H( `' o' U* A

  \9 o- [) i9 X9 B  }; S// wPixel = ((byRBit >> 3) << 11) | ((byGBit >> 2) << 5) | (byBBit >> 3);! R1 r: T; y: Q9 b
/*/ @: O" R4 S! a; H% B% {9 M
WORD dwBMask = 31;. q9 n. }6 h& h
WORD dwGMask = 2016;! }! {5 {) E4 ~' K& R& n. q5 H$ Q
WORD dwRMask = 63448;, e- n: {2 N% s0 B3 f& V" g7 a$ b
/ c2 [" W& {; G! V
BYTE bBShift = 0;
3 m2 D- N) f+ Y: t, K3 g/ C$ [BYTE bGShift = 5;
0 v1 Y' }$ f) R( Z5 q# NBYTE bRShift = 11;
6 g8 G1 R, j, P2 \+ e! S*/3 s' s" c7 ~6 n% a; B
WORD nXSize = m_wWidth;3 K8 f! V. F, j! U
int nByteAlignCX = m_wWidth*3;//(((m_wWidth * 24) + 31) & ~31) >> 3;" p# N8 y' j, z/ P( h: c2 e0 X  b7 R1 ?
4 X* `7 k" p; t5 q
str_Text.Format("%s New File 16Size %d 24Size%d",strFile,m_dwImageLength,m_dwTemLength);# a2 d% h$ J3 Z( g2 G
AfxMessageBox(str_Text);! L3 n4 ^; b. ^, \, x  X

3 C* t- f( R" l- P+ M) M$ S3 Jfor (int nYIdx = 0; nYIdx < m_wHeight; nYIdx++)" Q* t9 w0 T9 n5 B7 o( V  A
{
! y7 p; ^# o) k. Gfor (int nXIdx = 0; nXIdx < m_wWidth; nXIdx++)
" F$ S+ Z- C  x: O( Q4 x# k3 M{ ) L: G# q1 j! ?7 D' Z# y/ d- |4 l
//分色处理  i: B8 a9 i; ^* }1 ^7 Q1 i& w
bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] ) >> bBShift); 3 q9 P% m: T3 L8 `% H1 V: U
bsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bGShift) << 2 );) `+ Y% s- H) d
bsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bRShift) << 3);; B' n' ?1 f1 T! w+ ~
/* bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwBMask) >> bBShift);   M) R! H* }( D3 a9 B8 F, m
bsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwGMask) >> bGShift);) t- A% o% l1 A# ?) `
bsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwRMask) >> bRShift);- h! e" s. U/ i0 i
*/4 c  s  k9 Q& _/ Z. f
pOrgImage[(nXIdx * 3 + 2) + (nYIdx * nByteAlignCX)]=bsRedColor;6 a) h. L& D9 b) g
pOrgImage[(nXIdx * 3 + 1) + (nYIdx * nByteAlignCX)]=bsGreenColor;
4 D, E9 l' k9 h( t7 ~. j! npOrgImage[(nXIdx * 3 + 0) + (nYIdx * nByteAlignCX)]=bsBlueColor;5 G. X" ?  c' q4 n
}. g5 i, u7 u9 C$ [3 j" p3 O& ~- g; d
}
: f$ Y; U4 I  W% |  q1 k2 o' c. Q( s5 w7 }0 h) H4 L& m
DeleteFile(strFile+".bmp");
* z7 t9 r( @  Y1 f( `% Y- a     if(!m_SaveFile.Open(strFile+".bmp",Cfile::modeCreate|Cfile::modeWrite|Cfile::typeBinary|Cfile::modeNoTruncate))8 x8 O5 p# b- u1 l: M" n0 w7 f
{& D$ P; J5 c3 N
AfxMessageBox("建立文件发生错误!");
/ F8 q1 j2 M. @& o         return ;; w! x) ], A1 q' X# K0 i3 v$ r; P
}; B/ R' ]2 a. G) a$ w8 T
m_SaveFile.Write (&bBmpFile,sizeof(bBmpFile));
# J' o+ w% E! [: Q+ o$ B m_SaveFile.SeekToEnd();
; H' E. [5 x1 i
3 A) W- s# B. ]& }! G m_SaveFile.Write (&bBmpInfo,sizeof(bBmpInfo));8 _0 A8 b0 O2 m
m_SaveFile.SeekToEnd();
" E# A1 n" H: y' ?1 g2 `2 i1 L3 T
m_SaveFile.Write (pOrgImage,m_dwTemLength);
' D( z  R3 d8 C. K: [3 ^ m_SaveFile.Close();% Z% v8 z1 d/ _# q

9 r+ V+ g% K% w) J9 X6 ] if ( m_pwImage )
5 r$ A/ n8 a9 ]# J+ z  C { 2 O# u1 Z/ W# `1 |. t9 u
delete m_pwImage;
7 i2 Q0 @" C  C  j m_pwImage = NULL; ( D- q" U( o% Z7 E2 B6 ~
}
% M# {) c" q" {5 \8 {* M7 }! @% r, k if ( pOrgImage )
$ A8 B! H" P8 T' n {
" a3 c& C* `9 J- n8 f8 e; w delete pOrgImage;8 L, |( N- B# z. d
pOrgImage = NULL; 9 ]$ \+ {, P, X5 Y' T. g
}) i: H! |& x. L1 W% g& A" A
}/ i: X* I1 @1 J$ g8 L
catch(...)& K" w3 t$ r( ~$ g2 `/ n5 o; l
{) @& M1 m# I' @
}: m% G& V8 }) b- ]8 q, u& r5 {! H
}
4 E$ |: Z( K6 Z5 N( e6 C/ [7 G8 g. x$ ^2 B  c9 Y
) q1 d, ~  d: a3 i3 D9 ^2 m- |
该代码只能用于研究和学习中。请勿用于非法途径。
7 }4 j; f/ J, R0 ~0 A' |- S& [. k) V  O7 U; d. F
呵呵。
+ L% x; `7 L6 C希望谁能结决图像16->24的问题请给我发一份。不胜感激
1 i5 M# j5 K+ F5 `1 `
$ `" U. |) E. K9 ~; @+ ], _) Wnewsoil@163.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 08:58 , Processed in 0.019324 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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