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

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

[复制链接]
发表于 2005-5-16 14:45:06 | 显示全部楼层 |阅读模式
  茫茫长夜无聊,结果下个了QQT的小游戏。! P* L# H  D1 V
哎太幼稚的一个游戏。* l2 s$ J  v6 j: T, ]
不过里面的小人物倒是有意思。于是就把察看了图片资源。, Z4 o# F# W8 Y

  Q# Q" [8 h- v呵呵~~有意思打开PAK保管发现第一个字节PK(ZIP的压缩格式),于是把名称该为.rar用RAR解压缩
2 T* A* f2 z* @! Y) A9 Q+ `& u/ Y7 O* x5 j4 A  Z3 x
。。。。。。' w- E" E6 }8 ]% Y  d
成功。. A% w. N1 v5 e
, P7 J% M" V( ~& G9 c2 W9 e8 U7 f4 q
3 w% p: n# j& y, [/ h" g
结果打开一看全是*.img的文件。没见过~~~~~6 }+ X% U+ ~8 H& O% g" h2 K
打开文件看晕 QQF.DIMG 什么文件格式。:( ~~~~~
# f& ]& n. A& {$ T) a# r4 Z1 t, S8 y' f: r" d+ z9 x' M
于是分析了全部数据有点想16BIT的图像。但是有是24BIT的长度长14个字节。- D7 c4 X$ y' E# x5 Y# L) {6 T9 Z

  O  F+ h3 N4 L5 r9 x- z。。。
6 w/ ?5 g  g0 i; v
) e( {3 l' z1 D% l: P5 l- J哎不说了。给点代码自己去研究。不过有点问题。
7 x, `5 g( I0 O& u' D
4 I5 i) z1 A" T# _我搞不懂直接在贴到屏幕上显示正常。
* F2 ^2 g' R' z" c* O) w
( X, q' D( O* b7 ?5 i8 P5 @写成BMP发现意思比较暗。。。
* r8 a/ d" j$ F: z, u$ ^4 V" P1 i+ W$ J7 y, u# ?  V# m

" s  M( V! r6 B9 D( R. `1 ^typedef struct tagQQBITMAPHEADER{ // bmih
4 F' o) r' M- E. d7 J( h4 P# U+ |    char   szName[8]; //QQF.DIMG 标志   8: m  k: @# Q5 P3 p& r6 s
DWORD  bC1;       //65536
  n9 V! T, u% e: M. HDWORD  bC2;       //24, r6 T  n  R% F/ G
DWORD  bA1;       //
1 L- ^- h/ c, o+ w9 ODWORD  bA2;       //
4 ?: [1 d- z' Q1 ~; P8 N8 rDWORD  bA3;       //
' R' O8 A; i, `/ aDWORD  bA4;       //: F! [+ o/ J- q( B- ^
   LONG   biWidth;   //宽
$ N3 S9 w+ ^" ?) Q8 y; u: D4 y9 H    LONG   biHeight;  //高
4 b% X4 |( H, a6 C    DWORD  biP; ! o7 p6 n  w0 r% s5 U9 u/ e2 ~8 Z+ `
   DWORD  biB;
4 @# n5 P# L: e. g8 o% U    DWORD  biC;
2 q& S' @, Q( w( }    DWORD  biS;
# @( U# E! R0 C1 B) b! Y: N    LONG   biWidth2;  //宽
; t1 U+ ?9 {! U7 P8 N    LONG   biHeight2; //高
% s  \7 m1 U/ f* g. i    DWORD  biClrUsed;
$ ]+ V( v+ b; R* a    DWORD  biClrImportant;
! x) }  |8 b4 H" t} QQBITMAPHEADER;
: j0 M) G( [  E# k; Q( E' m$ N. t4 `* S/ |6 r9 }; p' ]

7 x6 z' u4 m% j% Q0 uvoid CBmpToolDlg::ExpBmpFile(CString strFile)
0 C. g* S- z- R9 o{
, T* O+ u- v: I. b) IBITMAPFILEHEADER bBmpFile;
0 P0 o, X/ p: S+ i' h  I  Q. Z& mBITMAPINFOHEADER bBmpInfo;+ g; Y, j; [4 Z. Z  @) e/ V3 ]
QQBITMAPHEADER   bQQHead;" R: p; v6 c( q$ a% y2 M! U
DWORD  dwReadSize = 0;. M1 ~" |6 ?: K0 V
WORD  m_wWidth;& I+ S" J# [  Z& b2 ]
WORD  m_wHeight;
2 j9 _# Q/ n, f1 a7 F* a) }DWORD  m_dwImageLength;
2 V" q9 [) p* ~$ {DWORD  m_dwTemLength;
, r7 a9 s" w4 N, U( {WORD  *m_pwImage;7 b  N& j0 \- f/ t
CFile m_SaveFile;  C7 w+ D/ ]6 ~9 Z2 v
CString str_Text;: h- {' S' {5 _9 ]# c/ [5 ^

; g# T4 i* W3 V try  y- M8 q( W. ~9 x8 N
{4 n* P% J4 M: r, |7 q

- x) c" {: e' v9 gHANDLE hFile = ::CreateFile(strFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
! d' _2 Z* {1 k6 W: e% O' j: \+ ?FILE_ATTRIBUTE_NORMAL, NULL);' F! b6 `. I; o8 M5 K4 }

1 `: }# a% O7 kif ( hFile )9 Q  Y3 ^2 G7 Z" n
{
8 G/ F: i1 t& y: x: s8 `ZeroMemory(&bQQHead, sizeof(bQQHead));
! E! q5 ^5 w% S  y- sReadFile(hFile, &bQQHead, sizeof(bQQHead), &dwReadSize, NULL);, S& l8 j, g% T+ D  Y, U1 a! m

6 j( }9 l1 j- h3 I( jif(bQQHead.szName [0] != 'Q')return;
9 {! E" B* Q8 Y1 y# Z) g% r# S" t' R. [+ k, L) h( F. L( `
m_wWidth  = (WORD)bQQHead.biWidth;
: B. Y8 o/ I7 p& M# Km_wHeight = (WORD)bQQHead.biHeight;
; J2 `0 i# W, }% f% Q( H3 F1 h# P' l* X
m_dwImageLength = m_wWidth*m_wHeight*sizeof(WORD);
0 w1 ~' a" p5 l# `! K  j+ w% g8 X; |! y- [: I
m_pwImage = new WORD[sizeof(WORD) * m_wWidth * m_wHeight];
" d) W) r2 d+ Y* u, I+ g/ r( H' g' |' L3 O
UINT nSize = m_dwImageLength;
$ |4 ^+ }5 U" I9 Z9 ]
" ~( \+ V  w$ dReadFile(hFile, m_pwImage, nSize, &dwReadSize, NULL);: z: b0 y/ z) q

7 j4 m) Q0 E9 Y) v. N8 ], _; @CloseHandle(hFile);5 T' D# ^! t) n0 Z# ]
}. o# t6 J7 H& {9 t$ _9 _
m_dwTemLength = 3 * m_wWidth * m_wHeight;
. b9 F! p8 a" A//重新构件一个BMP头然后在写入到新的文件
) @5 a/ h% m" r. h& k9 z: t4 k/ V; q7 I  z! }
bBmpFile.bfType = 0x4d42;//'BM'
7 x* h$ ~- \; c: e' X, }# WbBmpFile.bfSize = m_dwTemLength +  sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
2 ]  ~. G' p5 ~/ [* k; V! ubBmpFile.bfReserved1 = bBmpFile.bfReserved2 = 0;
9 J9 B0 _: Q8 J( ibBmpFile.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //
  b0 T& n, M# S//
8 m$ C' q, W2 ZbBmpInfo.biSize = sizeof(BITMAPINFOHEADER); //以下是为BITMAPINFOHEADER结构赋值4 \1 O+ }7 x3 T- ?1 n9 t* r* \
bBmpInfo.biWidth = m_wWidth;/ b6 v  d+ M( i9 F
bBmpInfo.biHeight = m_wHeight;" X5 m2 Z3 L% E
bBmpInfo.biPlanes = 1;; R* K- n$ D; D
bBmpInfo.biBitCount = 24;- {1 x  U" }5 G
bBmpInfo.biCompression = BI_RGB;2 a- E+ }# O( ^8 L5 p: c0 z- {0 b0 N
bBmpInfo.biSizeImage = 0;
+ a! h' s  u6 l) q+ p( R7 {bBmpInfo.biXPelsPerMeter = 0;' k+ X! e5 A+ d
bBmpInfo.biYPelsPerMeter = 0;7 p& x! c; x; i! o
bBmpInfo.biClrUsed = 0;' O  g% y0 W$ o7 F9 b* d$ d
bBmpInfo.biClrImportant = 0;
, N1 @! D  B3 L6 P9 @+ o
% x6 u0 }& G4 q2 l! p; u//////////////////////////////////////////////////////////////////////////// s( g; {/ ^: v0 a
//倒转图像数据
2 f9 }$ F8 l4 F* r* ]& j- A# bBYTE *pOrgImage;
8 W+ p' Y6 p, a2 g# r' D; I, MpOrgImage = new BYTE[m_dwTemLength];
2 ]( [" E1 n+ M% T5 l: I# \* i, E
6 A1 x  w2 ~  kBYTE bsBlueColor, bsGreenColor, bsRedColor;( B, G! w; c4 g9 i( \4 ]# t
//656
: Q/ O, F9 V& f5 V; K9 @DWORD dwBMask = 31;
1 y: P) E1 G0 M3 l0 |8 p4 a6 UDWORD dwGMask = 2016;
; w" O- B5 S! nDWORD dwRMask = 63448;/ {2 O5 ?. y3 s: x

: W) H  a3 s4 f5 ABYTE bBShift = 3;3 g1 K/ I" R# x$ o+ y$ @1 [
BYTE bGShift = 5;
0 e! m2 F9 c0 a# q. V) o! k# {BYTE bRShift = 11;2 m! ?% f6 L/ V" x( b0 D
- n; E, J2 A# L6 r2 ^! F4 b# Q5 M# |/ Y; I
// wPixel = ((byRBit >> 3) << 11) | ((byGBit >> 2) << 5) | (byBBit >> 3);
% h& I- C5 S7 \3 p' D; N/*' U! c2 M1 F; O* ], H3 x0 V; T# Z
WORD dwBMask = 31;. ?# K1 n5 J; R) X3 w$ P- W2 }
WORD dwGMask = 2016;
* \1 V# H! h. ~3 ?' ^WORD dwRMask = 63448;
; ^4 W/ Q/ f& o0 o
  B0 _: D1 @9 Q+ D& XBYTE bBShift = 0;
