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

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

[复制链接]
发表于 2005-5-16 14:45:06 | 显示全部楼层 |阅读模式
  茫茫长夜无聊,结果下个了QQT的小游戏。9 Q( T4 o/ b  @: Q
哎太幼稚的一个游戏。
/ K5 R3 n( g$ Y* j5 V6 s不过里面的小人物倒是有意思。于是就把察看了图片资源。! U' `8 v( C; D1 m  l& }* e
5 W) h$ @" I1 t# a. K$ ?
呵呵~~有意思打开PAK保管发现第一个字节PK(ZIP的压缩格式),于是把名称该为.rar用RAR解压缩$ `' R/ ~& z) O' B

4 T: C; B1 ^2 z' ^。。。。。。& P# q/ x: Y3 [0 a
成功。
# F* [8 S& s: m$ _2 c8 H5 q( K( p4 ^1 m2 _2 \
1 A  l) u& w1 ~7 R
结果打开一看全是*.img的文件。没见过~~~~~
' j" T* x0 c" [& |) T打开文件看晕 QQF.DIMG 什么文件格式。:( ~~~~~$ s) v* Y* R6 S* ?5 c( k

, G9 N1 _/ V3 q3 M2 D- U于是分析了全部数据有点想16BIT的图像。但是有是24BIT的长度长14个字节。& \/ ]6 t7 I( g$ p* F

; B( q$ N# r0 g8 A( T  e7 \4 G$ Z3 W1 k& Z。。。
; ]+ [5 z2 ?- N) |4 s: f
- ?: G, n- J/ V, T; [$ [哎不说了。给点代码自己去研究。不过有点问题。
. I9 t' Q# p& F4 b% `
/ \: S! m# W/ ^) V( s% ~我搞不懂直接在贴到屏幕上显示正常。
% d3 S& n6 j* S5 X+ g( ?
% j, T& }& z3 @- p: M3 g, t' A! a写成BMP发现意思比较暗。。。
1 Y( P" s7 S2 W$ e6 o" u; J
; J% p5 W7 L- g+ g& u
5 Q, H3 i- e! T% Rtypedef struct tagQQBITMAPHEADER{ // bmih
; @" Z1 {. N4 A* t' n3 c5 R) u9 }0 R    char   szName[8]; //QQF.DIMG 标志   8
$ g4 a( {6 R7 W7 n$ K- k( i% \DWORD  bC1;       //65536
# h2 v6 }1 J  ?, TDWORD  bC2;       //24
' N) ^$ T! N. I( N  R$ c% ]DWORD  bA1;       //
" Z9 E6 t7 F) ]/ ?  y  KDWORD  bA2;       //
* {7 ^# E. U0 \0 JDWORD  bA3;       //
" d. M* \$ d$ O' ^) }* F: ADWORD  bA4;       //5 h7 A" A8 z" X5 @
   LONG   biWidth;   //宽
5 P6 z8 E: ~& t5 X2 ?    LONG   biHeight;  //高; n0 v1 w) o8 @# {( C: C) P
   DWORD  biP;
* E3 k; t; c7 g3 `! s    DWORD  biB;
' o, e: z& o) v) U2 g    DWORD  biC;
8 M! p  ]* y  A. j    DWORD  biS;   H+ B% e4 J! e) V7 s
   LONG   biWidth2;  //宽0 Q; ?% V" D- W  j& s/ h
   LONG   biHeight2; //高7 x% ^, y' g  I1 P6 L) @. m; G6 F7 l
   DWORD  biClrUsed; , i  Z3 y' G8 g/ |: N, P% C' m& E4 a) n
   DWORD  biClrImportant;
2 R3 D; D9 v6 c, o/ p3 m8 A7 S} QQBITMAPHEADER; 0 Q/ y4 ~. P2 {8 h

( L1 s0 [; Z2 c- ^& y: R7 J+ k7 H  @5 v' J) N
void CBmpToolDlg::ExpBmpFile(CString strFile)
0 E3 K9 u# U  e{
' q# o4 R0 B7 h- i2 b/ }BITMAPFILEHEADER bBmpFile;
1 R& X. ^/ t- {; G. kBITMAPINFOHEADER bBmpInfo;2 [3 J; O; c) ~! U. @
QQBITMAPHEADER   bQQHead;# ~! y! o  \7 {% `; E5 b
DWORD  dwReadSize = 0;/ Z4 C2 W: B8 l2 ?/ |) ~0 J
WORD  m_wWidth;
! a7 [- F3 p8 J& r7 n8 k6 b( D' fWORD  m_wHeight;
8 W3 K: ~; H- n: XDWORD  m_dwImageLength;$ v! b9 v) O7 w" j
DWORD  m_dwTemLength;
: Y" Z+ z2 N2 ^& ~% _: g1 gWORD  *m_pwImage;  p- R+ c, T' S- @+ [1 d9 R- @
CFile m_SaveFile;
" K  X+ m: s8 C/ F+ H8 K' B* BCString str_Text;
2 I% R) J$ W# L, b+ A# Q3 o8 p  ~5 V; l- K
try
* m! p3 M- {0 W( ] {0 w. q5 ]2 }' P
) D4 H1 O4 b  V( ^6 N
HANDLE hFile = ::CreateFile(strFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,; Y9 R( p" C& k) b) \( h+ g8 d
FILE_ATTRIBUTE_NORMAL, NULL);
7 p! L2 o4 i/ R. ^$ ]. K, c! j
7 t3 k. g) c5 l5 r/ B/ Wif ( hFile )# X0 \. m* l- H
{
9 a# e5 w  e7 x! S- ]1 K; D( Q2 mZeroMemory(&bQQHead, sizeof(bQQHead));5 I0 `: j, e: v& a) b
ReadFile(hFile, &bQQHead, sizeof(bQQHead), &dwReadSize, NULL);
( c8 F; t5 T# g! \. S) O5 C# ?: q% Y, M  K, T$ b9 T% c( W
if(bQQHead.szName [0] != 'Q')return;
0 C0 ~0 Y6 c, Q: _( u! r$ z, q3 p# l3 q; m
m_wWidth  = (WORD)bQQHead.biWidth;
! x5 V6 C+ \, s6 f; X# G; Y. hm_wHeight = (WORD)bQQHead.biHeight;
2 X# ~( |$ I# W( Q* Y/ [" P5 P4 ^3 p# d$ I0 J9 F' T4 H; d
m_dwImageLength = m_wWidth*m_wHeight*sizeof(WORD);9 D4 _. e7 D9 q, ^! k
, _: {# M2 m$ M% J2 a8 z
m_pwImage = new WORD[sizeof(WORD) * m_wWidth * m_wHeight];
9 T! [# _/ r/ o7 c
; _6 K! \: C( Q& jUINT nSize = m_dwImageLength;
. R$ u* j( o( V9 F0 q* @9 d( a; a4 X
ReadFile(hFile, m_pwImage, nSize, &dwReadSize, NULL);# K5 T) B1 I0 u  \% j

. [3 w, B7 _- O/ Q2 G( ECloseHandle(hFile);
$ a" p7 d2 j* @1 V0 q}
7 F. E+ _( N! {6 q; D$ Vm_dwTemLength = 3 * m_wWidth * m_wHeight;
0 Q+ _* M' f9 W7 \//重新构件一个BMP头然后在写入到新的文件
8 Q- v* `7 v3 a9 P  ~
7 @1 K9 e3 N* p  V/ I5 c: HbBmpFile.bfType = 0x4d42;//'BM'2 @: _: b7 S9 G' I& I
bBmpFile.bfSize = m_dwTemLength +  sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);: o; ~3 s+ C0 p: @5 m5 [  B
bBmpFile.bfReserved1 = bBmpFile.bfReserved2 = 0;5 i2 B/ ]7 \$ u5 q! I
bBmpFile.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //3 {2 v% C( T% ^6 R2 B. U" }6 G1 n
//' N$ U% e0 ]$ e9 n$ Q2 E
bBmpInfo.biSize = sizeof(BITMAPINFOHEADER); //以下是为BITMAPINFOHEADER结构赋值6 c( Y! Y9 H3 @+ v/ m/ J
bBmpInfo.biWidth = m_wWidth;
4 B7 D' y, u  o# W+ SbBmpInfo.biHeight = m_wHeight;
4 g  Z- [; n/ fbBmpInfo.biPlanes = 1;
$ `2 _6 a* u$ }7 `% ^' {5 x! AbBmpInfo.biBitCount = 24;% U0 J0 R* F& ?8 W
bBmpInfo.biCompression = BI_RGB;
+ Y; X7 B5 E  B4 N$ IbBmpInfo.biSizeImage = 0;
* z$ Q: _- F' @4 j/ abBmpInfo.biXPelsPerMeter = 0;
; ?) U/ D. |3 Z4 LbBmpInfo.biYPelsPerMeter = 0;3 G' F6 h# ^+ C4 c2 e3 O
bBmpInfo.biClrUsed = 0;/ u1 r- _6 \6 U2 t3 n9 K; U% X
bBmpInfo.biClrImportant = 0;- x# ]# G2 z9 N3 _- g3 o( t
" t% t$ T9 W3 z
///////////////////////////////////////////////////////////////////////////
7 b) L2 Y) C/ j# _/ r//倒转图像数据
) S3 U; P2 S8 R" ^- V1 TBYTE *pOrgImage;
! ~' l: V# b; ]. p2 W* upOrgImage = new BYTE[m_dwTemLength];& m4 {) }* {! E/ l. U

. [% p# x5 Z& {, f7 KBYTE bsBlueColor, bsGreenColor, bsRedColor;' o" N3 R  q9 o! z
//656$ Q  a( O+ Z* j8 k1 w- p% N2 Q) Z
DWORD dwBMask = 31;
  ^" G6 K% l' S: u; i: C/ s1 _3 pDWORD dwGMask = 2016;6 b' V" ?. P: s3 j" ?
DWORD dwRMask = 63448;
6 G: ?  L+ \3 `+ b0 y* A; f' a" M6 O2 y8 X
BYTE bBShift = 3;3 q0 ?+ s: p' B9 `! T
BYTE bGShift = 5;
4 r. f3 e6 v5 }1 I6 DBYTE bRShift = 11;
- W, t3 {4 Y- h+ U* C: G# g+ d: s: {7 B1 x" \' B
// wPixel = ((byRBit >> 3) << 11) | ((byGBit >> 2) << 5) | (byBBit >> 3);
! w3 k( Q, L- ?# l" u/*
% Y! T' E0 I/ I& L, OWORD dwBMask = 31;
/ h& i) K" S9 \6 @6 O* }WORD dwGMask = 2016;& K4 i0 w* o; F: _7 l
WORD dwRMask = 63448;6 m% }* j! x0 z# u
! a# f- Y, R( M5 l! ~7 G
BYTE bBShift = 0;; O+ ~- T5 t- ?. N; O7 _! v
BYTE bGShift = 5;
8 m7 K8 ~/ ]+ X% e# C8 o5 [BYTE bRShift = 11;
! n+ j. ?3 g( {  [% i! Y* V*/0 q" o3 v# C/ r6 k# D
WORD nXSize = m_wWidth;
9 _- D- ?) u9 y  Rint nByteAlignCX = m_wWidth*3;//(((m_wWidth * 24) + 31) & ~31) >> 3;
; d' P0 q4 g& o# w9 Q
8 ?$ H8 t. m, X1 ystr_Text.Format("%s New File 16Size %d 24Size%d",strFile,m_dwImageLength,m_dwTemLength);- `/ F% @" O. M1 [8 I6 m
AfxMessageBox(str_Text);$ u; W1 J# V7 J# w2 w
1 h1 G0 s& B  l0 ~- o. p/ t
for (int nYIdx = 0; nYIdx < m_wHeight; nYIdx++)# l" |% K! Y- h# e
{: o" ]4 f5 Y) D8 I
for (int nXIdx = 0; nXIdx < m_wWidth; nXIdx++)' j' ~4 L" s* l- k
{ * V) ?! w- a" l/ m
//分色处理6 z3 c% Z% j" y9 C1 y
bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] ) >> bBShift);
3 m$ M  V" ^) f+ k' XbsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bGShift) << 2 );
1 g+ P0 E* G* I3 _; q4 RbsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bRShift) << 3);
% b7 C! _+ Z5 Z$ h, n9 G/* bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwBMask) >> bBShift);
3 u& }+ R$ O, ^! J" M8 sbsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwGMask) >> bGShift);
  h9 v0 E0 U2 G* ?* X8 JbsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwRMask) >> bRShift);
) \4 x9 J0 k3 `*/
( v' ^# a' v4 Q1 \1 \* X, O4 R' v; BpOrgImage[(nXIdx * 3 + 2) + (nYIdx * nByteAlignCX)]=bsRedColor;, W+ Z5 ^! I7 g# l& ]
pOrgImage[(nXIdx * 3 + 1) + (nYIdx * nByteAlignCX)]=bsGreenColor;
; P( E1 Y9 S/ `% |1 MpOrgImage[(nXIdx * 3 + 0) + (nYIdx * nByteAlignCX)]=bsBlueColor;) X7 \" p+ H( i4 M
}
, O- o3 C$ c  o; e; y6 |/ h, ~}
3 Q: }4 s2 B. u- F1 r: d( D
; }, Y" l5 k3 W$ q8 K8 x, R DeleteFile(strFile+".bmp");9 ~! u/ C$ d% d  B0 @; `8 I0 U8 t
    if(!m_SaveFile.Open(strFile+".bmp",Cfile::modeCreate|Cfile::modeWrite|Cfile::typeBinary|Cfile::modeNoTruncate))
" ]5 c9 [) e5 ^) H, I {5 A$ C2 W9 u7 L) e
AfxMessageBox("建立文件发生错误!");
3 e( g+ R$ W# U: H         return ;- R4 l) R/ I4 K) j  O
}; x. c- D% O9 O( m: _0 ^( M
m_SaveFile.Write (&bBmpFile,sizeof(bBmpFile));
, ?' z$ s; K( {, K, V9 u m_SaveFile.SeekToEnd();
# H4 s: V& I8 ^  m. l3 ]' s
3 y  w- a, c. _ m_SaveFile.Write (&bBmpInfo,sizeof(bBmpInfo));# Z: R$ V/ V, O# E- f1 q& m
m_SaveFile.SeekToEnd();. b# Q2 V2 y$ r& s4 a4 Q

; A- C( `+ Y3 e( m6 Y m_SaveFile.Write (pOrgImage,m_dwTemLength);
0 S# n! [1 I4 a2 d( ~ m_SaveFile.Close();/ L& ~- A% X  g  U6 }6 t* h# e

: G! j6 K! b1 {' k if ( m_pwImage )
7 \" }; T1 i% O6 N& |2 J { : P2 S+ P; t' m% J5 Z
delete m_pwImage;
4 K; [6 z1 N; A! s  y m_pwImage = NULL;
5 K9 S( f3 O7 \/ l }
$ W* r' n2 d* P" [; n, d8 b, Y if ( pOrgImage )7 m/ }0 f6 @: q% s) y' h  p
{ ) T2 ~( m5 Z; I8 s
delete pOrgImage;0 ]; ~4 S. _, @- w7 I+ ~
pOrgImage = NULL; . I$ }/ ]( S8 c7 h. [1 f
}
# d; ^3 `" j, _: h/ w}+ n" V# a! i$ I9 M! L
catch(...)
5 ^3 n7 L: v! l& Y{
0 o: {1 Q1 f, A' J}, a1 O: V) g+ g  G
}  X; \5 A  P  G* H9 C8 q% d7 n
5 [; I4 I3 V9 `( h0 P% K5 B, a
0 }1 {4 v. G) A/ b
该代码只能用于研究和学习中。请勿用于非法途径。
1 }+ f* _7 g. b5 F  C4 Q7 t5 b# f4 R# N1 `
呵呵。; ?& }; V8 Y' W; x0 _! Z+ p* g
希望谁能结决图像16->24的问题请给我发一份。不胜感激' [2 \' X/ \( Q  O5 P/ K6 K- ~8 B6 U
) p% b& p5 c& S' u! k
newsoil@163.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-30 00:25 , Processed in 0.021460 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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