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

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

[复制链接]
发表于 2005-5-16 14:45:06 | 显示全部楼层 |阅读模式
  茫茫长夜无聊,结果下个了QQT的小游戏。
/ p9 ~; S4 P- Q% x8 F/ b, }7 G哎太幼稚的一个游戏。6 ~7 d0 j4 o0 F1 f( E9 z) P6 q
不过里面的小人物倒是有意思。于是就把察看了图片资源。
- W3 \8 n1 R( R. ]" d# w
& x" X6 o" e/ G) J' t/ r呵呵~~有意思打开PAK保管发现第一个字节PK(ZIP的压缩格式),于是把名称该为.rar用RAR解压缩7 N4 H5 @. U! R' E

$ M- ^, v" O) d3 U。。。。。。
: n% ?4 ~" }: N. S% M成功。
, T. ?' {. V1 z. v" U3 T
( `2 Y: D" }3 g, N+ h2 K' o# |+ E1 G8 n3 ^! ?, y, E
结果打开一看全是*.img的文件。没见过~~~~~
5 `( ]( R. g! b" R# [( {打开文件看晕 QQF.DIMG 什么文件格式。:( ~~~~~1 ~. B7 y) t7 O( P3 t

, P2 W# |7 m7 G2 U. }于是分析了全部数据有点想16BIT的图像。但是有是24BIT的长度长14个字节。
1 _  e8 I$ m3 Z# P% K1 A
# i) a- X# Y9 e1 e7 c" ]8 p。。。
. r8 S' s" t. F( X6 f* J. J2 i' ?: ~8 e2 i$ S3 O
哎不说了。给点代码自己去研究。不过有点问题。* I% Z/ Z) v" u

  M  p; `( z3 b, r* S我搞不懂直接在贴到屏幕上显示正常。- D/ q5 \8 A  |/ H# m
; a$ m3 D7 A5 P( D. o6 Z* c8 Q
写成BMP发现意思比较暗。。。& U$ k5 i2 E3 e: O, {2 @
, c# _& E3 b2 [" U4 }! g7 z0 X
. E8 Z% G8 j. U9 X* X* D" S/ Q
typedef struct tagQQBITMAPHEADER{ // bmih ' _# d4 d* ~$ s; x8 m
   char   szName[8]; //QQF.DIMG 标志   8+ I# n7 N) u0 n4 J+ z$ @
DWORD  bC1;       //65536  S/ s6 ]2 o: Q/ h' p) v% W
DWORD  bC2;       //241 O& a0 D' L8 {. k* Z
DWORD  bA1;       //
) P$ e6 J/ N/ c' s' c; CDWORD  bA2;       //8 j0 U, p5 p$ m& G1 \: s/ M
DWORD  bA3;       //& g, j/ E" Z3 G4 c' O' ^, ~
DWORD  bA4;       //
" m+ |7 K8 v0 R% O+ p    LONG   biWidth;   //宽0 E4 }4 Z- W2 K% Q
   LONG   biHeight;  //高
7 L! j" [; w9 ~$ s1 V0 t8 C    DWORD  biP; / n4 g- R8 T  P& H/ I: R( N
   DWORD  biB;
3 e; J6 x3 w* Q, T+ U( Y) ^2 E    DWORD  biC; 2 }" ?5 g7 a- y; [
   DWORD  biS;
7 n1 _# }: C5 m    LONG   biWidth2;  //宽
! l6 y: ^+ R1 N9 w8 Y: M    LONG   biHeight2; //高3 d% `5 m& ^; |6 X& v4 V& N
   DWORD  biClrUsed; , k9 _8 I( o/ ^( ?
   DWORD  biClrImportant;
9 h  j. G, G5 o$ A; P2 x: v} QQBITMAPHEADER; ' z$ D# P: D- c$ Q

. `: p$ n7 }/ c% a9 ], C4 A4 R8 z& {; c' r  Z
void CBmpToolDlg::ExpBmpFile(CString strFile) $ ^# A) Y; \* x* x0 k* I" B- w
{
' _8 Z* C, y, p' P6 b& @/ a9 R0 aBITMAPFILEHEADER bBmpFile;
& K- @; @( J# {& ?BITMAPINFOHEADER bBmpInfo;
0 u6 Q+ x! v/ h! q! A; MQQBITMAPHEADER   bQQHead;
0 v: X5 n* @5 [5 q+ S1 O: fDWORD  dwReadSize = 0;
/ o- K4 e" \8 e5 qWORD  m_wWidth;
5 y6 }; v$ A) M/ WWORD  m_wHeight;
; c2 F' M7 a9 a" a" D+ iDWORD  m_dwImageLength;
9 U$ ?. \" P- `) X6 e8 ZDWORD  m_dwTemLength;! a+ {7 l% ]$ \$ D  S5 i; n/ F+ n
WORD  *m_pwImage;1 F. X/ I8 h% y" X( v7 }3 W. G
CFile m_SaveFile;
' Y  Q$ z0 a6 s$ l& C/ A; {  {CString str_Text;
2 _7 A- o" {: C  ~  a1 E
" [: F: J. D) }/ m try
) R0 V9 u0 g  k( g/ } {% ^: ~* o) I. W4 G

