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

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

[复制链接]
发表于 2005-5-16 14:45:06 | 显示全部楼层 |阅读模式
  茫茫长夜无聊,结果下个了QQT的小游戏。" d# s; J7 P1 o+ K
哎太幼稚的一个游戏。
4 j2 {6 x# m, S+ }3 o: P不过里面的小人物倒是有意思。于是就把察看了图片资源。
5 y) U8 `/ |0 V1 u- c; b8 ]" T5 ?! _' a& n* Z
呵呵~~有意思打开PAK保管发现第一个字节PK(ZIP的压缩格式),于是把名称该为.rar用RAR解压缩
1 U; G1 w9 Q6 f: D6 B" `! j5 j8 F. G- R5 z: C7 q
。。。。。。
1 a8 l+ K. T) S/ l. {成功。6 a2 K, K4 p; k+ H4 C; f

9 D8 ?8 v# C# ~: E. C6 w& f- t. k" V, ^4 y, }
结果打开一看全是*.img的文件。没见过~~~~~% Z! ^( A; Z& S  P1 B5 e3 l
打开文件看晕 QQF.DIMG 什么文件格式。:( ~~~~~
7 e/ j# Q, ~/ ], p; P- M5 @
  i2 d- F2 l2 p于是分析了全部数据有点想16BIT的图像。但是有是24BIT的长度长14个字节。: E+ ~6 {/ Y5 g7 [0 x
* C. r+ m9 g, S# [1 X3 ^3 o7 X
。。。5 z$ C% d, w( X, j1 |

' Z( V* B: N$ X0 F哎不说了。给点代码自己去研究。不过有点问题。
- F* E) S7 P; h' Z! j* S/ h
# p* o1 u. S) ]& _% ^, s- L我搞不懂直接在贴到屏幕上显示正常。2 |# X1 H( J4 X9 N: x
- ?+ e6 z' r. W3 b7 S
写成BMP发现意思比较暗。。。
( e7 H- F" _0 ^% e  f! O1 {" w3 P) S0 a% Z2 K( [
4 _1 H8 K. t. P4 v4 _  f$ _( p) M
typedef struct tagQQBITMAPHEADER{ // bmih
6 G, W% C& V9 F( f# c: c    char   szName[8]; //QQF.DIMG 标志   86 c( V1 }0 y5 A! w
DWORD  bC1;       //65536# K( K6 @9 T& \: w2 U' @' o) B' o
DWORD  bC2;       //24! B7 M: t8 a' B5 j3 \
DWORD  bA1;       //
; P+ C& r( q* H! G  k& P! b0 tDWORD  bA2;       //
( a* f' ^( \" Q, l" ]DWORD  bA3;       //9 H2 L& `9 N) V3 h- r8 V& P+ |
DWORD  bA4;       //
6 v1 o3 L& B+ c0 Q/ Q( Z! c* b2 u    LONG   biWidth;   //宽
, r9 f7 }( W6 p6 m6 H  p2 Y+ {3 r    LONG   biHeight;  //高
9 X$ u- C' a+ y$ M5 w    DWORD  biP; : l6 x. ~! T# a8 B& L9 y  n& S
   DWORD  biB; . |& l1 I5 E% f( J9 i8 [
   DWORD  biC; + \: [# w% k4 j6 f$ p
   DWORD  biS; % \( A3 q, g2 g
   LONG   biWidth2;  //宽8 |( G5 p2 X1 ~2 T& o
   LONG   biHeight2; //高) K2 c& k/ G- x* h, B: l
   DWORD  biClrUsed;
" S* P" Y8 D/ H' s! i% ]4 z4 N    DWORD  biClrImportant; * ^: d2 }, U2 y1 m, i
} QQBITMAPHEADER;
8 X5 B; C' K2 D1 D: g% N( a' b0 S
- m' ?3 x2 S& h% M
void CBmpToolDlg::ExpBmpFile(CString strFile) : z! f9 P+ P8 h9 Q7 |$ i
{8 g, w7 i5 L8 _
BITMAPFILEHEADER bBmpFile;
9 |; {+ e' k% l  ]* o& b1 nBITMAPINFOHEADER bBmpInfo;
( f0 N- W: x' q5 o0 jQQBITMAPHEADER   bQQHead;( b( C7 f8 `: u# b
DWORD  dwReadSize = 0;9 q# {( e" m9 U6 H2 N+ v) G7 s! B/ X
WORD  m_wWidth;% Y8 L4 h7 t- z  j# v. Z
WORD  m_wHeight;
8 H# a, o' ^. E& e; W" V$ u+ BDWORD  m_dwImageLength;
) x0 [" r- t; JDWORD  m_dwTemLength;& H& C6 f+ a: t3 S" n+ @! n+ Z
WORD  *m_pwImage;8 y; W8 L9 r/ P# @
CFile m_SaveFile;
( w) K( k  p8 S: A% r& I# ICString str_Text;
& [9 `: p* P2 p/ v$ `" _7 B: z9 [( y( T8 ^1 o$ J/ k+ @# n9 _! Y. w
try
' G9 S8 Z! x8 C( c; w" Z {- g0 j# ]0 ^7 j) C; J' F

0 S# ]7 M1 ~' M! f$ vHANDLE hFile = ::CreateFile(strFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
( @: o. [& ]/ R) |) xFILE_ATTRIBUTE_NORMAL, NULL);
; F* e- w) w! Z
! [/ [) O6 L: a% h- [4 rif ( hFile )
: k) \: j) U4 y" @  L/ X) }7 C! W{: G" F( r( k  {) F
ZeroMemory(&bQQHead, sizeof(bQQHead));( [2 F' z; s. r2 G% U
ReadFile(hFile, &bQQHead, sizeof(bQQHead), &dwReadSize, NULL);
' f# w. x! W% d/ ?1 d) g- g
: H0 q3 Q6 ?! z- ~% Xif(bQQHead.szName [0] != 'Q')return;
4 [! C2 p5 q& Z1 {! F8 a, g) i2 g: B
) v5 e4 I. ^: G. G6 X  t. X1 bm_wWidth  = (WORD)bQQHead.biWidth;0 _1 p$ N0 u, u
m_wHeight = (WORD)bQQHead.biHeight;1 z+ y$ @8 q2 y0 U- m" M9 o
! U) O2 W( g( I# \; V, }, P
m_dwImageLength = m_wWidth*m_wHeight*sizeof(WORD);* j$ R8 k" ~! ?2 p0 `
# M+ O: b1 p3 k
m_pwImage = new WORD[sizeof(WORD) * m_wWidth * m_wHeight];
$ F& z' v2 Q7 `5 G$ ]8 X8 J9 O& T1 S
UINT nSize = m_dwImageLength;
* Y# l, m) a2 j* k$ k5 u
" H; d5 o  V% X3 o  m- O9 x( iReadFile(hFile, m_pwImage, nSize, &dwReadSize, NULL);$ p: c& |( Y* O5 _0 G  M: r
5 x+ X. \, T4 M* ^/ e4 W" s; W3 V
CloseHandle(hFile);
8 F/ y- P" T% C}
6 |8 w9 G8 |* j, ~  c9 z$ tm_dwTemLength = 3 * m_wWidth * m_wHeight;
3 ]5 D# Z! v8 Y/ c& d' o" f//重新构件一个BMP头然后在写入到新的文件  A$ R, O. t4 J: q
; E; F$ _1 n- B. v0 {
bBmpFile.bfType = 0x4d42;//'BM'
) G- b; `' o% c% Y* q7 ?% MbBmpFile.bfSize = m_dwTemLength +  sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
& w) r, h( S7 A: QbBmpFile.bfReserved1 = bBmpFile.bfReserved2 = 0;0 v! R% m9 z& F
bBmpFile.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //
9 y) i" O& w) e( E6 {% I//+ |. a- `8 F/ j' k3 K5 ^
bBmpInfo.biSize = sizeof(BITMAPINFOHEADER); //以下是为BITMAPINFOHEADER结构赋值1 y( D% @$ F2 N( M" i: @
bBmpInfo.biWidth = m_wWidth;8 o- `( k4 u+ \# }6 f" l" W& ], \  Q0 y
bBmpInfo.biHeight = m_wHeight;
  q; m0 k7 V/ i( c( IbBmpInfo.biPlanes = 1;
% `& y# f# t+ d/ R' I9 G$ o* gbBmpInfo.biBitCount = 24;+ R2 [' w- ^% k  j6 S" j
bBmpInfo.biCompression = BI_RGB;3 U* A- J% \' T5 J4 u
bBmpInfo.biSizeImage = 0;! @7 G, z: G  m4 N' L4 R
bBmpInfo.biXPelsPerMeter = 0;8 w1 P' W7 {  w$ Z7 j/ N% U$ `% g
bBmpInfo.biYPelsPerMeter = 0;1 O( c, E# R/ j
bBmpInfo.biClrUsed = 0;; Q' D: J6 _5 d: W& _( e
bBmpInfo.biClrImportant = 0;0 U. {. l  C6 [: z& q) \9 c6 c

6 L' P" i. O1 [- B* Y% ^///////////////////////////////////////////////////////////////////////////
2 `) \7 o; u1 e- e7 E- k//倒转图像数据
" z6 M$ a% E. c; h0 c7 Y! c0 EBYTE *pOrgImage;
. P9 I( G; X4 f9 C( fpOrgImage = new BYTE[m_dwTemLength];
; L7 v4 D% p8 Q4 T" x6 b0 C% ]0 `3 k1 j# A* A0 v5 p
BYTE bsBlueColor, bsGreenColor, bsRedColor;3 |, c: l. O+ N: t6 Y! m
//656
+ {$ p7 ~" N5 G5 t6 sDWORD dwBMask = 31;  e* B+ ~/ s' ^1 w& H1 I1 r2 V: u
DWORD dwGMask = 2016;$ e# e. N" M3 C1 M% c+ I; y' `
DWORD dwRMask = 63448;& C& Z( Y) D" x9 t# P

5 d4 f' u" p; ]. |' ~BYTE bBShift = 3;: o9 c0 B% X3 S
BYTE bGShift = 5;; E6 x: n& h. N
BYTE bRShift = 11;7 ], e2 H; s5 H$ h7 |2 d
& n( g; F+ f: F, Z# d
// wPixel = ((byRBit >> 3) << 11) | ((byGBit >> 2) << 5) | (byBBit >> 3);
+ ?- L% C, h, g( X* C/*
" ]/ V8 R2 F7 D7 `, S4 LWORD dwBMask = 31;! `/ b3 A9 M  w4 R
WORD dwGMask = 2016;
1 |9 j5 [! I$ p+ D# MWORD dwRMask = 63448;
! J& a/ j# Q* R7 F9 H$ Z& l" L, z, A9 Z) k, m# L$ ^& @/ Q
BYTE bBShift = 0;
* R8 H8 i# o* Q$ ?$ \+ gBYTE bGShift = 5;
  `+ H5 w7 N+ S' p7 ?/ L7 pBYTE bRShift = 11;3 i% H& W# R, g5 h! f6 H$ Q9 I
*/7 i4 q+ N; q/ t  |& E
WORD nXSize = m_wWidth;( w* F1 W2 p! i8 p
int nByteAlignCX = m_wWidth*3;//(((m_wWidth * 24) + 31) & ~31) >> 3;
+ q+ i3 \( k2 ~* h6 O3 P. ]. Q6 M2 d$ E# d, i6 `& @
str_Text.Format("%s New File 16Size %d 24Size%d",strFile,m_dwImageLength,m_dwTemLength);. z0 V7 S3 O+ s5 U9 `8 ^7 _
AfxMessageBox(str_Text);" U$ P6 C$ f+ Q) m- p8 I2 k
% |" @! f: @8 s
for (int nYIdx = 0; nYIdx < m_wHeight; nYIdx++). V* B2 V7 Y& \; O8 S) q
{
$ B" g8 h3 e4 X( ~for (int nXIdx = 0; nXIdx < m_wWidth; nXIdx++)8 y+ i( D' o/ {; u1 @4 `+ l& i2 e
{
- E; o9 Q0 \! L% Q//分色处理
/ Y- S7 G  `9 v, cbsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] ) >> bBShift); + p! \! R8 S8 A, r5 K% ]7 y6 O7 p
bsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bGShift) << 2 );3 Z% x3 c' u1 R& t; @
bsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] >> bRShift) << 3);
3 r7 w4 R; \* R- e( [/* bsBlueColor  = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwBMask) >> bBShift);
/ j, ~. z% V" }! }5 p: x: |& \bsGreenColor = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwGMask) >> bGShift);
& k! A$ Y. o$ E  sbsRedColor   = (BYTE)((m_pwImage[nYIdx * nXSize + nXIdx] & dwRMask) >> bRShift);
& n, a; S1 |  e7 G$ K*/
( c) Y- n4 ~6 |. f9 M$ s" \pOrgImage[(nXIdx * 3 + 2) + (nYIdx * nByteAlignCX)]=bsRedColor;- A- Q0 i4 Z% s+ b/ R/ {9 J
pOrgImage[(nXIdx * 3 + 1) + (nYIdx * nByteAlignCX)]=bsGreenColor;  x  k* p: T/ ]- u8 ^+ o
pOrgImage[(nXIdx * 3 + 0) + (nYIdx * nByteAlignCX)]=bsBlueColor;1 A3 f$ @- ?+ n# V3 |5 x
}
1 g9 Q2 x, K* Z}
  k9 W3 l1 m" v6 A; G. s! d2 l5 {8 D- o
DeleteFile(strFile+".bmp");
$ ]. C0 V3 L; K9 [     if(!m_SaveFile.Open(strFile+".bmp",Cfile::modeCreate|Cfile::modeWrite|Cfile::typeBinary|Cfile::modeNoTruncate))
/ p9 `3 O: |  r; D+ P6 U9 v {
5 l7 u! J1 ?: x2 q- A8 |9 { AfxMessageBox("建立文件发生错误!");! g" m/ T6 L+ H5 P3 W
        return ;
% \9 q; z9 [- L3 ^* L }
: i0 z9 R) `7 q" l$ t% C5 T m_SaveFile.Write (&bBmpFile,sizeof(bBmpFile));
2 d( t0 n) U+ h- j/ } m_SaveFile.SeekToEnd();& N/ D" {# a0 V) h& v2 R

, p* c/ y, u: T5 U m_SaveFile.Write (&bBmpInfo,sizeof(bBmpInfo));
3 W) x' i7 e1 r+ d) O1 b m_SaveFile.SeekToEnd();
" r! O: A5 R& ?# e' ~) x* @! f0 l3 Z9 \& o& W
m_SaveFile.Write (pOrgImage,m_dwTemLength);
3 f- O: M4 `( v% E$ l( n m_SaveFile.Close();) Z" [# x* h& \# w# ?1 I6 v5 k
, E6 W  V, V! F. l1 b; m
if ( m_pwImage )! t# A' |6 k* H, ?# v2 L
{ & ~/ @9 V+ K4 e2 s
delete m_pwImage;- x& _6 {8 N/ \
m_pwImage = NULL;
5 C$ N7 }" g, |4 S% k0 G1 r* q, \ }
7 ~2 a+ a: M. @0 e2 H if ( pOrgImage )
2 W4 K+ {5 }9 B- g { 5 H8 }+ [# [9 s$ C2 ?6 F
delete pOrgImage;( e0 y' F( s. [" e
pOrgImage = NULL;
0 H( S4 P+ S3 Y% d: z }
) s* t6 G5 ?+ `}/ j3 H9 |# Z5 u1 ^$ d
catch(...)
/ a, R( r1 p  K+ r{$ B$ l) B; P8 u. r8 g
}
( o$ E5 @3 c, c- D. h' j8 e}* T6 {4 c( A- t- ~! W/ U6 {

. x/ o. f( g; {4 i+ j8 t' s) G! S
- A6 [5 b. C* Y) v/ s该代码只能用于研究和学习中。请勿用于非法途径。
5 u, z5 b6 c& _1 A/ q, p
( c3 b) [  R, p( G- T$ j9 Q  ^呵呵。  Q1 f; L2 k! B/ b  X
希望谁能结决图像16->24的问题请给我发一份。不胜感激
& M/ \! O1 D4 p
0 i, m; Y3 s$ ^8 ?) @5 Y9 ^* J" M3 W* _newsoil@163.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 09:19 , Processed in 0.017189 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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