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

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

[复制链接]
发表于 2005-5-16 14:45:06 | 显示全部楼层 |阅读模式
  茫茫长夜无聊,结果下个了QQT的小游戏。
# R. a4 A3 v% v6 a3 e哎太幼稚的一个游戏。. \6 E% C$ |# D4 b, j
不过里面的小人物倒是有意思。于是就把察看了图片资源。& m" w9 f1 r! `

7 F( \( F' Y/ I, S. P呵呵~~有意思打开PAK保管发现第一个字节PK(ZIP的压缩格式),于是把名称该为.rar用RAR解压缩
3 h; L" D$ a5 a" D$ S# [
- a! d9 N& S! w8 K。。。。。。; ]3 G4 S, X* N; q2 u7 [6 I
成功。
  H+ Y( S3 O4 p: @" w3 H& S" M( J# `% N& M

' l5 y- M; q6 A/ l: w结果打开一看全是*.img的文件。没见过~~~~~7 T3 m6 X1 F5 ]
打开文件看晕 QQF.DIMG 什么文件格式。:( ~~~~~  d5 f" {- [1 F/ h6 i
8 b/ e) Q) ?/ b- y5 I5 H
于是分析了全部数据有点想16BIT的图像。但是有是24BIT的长度长14个字节。' ]+ s: T0 P/ t3 }6 u
0 x0 f- T# F; r' ~! n5 E& o
。。。
8 a, ~  u" o7 M5 T2 R
- ?6 H+ ]! l. b, ]0 T* Z/ L" s6 q2 L哎不说了。给点代码自己去研究。不过有点问题。
1 X; r0 Y2 h# G8 @  r3 J# U+ q3 f' K) G; O' u& q
我搞不懂直接在贴到屏幕上显示正常。
# v4 z, _# \# ^
" k6 S3 j$ @9 c; X写成BMP发现意思比较暗。。。
  ~1 g1 r; t1 T& w" t, h' ]
7 F: I. P3 ~4 L8 u! T; A
5 z8 I2 Y! ]/ ~! S6 Q* z7 ytypedef struct tagQQBITMAPHEADER{ // bmih
, ?# m; W$ W( v" V    char   szName[8]; //QQF.DIMG 标志   8+ r8 I* k. m5 _
DWORD  bC1;       //65536
$ n( C3 G" h" e! A% @7 h: qDWORD  bC2;       //24  S1 q1 [* Z$ O( z- |3 W
DWORD  bA1;       //
% g$ o* B8 G# {$ t, A; rDWORD  bA2;       //
' a; U- j' j4 G, ]! ~DWORD  bA3;       //4 N/ u/ Z1 \  I, X% m7 l
DWORD  bA4;       //
" f# r3 i; a" W$ Z7 @) }7 E0 F    LONG   biWidth;   //宽
( N% F+ \- {& O    LONG   biHeight;  //高. v* S1 g: A& i8 d
   DWORD  biP;
# T4 O4 v0 p7 z2 h+ U% d- x    DWORD  biB;
9 W  R8 x* k; O5 v7 \8 C$ Y    DWORD  biC; 2 I# f- W) e! r: W9 `$ E$ f2 m/ \
   DWORD  biS; ) b9 ~: q/ z/ ^% @( K8 H3 L
   LONG   biWidth2;  //宽& l# s- D& Y+ r. N1 d) Y* O
   LONG   biHeight2; //高: y" J* w3 ^, W+ y' F
   DWORD  biClrUsed;
5 h5 w& N6 }! a- N    DWORD  biClrImportant;
4 J! \" f  b  C( V2 Q/ ]& ~} QQBITMAPHEADER; & B/ ]/ F/ M0 S' c6 r# f. J

# E% i" G4 ^8 [
) J& J+ F% t. F1 e9 z+ {8 @& qvoid CBmpToolDlg::ExpBmpFile(CString strFile) ( J+ C1 |- j. y# F. v1 \6 X
{; k2 Q: Z( U! G. Y
BITMAPFILEHEADER bBmpFile;
  U; k* L* C/ Q! MBITMAPINFOHEADER bBmpInfo;
+ |6 G5 I3 h; M4 o- ?9 ~QQBITMAPHEADER   bQQHead;, K  I: j2 |0 u; x& ?" s5 {- |
DWORD  dwReadSize = 0;# @5 e) m7 n$ v2 I
WORD  m_wWidth;+ d# N: l9 U4 I+ q. p, f/ c$ i
WORD  m_wHeight;
, H* D2 a* ?4 i* l+ VDWORD  m_dwImageLength;
; r) A8 Z" N8 d9 F  h6 \( vDWORD  m_dwTemLength;' F) ^" u: n0 q" B$ {) O2 ~/ l9 V
WORD  *m_pwImage;
' M! p. N1 R9 ?0 I' zCFile m_SaveFile;1 Z" _8 Z, y8 K/ Y+ e0 P0 ^7 h
CString str_Text;1 _# u( m, O$ e7 s, ~9 E& f

* i& b8 o3 P4 b0 G. Z try) T1 ^& k/ {3 Q. ^. T% q: D* E
{
5 V  y6 X0 B1 t- e5 R
9 B% f) p4 Z5 H/ L" e0 Z8 nHANDLE hFile = ::CreateFile(strFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,/ g0 e$ S' v5 M5 d8 `4 L
FILE_ATTRIBUTE_NORMAL, NULL);
2 l/ i! U; E+ K* \8 p3 g5 U; p; |& v- e, b' P
if ( hFile )
$ F* S/ k, s  ^: o7 k{5 N$ E9 d8 s0 [. x0 X/ ~
ZeroMemory(&bQQHead, sizeof(bQQHead));
, j2 }0 o/ [9 Y) m, i- P: d/ u0 z7 rReadFile(hFile, &bQQHead, sizeof(bQQHead), &dwReadSize, NULL);
5 K5 ]- j- d0 l8 e, v$ ~+ ?8 g/ V: w8 O! w$ v, Z, b  ~
if(bQQHead.szName [0] != 'Q')return;0 f% f: c( `3 m7 I0 o' @3 x
6 J4 E+ p% o$ W) W1 t! p, ?+ _% M
m_wWidth  = (WORD)bQQHead.biWidth;
1 W1 m  J, Z, C: q/ B7 Lm_wHeight = (WORD)bQQHead.biHeight;# @" p* ~2 B+ N- A. o9 i
, D( Z$ U! @1 Z: {  ?0 {9 f. v3 l
m_dwImageLength = m_wWidth*m_wHeight*sizeof(WORD);
8 ]9 s. c! r+ t) T: E! S! h4 Z: T  v
m_pwImage = new WORD[sizeof(WORD) * m_wWidth * m_wHeight];; h; E: v' G* {% E0 n5 w; A

- `* [' X$ Z. h1 i6 W/ \UINT nSize = m_dwImageLength;, N/ Q0 u7 t8 Y6 p: I6 T% U

9 z6 ?8 _1 ?3 q! [ReadFile(hFile, m_pwImage, nSize, &dwReadSize, NULL);  S$ v  x  v- I$ a3 F
' j# \5 x  j% X+ f% p* i3 u2 @0 z
CloseHandle(hFile);
, g7 k2 {9 z. }% W8 E}
! ^0 N9 K8 y! _0 k$ \6 om_dwTemLength = 3 * m_wWidth * m_wHeight;
# n8 d# M2 R5 k; F' S) M//重新构件一个BMP头然后在写入到新的文件* [0 p7 x; o1 b+ ^: t
, f0 D( @! o  x* W  S6 ?
bBmpFile.bfType = 0x4d42;//'BM'5 K, K7 L+ ^- I6 _  \8 h$ J" s
bBmpFile.bfSize = m_dwTemLength +  sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);2 w, }4 O. c. w! k$ v) w, s
bBmpFile.bfReserved1 = bBmpFile.bfReserved2 = 0;$ z" h" G/ N2 F$ D
bBmpFile.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //
% u9 Y$ u+ s% t+ o. ~; w//% W* j, i5 d  l# n
bBmpInfo.biSize = sizeof(BITMAPINFOHEADER); //以下是为BITMAPINFOHEADER结构赋值
# ?0 u; U7 u- A% U2 ]! c9 ^bBmpInfo.biWidth = m_wWidth;% ?) o4 Z/ I- Q7 ]1 c% I
bBmpInfo.biHeight = m_wHeight;
' [( h8 c0 V4 K6 z! c$ R) y3 i4 ObBmpInfo.biPlanes = 1;4 }* W& I* j& F3 ]: P1 j
bBmpInfo.biBitCount = 24;
5 [% l9 W: S2 I5 R/ m3 KbBmpInfo.biCompression = BI_RGB;
% q  K% f; ^8 c& M* w" K9 ibBmpInfo.biSizeImage = 0;6 R& L1 J7 H6 X3 u3 b+ K) f6 _
bBmpInfo.biXPelsPerMeter = 0;. a1 \( M. v) ?- V1 R9 o3 q  s
bBmpInfo.biYPelsPerMeter = 0;
2 O* J$ x% X8 lbBmpInfo.biClrUsed = 0;% T/ y/ e* X2 x
bBmpInfo.biClrImportant = 0;
, M! a9 I4 F; ]5 j' H; |. B. d& V
9 F/ s: d9 H% ^$ V///////////////////////////////////////////////////////////////////////////
2 P3 g0 I- j) Z//倒转图像数据
+ Q% p! }) S' k6 I5 HBYTE *pOrgImage;1 R" r0 ^  a% k# f7 P3 C+ y
pOrgImage = new BYTE[m_dwTemLength];
0 g. w8 n( D1 F7 P/ R. J9 I8 p3 o! a9 c% j* i  c
BYTE bsBlueColor, bsGreenColor, bsRedColor;
% d5 k+ E4 Y- r; L//656' u  X8 X* D. h
DWORD dwBMask = 31;3 e& X3 ~1 l; L; G/ G# g
DWORD dwGMask = 2016;
* e* S+ p/ B/ _4 V0 A% zDWORD dwRMask = 63448;
/ z4 o% U- D9 D3 f- ?4 H. A  k3 d- H; n' _% J! g5 n9 C# E" O. j
BYTE bBShift = 3;
* L$ [; }' N/ EBYTE bGShift = 5;
: H+ \9 ~. Y4 o/ _+ Z4 W6 ABYTE bRShift = 11;
0 j: k: P+ o. T% P* b: X: R1 Y: G
// wPixel = ((byRBit >> 3) << 11) | ((byGBit >> 2) << 5) | (byBBit >> 3);
* s4 U1 o* S: q4 @- F2 d- I/*
6 m, h8 O3 ^; I- ^% lWORD dwBMask = 31;
7 T7 B+ U  k7 h, zWORD dwGMask = 2016;7 }4 p; U: o! U+ [1 h0 J; e, w+ K9 \; C
WORD dwRMask = 63448;- `# Z6 N# |$ s  `% v3 s
; d! j( v, Y4 H1 f* [8 [
BYTE bBShift = 0;- i& u  g  p$ I; q! F) l
BYTE bGShift = 5;  ?- [$ `" V3 T
BYTE bRShift = 11;
9 c" c% G( X* b1 `- E7 G*/9 R$ Y- b  E; V& h# s0 K5 e
WORD nXSize = m_wWidth;- X8 [; f' r9 h/ n, i& }
int nByteAlignCX = m_wWidth*3;//(((m_wWidth * 24) + 31) & ~31) >> 3;$ `: x. \/ d# a/ o  a0 p' w; n

4 S  n* x. ^, q% ^str_Text.Format("%s New File 16Size %d 24Size%d",strFile,m_dwImageLength,m_dwTemLength);
* P) C& B( Q( F+ X; A' ?AfxMessageBox(str_Text);
% m9 m6 {6 P! c2 E/ ?& `. }5 [4 u  w) F6 t- L
for (int nYIdx = 0; nYIdx < m_wHeight; nYIdx++)! T% G! y8 k6 J; s4 J( c# T
{
' ?/ ]$ }" f$ F, ?( R) x7 c7 G) I, R8 q4 rfor (int nXIdx = 0; nXIdx < m_wWidth; nXIdx++)
$ [+ q4 |0 o: T( ^- x{
7 j; C1 B0 T* t0 C, ^//分色处理
$ j) y* `4 ]5 f6 P) I) xbsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] ) >> bBShift); " R" e) _, S9 n3 @4 R/ n* ]4 s
bsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bGShift) << 2 );
& z2 `6 {5 \. d1 [* ^0 VbsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bRShift) << 3);
2 U. y9 P# F# t2 Q+ Y/* bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwBMask) >> bBShift); 1 ]+ V6 U; _* G: q
bsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwGMask) >> bGShift);. ?: N. C$ i  r! c6 B
bsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwRMask) >> bRShift);
7 Y3 h  e, o+ w; i/ G( X/ e$ T. t*/, s/ \) L0 H* ^( `4 c) j7 x
pOrgImage[(nXIdx * 3 + 2) + (nYIdx * nByteAlignCX)]=bsRedColor;: `; Y9 s  E: j1 N- ^4 F
pOrgImage[(nXIdx * 3 + 1) + (nYIdx * nByteAlignCX)]=bsGreenColor;
$ I+ }! K% A8 ?7 X( W7 upOrgImage[(nXIdx * 3 + 0) + (nYIdx * nByteAlignCX)]=bsBlueColor;
( s# O3 ~7 |! A+ y) A}7 q; N) b$ \! U  ~' K) {% K
}( z0 R- g& ?5 T% D0 X! D4 k

; G  o# e3 ]) Z- I DeleteFile(strFile+".bmp");
' \) t6 n8 f2 l5 u; B, F+ s     if(!m_SaveFile.Open(strFile+".bmp",Cfile::modeCreate|Cfile::modeWrite|Cfile::typeBinary|Cfile::modeNoTruncate))# i: p# l; V% w2 p
{' E+ P( J3 P2 V: a* E2 l* C2 E5 m* ?! r
AfxMessageBox("建立文件发生错误!");6 d7 T; W5 Q8 ~5 \4 R3 d. G% D
        return ;
7 V- W! z& O/ `& D* q, h }
; V- z2 v! F+ p5 V: T' j: X) h m_SaveFile.Write (&bBmpFile,sizeof(bBmpFile));
2 |* T& d2 I# l4 Q" } m_SaveFile.SeekToEnd();6 _) {: S' n& t: R; F8 B
! r+ |) F9 _9 H+ ]" J
m_SaveFile.Write (&bBmpInfo,sizeof(bBmpInfo));
2 y/ P( r! A* H2 i# g  a% p8 e m_SaveFile.SeekToEnd();
. ]! z. P& i6 S3 }& W3 i2 R9 O9 g/ l- }3 z$ ]
m_SaveFile.Write (pOrgImage,m_dwTemLength);; r, }4 ~3 S; M; `2 }& T- b
m_SaveFile.Close();2 O8 R& }* |+ b$ m" i
& s% z; S9 D5 ~/ P: K5 y  u
if ( m_pwImage )
$ S; \/ p  v; k; [$ Z9 T+ u  v7 L { 7 C$ q" D6 c3 I8 f5 n, f  ?
delete m_pwImage;
1 j+ @( L- |4 C0 `% ^ m_pwImage = NULL;
9 R) r) Z/ F$ @4 |. ` }: ^- `7 j8 M8 W: t3 e) F
if ( pOrgImage )
9 E6 t3 y% m( K* o6 B1 F5 D' H { # P4 s" {3 [; U# e9 i  F2 u
delete pOrgImage;
! e$ X& e; I, U  |- F pOrgImage = NULL;
5 F( o: s, x. S }1 H8 N. F0 P3 n5 `/ F& [" x
}  F/ I' Y4 u# I. W1 j7 l3 Y
catch(...)
* t5 Q# w& h1 A. ]7 u2 K{( g5 [  f1 y1 x* h! {' d9 g6 E
}
7 O3 X5 u  }9 x/ `# i  U}* e/ q9 b- ^' k/ W
, s0 a3 _2 b5 f4 v  `8 ^! L6 J

' A9 h+ }# v" y该代码只能用于研究和学习中。请勿用于非法途径。
5 ^, U9 p/ C& D+ g
& p% W8 Y4 |/ M6 E  s+ O5 U+ J呵呵。
. y# d. z" G: a- ]# x希望谁能结决图像16->24的问题请给我发一份。不胜感激
; P7 `; x( t$ d) w0 ]& Y8 ^/ g( Q2 E  R2 q- a# m' Y, M" |
newsoil@163.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-5 08:48 , Processed in 0.014736 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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