0 \& g" X% ~: T. e& \HANDLE hFile = ::CreateFile(strFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
! l0 I; G+ y' D$ R! kFILE_ATTRIBUTE_NORMAL, NULL);
* z5 i) E. i) t5 m3 n( d' L% |. q
if ( hFile )* E! |7 Y# R1 X4 N; W8 Z% c
{7 C- X" f3 O; o! v( _
ZeroMemory(&bQQHead, sizeof(bQQHead));! D5 z0 ?) w; F
ReadFile(hFile, &bQQHead, sizeof(bQQHead), &dwReadSize, NULL);# T! R  c- \4 a6 l% ^7 g4 L

8 |2 }% |3 ^; P% ^6 ~( J9 H& Aif(bQQHead.szName [0] != 'Q')return;( p. _1 M1 F6 U; |9 u

2 a% w4 i+ F! G% @m_wWidth  = (WORD)bQQHead.biWidth;/ m1 i/ u+ W0 v; m" V
m_wHeight = (WORD)bQQHead.biHeight;
/ F, _, p$ W* c3 o
! d5 J/ j/ W/ xm_dwImageLength = m_wWidth*m_wHeight*sizeof(WORD);
3 _+ J4 s2 \) Z2 k) Q9 k  v! c9 i# X# \7 X4 j
m_pwImage = new WORD[sizeof(WORD) * m_wWidth * m_wHeight];
5 k2 I( p( i' E, A
! K' H6 d% m/ x8 B  q6 nUINT nSize = m_dwImageLength;
* o  X$ m) U* ?3 m' P8 `8 U7 _& D- z8 e) Q
ReadFile(hFile, m_pwImage, nSize, &dwReadSize, NULL);
2 J+ ?2 W$ A" w% `$ \. l# Q6 [3 z$ q+ C" }$ m4 t( i
CloseHandle(hFile);5 q/ m. x8 Z2 C
}! ~& }9 D- T& c, B
m_dwTemLength = 3 * m_wWidth * m_wHeight;0 Y7 m, c6 f! E5 S$ z9 n# s
//重新构件一个BMP头然后在写入到新的文件
) G  d. |3 }7 u; A- s
4 h6 B2 l; c$ G( }bBmpFile.bfType = 0x4d42;//'BM'
; c  T+ h5 L0 [bBmpFile.bfSize = m_dwTemLength +  sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
; s3 ?" {: s/ gbBmpFile.bfReserved1 = bBmpFile.bfReserved2 = 0;
. P  \% ?5 \' @0 ^! vbBmpFile.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //
/ T3 N2 O, t' b2 P8 a& Y! ?) n//* z6 a9 p* f6 l* Y+ o
bBmpInfo.biSize = sizeof(BITMAPINFOHEADER); //以下是为BITMAPINFOHEADER结构赋值
5 e0 ]  q! f* E2 ZbBmpInfo.biWidth = m_wWidth;1 I9 \+ b, Q: T8 b) U. A# O
bBmpInfo.biHeight = m_wHeight;
8 N; S  a5 ^' b+ s6 ^bBmpInfo.biPlanes = 1;
; \' d6 |8 h6 c9 w/ HbBmpInfo.biBitCount = 24;5 m+ J  y6 p2 J
bBmpInfo.biCompression = BI_RGB;
) t! n" Z  J  ?: |8 T1 h1 ?9 S4 IbBmpInfo.biSizeImage = 0;/ I) a$ k1 a: H7 p) n
bBmpInfo.biXPelsPerMeter = 0;
5 K( F  R6 D  z& X& lbBmpInfo.biYPelsPerMeter = 0;5 J5 E/ F) j" W) `
bBmpInfo.biClrUsed = 0;
& u0 h' X0 a2 [0 v0 cbBmpInfo.biClrImportant = 0;
9 B1 v8 Y; P; i: s. V
( S7 x' ]  g' b9 F2 E7 ]///////////////////////////////////////////////////////////////////////////% `4 o& x: e6 t% k
//倒转图像数据9 s6 B! R- P, J, Z
BYTE *pOrgImage;
4 B8 P' |4 p! A$ j1 q8 |/ gpOrgImage = new BYTE[m_dwTemLength];: q! l8 V* ^* S0 S. d. G, x, S
$ T1 y# z  K+ T" v) l
BYTE bsBlueColor, bsGreenColor, bsRedColor;9 R" T. t3 }0 r
//6560 j8 @+ W+ Z1 f" P! z6 z0 v) z) j
DWORD dwBMask = 31;+ r3 I; R& E, N. U9 C1 A
DWORD dwGMask = 2016;
" B2 _$ s. h# BDWORD dwRMask = 63448;+ d) T# S# L, i* k, r% G