0 K! C' @! o8 {3 d" R4 m$ BBYTE bGShift = 5;5 g3 F! l* F2 B# z$ I
BYTE bRShift = 11;( I( U9 D5 G2 f/ v
*/
& s* Y+ U0 u) D) DWORD nXSize = m_wWidth;
+ R0 |7 |. i9 y5 Hint nByteAlignCX = m_wWidth*3;//(((m_wWidth * 24) + 31) & ~31) >> 3;
5 x+ c( N8 \, ~/ R7 v, V
0 |7 [% m* T$ K2 k- A0 B5 _str_Text.Format("%s New File 16Size %d 24Size%d",strFile,m_dwImageLength,m_dwTemLength);8 {) y* O4 T2 S& j* Z) A, D
AfxMessageBox(str_Text);
8 |+ ]( N: b9 [
: p9 r% n3 P( w* Kfor (int nYIdx = 0; nYIdx < m_wHeight; nYIdx++), |6 l$ C/ J5 a+ A0 t& ~! R
{
" H, Y; M+ p+ |# `! }for (int nXIdx = 0; nXIdx < m_wWidth; nXIdx++)
' O# y2 `' z/ }3 M# h. ~{ 0 Z) K& i) x+ w4 R5 W
//分色处理
  Y. }. ^+ g  \$ V# T4 R( sbsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] ) >> bBShift);
; p# w( N. S; \- B5 N( mbsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bGShift) << 2 );
- n/ G- V7 H$ M8 C, }bsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bRShift) << 3);
/ H. W1 `+ R' j4 f3 p3 w/* bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwBMask) >> bBShift);
; @& m7 A# w' y1 f* v& f7 o) fbsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwGMask) >> bGShift);
- t, X$ z* S) U1 a3 q  u) r0 I" MbsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwRMask) >> bRShift);
: Y/ x3 b! T8 l$ U; X: S- h*/
5 U: c; _  g' m) F( wpOrgImage[(nXIdx * 3 + 2) + (nYIdx * nByteAlignCX)]=bsRedColor;
& S* c7 H5 }' Z4 |* SpOrgImage[(nXIdx * 3 + 1) + (nYIdx * nByteAlignCX)]=bsGreenColor;
3 o' A8 J6 d5 {pOrgImage[(nXIdx * 3 + 0) + (nYIdx * nByteAlignCX)]=bsBlueColor;/ B. X0 w( D' v& N; J
}! K: I+ y, M9 @
}6 F( ]" z( B7 L
$ R1 A7 c; T0 w: N% `$ P' X
DeleteFile(strFile+".bmp");
8 M- B% ]7 ~& g: ^6 d     if(!m_SaveFile.Open(strFile+".bmp",Cfile::modeCreate|Cfile::modeWrite|Cfile::typeBinary|Cfile::modeNoTruncate))
( Y4 s- o, A  B: d( Y% S {
5 @2 N; R! w# P2 g AfxMessageBox("建立文件发生错误!");, H* O; @/ {3 `) s, h
        return ;
# M6 B* F$ N0 ~' K! T }
7 h' W& |9 }: f* u2 l% h" A m_SaveFile.Write (&bBmpFile,sizeof(bBmpFile));& s6 H" \. N6 {" |* @9 x( r
m_SaveFile.SeekToEnd();( r& Y/ z6 V2 _5 G
& z! z9 d! s5 ]$ w. K- Q0 Y
m_SaveFile.Write (&bBmpInfo,sizeof(bBmpInfo));8 @! \8 N& d# M) z; K! \
m_SaveFile.SeekToEnd();
) T* r) U; _+ Q& L4 z
/ `% ?3 U. Y9 T" A3 t m_SaveFile.Write (pOrgImage,m_dwTemLength);  X  F2 R9 q! ?" Z- D# v9 o
m_SaveFile.Close();( d) o5 N/ Q# c$ Z9 k2 f: k
3 {* b4 l3 M7 F& y  F
if ( m_pwImage )
8 |/ H, P$ W/ v  p" h) b { & t& ~* S) c8 f$ q0 j- R7 |+ n: O
delete m_pwImage;8 \( V0 Y: Q6 p  S, [3 u
m_pwImage = NULL;
- f6 V2 I) j2 z5 y }. O0 V- V! B# m! o3 R$ N4 H
if ( pOrgImage )
% `0 g0 M" X* b4 @  F, b { % Q& B: I' Q8 E% [% n
delete pOrgImage;0 s  w# p* W& Z
pOrgImage = NULL; - Z7 E3 {+ @! e/ b+ _
}
9 G, D9 }) E+ A# X}
, r9 z7 p0 y8 D5 P( Lcatch(...)
4 w* t! m' {5 Y{
* m7 m9 F6 [$ p6 n. r}
. d& ^& x1 Y5 V9 r6 y1 q( S' S}
  |, F: `/ _, V3 X. {  j$ Q2 Y$ Z+ F# v
, W9 ]+ f) U! [. z
该代码只能用于研究和学习中。请勿用于非法途径。
) f# e3 w  j4 r& O% S' w
1 F! y, e0 L: \% [$ C, c3 ]呵呵。9 T7 [( \# o1 x2 E
希望谁能结决图像16->24的问题请给我发一份。不胜感激" x7 c/ T2 W% d( r% P/ m. Y6 |8 a

' D" U7 A% c9 J0 b5 D/ nnewsoil@163.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 10:34 , Processed in 0.018628 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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