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

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

[复制链接]
发表于 2005-5-16 14:45:06 | 显示全部楼层 |阅读模式
  茫茫长夜无聊,结果下个了QQT的小游戏。
3 G7 u2 ]' w. g$ K哎太幼稚的一个游戏。( f* A5 T& ^9 v: N, F  {
不过里面的小人物倒是有意思。于是就把察看了图片资源。
3 |1 W6 E% q/ ~; C) O% m3 \$ Q: [" R. p
呵呵~~有意思打开PAK保管发现第一个字节PK(ZIP的压缩格式),于是把名称该为.rar用RAR解压缩) @5 [; O) X* y8 D* ?  O( F

* }5 U# \/ v* s6 \。。。。。。
1 T3 a" l( a5 j1 n/ o  \7 \3 Q成功。! [' z: v; [/ C( @
1 G. Z" v6 ^5 N5 X, I( b" A7 M
, {5 l8 s% o1 ?( ~
结果打开一看全是*.img的文件。没见过~~~~~5 e  D# s( j7 u
打开文件看晕 QQF.DIMG 什么文件格式。:( ~~~~~0 t" F/ J1 m5 r

* l& a  u- z& w  E0 H于是分析了全部数据有点想16BIT的图像。但是有是24BIT的长度长14个字节。# V# t, r: I+ @: I0 t9 }

  k2 D  a" W7 K8 c1 R1 W。。。
% n* B+ K: M1 D1 n0 \# w  l+ S6 q! F0 F5 ^/ U/ v% t1 _$ T
哎不说了。给点代码自己去研究。不过有点问题。' I8 E/ @# }+ t) b$ W  G

, y- d# u! s/ n& g; P: n3 ~. k我搞不懂直接在贴到屏幕上显示正常。
; u: n. s' U+ e% `7 {( L; V: T% A- v: ]
写成BMP发现意思比较暗。。。
! ^3 a# W; w+ j1 ^# s  c
0 T' ]7 x# `# q) O* V1 M4 W; S2 U' s8 U3 I
typedef struct tagQQBITMAPHEADER{ // bmih
: w3 x- L8 y% J! Z, Q  u0 ]- ?    char   szName[8]; //QQF.DIMG 标志   82 S, ]6 s3 H3 a+ D3 a. [9 Q
DWORD  bC1;       //65536  Y. g* x1 Z1 }* Q8 M/ Z
DWORD  bC2;       //24+ R2 B" I6 h( O3 D+ g# N
DWORD  bA1;       //
, y2 C! c8 M5 @4 TDWORD  bA2;       //$ }% v  ]% c4 Q; z+ D
DWORD  bA3;       //
. j' K9 u; ^) i4 G* cDWORD  bA4;       //
; U" T( ~1 ^9 D- x4 p2 F    LONG   biWidth;   //宽4 p' X+ e# [0 E3 h% x
   LONG   biHeight;  //高4 y  w/ ~( P7 t) ?( b4 f
   DWORD  biP; / C8 v& v4 O. \8 Z1 P; f, Q- Z1 N
   DWORD  biB; : ?1 ?- w1 ^6 O8 e: f, d
   DWORD  biC;   k. a3 L+ {6 q# [5 l, x! c
   DWORD  biS; 2 m0 x; v% }( a5 x0 k
   LONG   biWidth2;  //宽8 G  c* w3 B% k, {5 a) a
   LONG   biHeight2; //高
: r4 d5 b9 R( Z" {7 [+ G9 u. [    DWORD  biClrUsed;
2 p3 R& x5 _+ m/ x% c$ ]: z    DWORD  biClrImportant;
, ~7 k1 e1 T) D- s1 d/ Q7 r/ T3 f: b} QQBITMAPHEADER; 9 X( {: g  L7 M, Q6 N+ b( k2 Q/ c

/ U9 x' {2 X( d0 d" c6 ^4 q' C. e( G4 b4 f4 \# W
void CBmpToolDlg::ExpBmpFile(CString strFile) - C3 J# Y! \- F, D; Y
{" V* v  ^7 O# W# O+ ~6 y& x
BITMAPFILEHEADER bBmpFile;! q  d; O) p9 k3 s- g, F+ m4 q
BITMAPINFOHEADER bBmpInfo;: Z; ~' C' Y) k9 p: m$ \
QQBITMAPHEADER   bQQHead;
# m) O2 }4 f  M& o* p+ b4 FDWORD  dwReadSize = 0;
5 w* g2 C# \# z* NWORD  m_wWidth;
, N. T/ |# Q) |: z9 m/ D' UWORD  m_wHeight;
5 X! e/ T& Y8 C/ LDWORD  m_dwImageLength;
- R* ^- X9 C, q5 YDWORD  m_dwTemLength;
. x( g+ a' g( c! m  R" R2 cWORD  *m_pwImage;
2 @; v" n- o) L5 X8 NCFile m_SaveFile;
1 _/ E  Y. `0 W) M7 Y+ MCString str_Text;
, X9 |9 ^* e2 }" H5 K0 ^4 x. R6 ^
try( ?' _* ]; o& R- ^9 @3 \" D& d
{: W5 F/ b) B! M3 q8 G, i

' u3 A. K& U9 J0 QHANDLE hFile = ::CreateFile(strFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,' m) T2 S8 s3 G+ x1 L! l  m
FILE_ATTRIBUTE_NORMAL, NULL);
$ p% N+ c9 G& ^" j+ |) Q" y6 W! E# H* L$ }' {
if ( hFile )3 r2 s) r( B+ m% T' C
{
: b+ f( A" v( k; PZeroMemory(&bQQHead, sizeof(bQQHead));' ~" C5 E0 ^# m" S, F
ReadFile(hFile, &bQQHead, sizeof(bQQHead), &dwReadSize, NULL);
: C% R5 }' U% P$ F8 x/ u7 ~' Q! |
, t/ k- Q2 p! iif(bQQHead.szName [0] != 'Q')return;
- M) C) `8 I3 X5 I+ e  S% z1 x3 W* Z
/ V! W7 c; I& [3 Q, r9 jm_wWidth  = (WORD)bQQHead.biWidth;2 `+ ]- G& Z" I: k* B" d1 J+ Q+ i
m_wHeight = (WORD)bQQHead.biHeight;2 D- j5 n1 S$ X3 l" z6 O

2 K. E0 J# Y& K* N2 ?9 Nm_dwImageLength = m_wWidth*m_wHeight*sizeof(WORD);/ x7 s8 M# q: C' W& H& A6 q' H

5 t& K  W" u7 X2 T9 am_pwImage = new WORD[sizeof(WORD) * m_wWidth * m_wHeight];2 o6 u6 a, x6 t, M5 ~3 \

+ d4 F: ]& `* F, J* oUINT nSize = m_dwImageLength;$ W, L. x# L( @. @8 z0 Z

5 S! h. ]' P+ jReadFile(hFile, m_pwImage, nSize, &dwReadSize, NULL);0 L- f7 d- p) [
- t- r3 Z4 g1 @. [# @
CloseHandle(hFile);6 K) @! z5 U( W& T1 R" j
}
9 Z3 }/ u7 b' y# }: W. fm_dwTemLength = 3 * m_wWidth * m_wHeight;, G3 \% T) i) }, {8 X) w
//重新构件一个BMP头然后在写入到新的文件
1 a/ m( U+ S# j7 b8 {. z9 f9 F+ a9 N$ v7 f+ Z* V
bBmpFile.bfType = 0x4d42;//'BM'
$ I! s- k  R# e0 Y9 g; JbBmpFile.bfSize = m_dwTemLength +  sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);+ q8 C  n# k, s& p% N9 ^/ k  w
bBmpFile.bfReserved1 = bBmpFile.bfReserved2 = 0;/ v$ \; h4 L0 N. W7 ~
bBmpFile.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //9 ~' F8 t2 O; @3 ^8 q
//
. P( {) y3 ~4 CbBmpInfo.biSize = sizeof(BITMAPINFOHEADER); //以下是为BITMAPINFOHEADER结构赋值
7 |+ Z! q+ J( V- b' k8 J+ b& O) R, S4 ~bBmpInfo.biWidth = m_wWidth;
0 g" [) A$ X5 Y$ S! _9 l! I" k/ mbBmpInfo.biHeight = m_wHeight;; {& M- O8 ~9 I* _1 k7 a6 O
bBmpInfo.biPlanes = 1;
+ Z2 W, l3 b9 n# T% e" vbBmpInfo.biBitCount = 24;' z/ d) Z+ ~2 A
bBmpInfo.biCompression = BI_RGB;+ a* j- Y( M1 ~# D0 I( p
bBmpInfo.biSizeImage = 0;
) p1 y6 r0 J% ^/ EbBmpInfo.biXPelsPerMeter = 0;+ m( a' c" {/ T/ H8 ~
bBmpInfo.biYPelsPerMeter = 0;
; o  j9 l$ B" s/ `( j1 ~3 sbBmpInfo.biClrUsed = 0;$ V# ?  G* J: L% Q0 b
bBmpInfo.biClrImportant = 0;; L5 |8 w! O* L" ~; U

& q* B- H; ?" i///////////////////////////////////////////////////////////////////////////8 ~, N+ ~& \9 R) J5 D) \
//倒转图像数据
8 |( V' ]2 ~# s; f& M) m2 `BYTE *pOrgImage;
6 z9 `, F$ F( x2 K- {% lpOrgImage = new BYTE[m_dwTemLength];
8 Y+ b1 C( m' ^, v- X# t9 ?
4 v, |7 l$ x9 S/ q/ PBYTE bsBlueColor, bsGreenColor, bsRedColor;
. S- @+ x6 W% R" E4 k//6568 v' c. Z$ A* }4 [9 t
DWORD dwBMask = 31;
; u5 r* G' @7 {+ l8 DDWORD dwGMask = 2016;) O6 K; @6 L: v, f4 N
DWORD dwRMask = 63448;
" d( I) u' f/ I+ S9 i& _
( J$ z" S+ Y1 j/ s2 n: i8 c8 x2 _BYTE bBShift = 3;
. K5 L0 k* a+ }0 xBYTE bGShift = 5;
5 D) {! J/ e- y- Y/ e0 sBYTE bRShift = 11;7 n$ x7 d1 \# `

5 L0 W' Q- W0 X4 X& L! U// wPixel = ((byRBit >> 3) << 11) | ((byGBit >> 2) << 5) | (byBBit >> 3);
3 J3 {( N: T: \5 e0 P9 o/*
0 K+ z8 H+ b8 Y! lWORD dwBMask = 31;! U! w/ [' M% n/ s2 Q7 m
WORD dwGMask = 2016;
1 l4 a$ ]8 W( m1 b: U! [WORD dwRMask = 63448;, \$ t( y: S6 P# L" S& ~3 i( ]

+ q0 d/ ~" U, x9 RBYTE bBShift = 0;
' v" }9 _# P3 E7 r( |0 HBYTE bGShift = 5;
1 P2 Y/ h  ^8 T6 A2 u' }$ ]BYTE bRShift = 11;$ s$ y0 t# f, f1 ]
*/0 R5 x+ k2 j4 V) t9 Y
WORD nXSize = m_wWidth;6 Y; E4 ]# J4 a3 c, Q
int nByteAlignCX = m_wWidth*3;//(((m_wWidth * 24) + 31) & ~31) >> 3;% w9 m% h0 Z) {) Y7 B

8 k) L- H5 \( U+ w( x8 V! e5 Gstr_Text.Format("%s New File 16Size %d 24Size%d",strFile,m_dwImageLength,m_dwTemLength);
; E, u# s" c/ p& Q; EAfxMessageBox(str_Text);
9 u& k3 O8 ?4 ?0 z$ b0 W, E+ v' r  G! m# T$ q- Q, r
for (int nYIdx = 0; nYIdx < m_wHeight; nYIdx++)* B; d1 m0 k) v9 M; Y
{3 n+ @5 _/ }1 b- {9 _
for (int nXIdx = 0; nXIdx < m_wWidth; nXIdx++)( T4 ?+ v% j5 P3 ^
{
! m& n0 a( Z% y5 S//分色处理
8 j  t  B; t" x! g+ \' ~$ ]bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] ) >> bBShift); : i, a. C( Y- i# r" A
bsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bGShift) << 2 );
/ i% G( Z; Z& m" R' o4 ?bsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bRShift) << 3);* y8 o5 d( O' y2 b# ]
/* bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwBMask) >> bBShift);
. |: `. F( f5 ObsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwGMask) >> bGShift);
6 G( I4 ]* C4 K/ S1 P+ IbsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwRMask) >> bRShift);2 i; d$ [4 e1 t& R$ A, i
*/
* D2 w6 `  R" apOrgImage[(nXIdx * 3 + 2) + (nYIdx * nByteAlignCX)]=bsRedColor;; R6 l! G4 l8 X$ ?
pOrgImage[(nXIdx * 3 + 1) + (nYIdx * nByteAlignCX)]=bsGreenColor;" }$ z" N: W: l6 N# T* B, k
pOrgImage[(nXIdx * 3 + 0) + (nYIdx * nByteAlignCX)]=bsBlueColor;
8 `8 q7 l& N5 G8 d0 }, g) T}
+ Q6 J: t$ G2 o4 ^! F1 ^5 B}
) m" H' C1 }" q, R7 E! `9 J
2 ?- ?- C! D8 t/ R2 V% ` DeleteFile(strFile+".bmp");6 K4 v2 f# M2 n8 V
    if(!m_SaveFile.Open(strFile+".bmp",Cfile::modeCreate|Cfile::modeWrite|Cfile::typeBinary|Cfile::modeNoTruncate))
  ^  z! p) g) x. s {, h# M. a* I6 s: }* \1 A
AfxMessageBox("建立文件发生错误!");2 B5 i# i" X, y. r
        return ;
* d- U( M- |& D. j* { }
/ g% j0 M" q" y, ]4 y# l  ? m_SaveFile.Write (&bBmpFile,sizeof(bBmpFile));
/ M* M! B) P) J. n  Y- x: ^' l m_SaveFile.SeekToEnd();. x$ p2 C  c) p# H
- G8 T- r1 h: I$ v! y) U5 o4 Q
m_SaveFile.Write (&bBmpInfo,sizeof(bBmpInfo));
' O. Z. p4 {; N4 Z) U6 k' o! J$ g m_SaveFile.SeekToEnd();
0 C6 w% D; E; s2 d  p% q' }7 y- o  x" X9 s
m_SaveFile.Write (pOrgImage,m_dwTemLength);
. @: J% k0 L. B( f# M& f m_SaveFile.Close();
$ D0 L3 v9 }& y% k7 j6 [
$ @; Q' h- \; R+ G( P) j2 y if ( m_pwImage )
) `5 }9 E: e& l" H/ i {
$ q: U9 z, u0 q0 t delete m_pwImage;
* J7 e) ^6 l! _' J9 S5 S& d m_pwImage = NULL;
6 a' _4 b: G! A6 x" A9 X" p) o  b1 x }
* Q2 N, z, z' I+ V& l, i) B2 E% u" W if ( pOrgImage )2 }, n8 a9 h7 I5 z; ~
{
# @2 x/ ]6 J; n, Z* l delete pOrgImage;( V7 }  i4 Z' W  L/ Q. n4 i0 D
pOrgImage = NULL; 6 V3 I& p+ f1 m! I
}
. \/ ^' Q' q5 U! p}
+ v! A  u+ t- t9 n# e9 O4 Qcatch(...)0 M3 x$ W7 Y; v3 a; J8 B
{
1 C  m% `; M/ y$ X2 T' h}
# T) R; X/ s$ h# B! _}  X- t' X1 E4 Q* s! U

! `3 }6 L" a8 @* E5 c8 `/ E2 Y+ {$ X) s/ E. |0 b  |8 U! h
该代码只能用于研究和学习中。请勿用于非法途径。
8 z; C! n; D3 k6 R* \% {& [9 i4 R  W' q- e  m
呵呵。
0 q3 |$ _/ R; O, @" c; o$ {: b希望谁能结决图像16->24的问题请给我发一份。不胜感激: j" I. m- u+ n+ q7 N; x) Q0 b1 x% j2 |
# |# B! k- q% V; Z
newsoil@163.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-29 20:06 , Processed in 0.020193 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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