: a6 f: T& d0 B, Y# D) fBYTE bBShift = 3;2 Q' V7 N% t3 }, j
BYTE bGShift = 5;
+ C2 E+ _1 G$ |7 c' rBYTE bRShift = 11;
: i2 k2 G9 }5 w( D0 Q1 t; b2 g; r7 k3 J
// wPixel = ((byRBit >> 3) << 11) | ((byGBit >> 2) << 5) | (byBBit >> 3);
! `  R# Z* e+ P! x# A' P  ~/*
5 s  z' d% ]  C2 M7 h3 A0 ?WORD dwBMask = 31;4 A" I) W6 ^  D, \9 h
WORD dwGMask = 2016;
' n0 v) r; y6 y/ xWORD dwRMask = 63448;% h9 Y% y; K! H2 I" ^

" n& l6 w) R- Y- oBYTE bBShift = 0;. q1 Y. |3 b" \/ B/ n2 t# s) U1 e
BYTE bGShift = 5;+ |' ~3 w8 n8 [7 F# @- k
BYTE bRShift = 11;
/ ]0 Y( {9 @+ C. `# l5 k*/3 a0 m9 Z0 ]' t" X- M) b
WORD nXSize = m_wWidth;
1 [# v8 }- @# E, Gint nByteAlignCX = m_wWidth*3;//(((m_wWidth * 24) + 31) & ~31) >> 3;
6 [7 c, V5 |( B% h, y0 b% V9 l& i4 t* ^( w" n
str_Text.Format("%s New File 16Size %d 24Size%d",strFile,m_dwImageLength,m_dwTemLength);
; w. @- `; J: H' V% _( C3 PAfxMessageBox(str_Text);
' S$ f( f: n  {  E$ k" N3 _6 w/ [
: F0 Z: \1 H6 @/ ffor (int nYIdx = 0; nYIdx < m_wHeight; nYIdx++)
. ^8 m% J) O, Y5 w1 `+ K{
$ g* i/ u. O7 P( [/ ?for (int nXIdx = 0; nXIdx < m_wWidth; nXIdx++)( K. r  M* A) X5 C! ]% P
{
6 Z- I. w5 j, j" {//分色处理
) ?1 r8 f  ^  R  a2 H- g5 p2 absBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] ) >> bBShift);
/ l# D8 q+ }9 ?$ Q: {( a& @+ G, ^( obsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bGShift) << 2 );1 m6 f1 {3 w2 Z9 [
bsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bRShift) << 3);
" e3 I1 D5 o$ Q6 o& s/* bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwBMask) >> bBShift);
" R* R- B' I& r+ NbsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwGMask) >> bGShift);) j8 @5 |4 H4 t; M, R3 B4 e. E& h
bsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwRMask) >> bRShift);
# J8 h  x+ _* q2 ]- K*/0 C) O0 u9 _# a" n8 T
pOrgImage[(nXIdx * 3 + 2) + (nYIdx * nByteAlignCX)]=bsRedColor;
1 N0 `4 [4 _7 F# l) @6 H' x4 P8 F+ \pOrgImage[(nXIdx * 3 + 1) + (nYIdx * nByteAlignCX)]=bsGreenColor;
; g. c6 B1 L3 P) }) ^pOrgImage[(nXIdx * 3 + 0) + (nYIdx * nByteAlignCX)]=bsBlueColor;
  h3 S6 S: P" @: Q( @& p$ q% q, p2 e# S}) X* s' q2 x7 W- h' o
}
3 ~; d5 F4 S( `- b- ~$ S# [: E$ D- p/ `$ h  Q8 `+ O3 o( @" q
DeleteFile(strFile+".bmp");
! j! Y! e0 a( z9 ]8 h+ m     if(!m_SaveFile.Open(strFile+".bmp",Cfile::modeCreate|Cfile::modeWrite|Cfile::typeBinary|Cfile::modeNoTruncate))( q. R+ A: S+ o: a
{
/ N) `' j) P5 e0 P$ E; y AfxMessageBox("建立文件发生错误!");
  j0 H% G5 T7 K6 m: p1 \& s4 P$ ]         return ;' g5 |- W- Y' `5 i
}
5 R9 l+ }" s  m$ O; X+ w1 y9 ]: ` m_SaveFile.Write (&bBmpFile,sizeof(bBmpFile));
$ f% G& A2 l; G m_SaveFile.SeekToEnd();
1 G* p  \" J9 d, h9 e
$ [9 `- Y7 e6 d$ T" f8 J3 Q/ q( Q m_SaveFile.Write (&bBmpInfo,sizeof(bBmpInfo));
% r' L8 L) p5 u- Y3 m3 M4 C m_SaveFile.SeekToEnd();6 j/ H3 {1 j  e& d8 L4 H

" \9 ^; V6 `3 i5 W8 k* ? m_SaveFile.Write (pOrgImage,m_dwTemLength);
) C# d; |$ p$ x' G+ m m_SaveFile.Close();1 A; C2 C. m: `- @# {

* W# U5 J  w! }0 ?; a if ( m_pwImage )
, v0 J. o( O0 ~% g { ; U6 Z! b) `+ q
delete m_pwImage;- a% V4 I' Y" p4 d
m_pwImage = NULL; # W' K8 r: W, g6 m: N# n$ O! ?
}, n; T' @" s+ b, Y+ |, G8 A
if ( pOrgImage )# d( o2 o' c4 s6 ?
{
$ {% G2 O$ y+ [9 ]" C9 i6 z/ q+ f2 F delete pOrgImage;2 ]4 C* [6 Y' o2 a% F, ~* `
pOrgImage = NULL; ! T# e, E3 Z+ k* l1 t
}
3 R$ c7 q% g0 m+ r+ q}' h9 t9 L* o% u; h7 v1 ?  m
catch(...)
% H( R& e! O, N2 Y: u" ~{
9 }& T6 p# R% w; C}
1 T# u4 f5 F5 }5 j}0 b6 p/ _1 Y" y  k! }. |$ Y$ {
" q0 i7 Q% g; r+ \

$ G# Y) X6 ?5 q" U该代码只能用于研究和学习中。请勿用于非法途径。  h% Z, }8 X! ~7 i, m) T

& |( W: |5 R# `/ H; u呵呵。
* v: k8 |6 ?; I5 T  ^希望谁能结决图像16->24的问题请给我发一份。不胜感激0 @9 ~! \; Q; v- j5 ]4 S/ X& ^. j
  j$ J7 i9 L+ x* D: C/ h8 s+ u
newsoil@163.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-9-30 13:16 , Processed in 0.040535 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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