|
|
BOOL CPicture::SaveAsBitmap(CString sFilePathName)7 E& s( j e6 `* c% G5 d: \/ L
//=============================================================================
2 }6 O8 W0 r* \' j( F1 T{4 P$ G* N+ n0 e- o _
BOOL bResult = FALSE;8 h* @6 t9 C1 p$ y9 `% e. e
ILockBytes *Buffer = 0;
2 {/ e( t- P5 s+ ^7 A# z1 ~3 S+ D IStorage *pStorage = 0;' ~, K. u# V+ _' I1 W! l' Y
IStream *FileStream = 0;
) I. O" i T& `" P/ k BYTE *BufferBytes;
0 ^$ j8 f* C# P1 [ w/ E STATSTG BytesStatistics;3 C E1 I3 V) p) h. k9 Q' d5 y
DWORD OutData;6 W0 ~" _4 Q/ Q1 V! S
long OutStream;6 i0 b+ E( O( j! c
CFile BitmapFile; CFileException e;# T( \ T2 P! x. u" [# K
double SkipFloat = 0;8 ?2 G# b& w/ B9 V
DWORD ByteSkip = 0;: f% Q( P, T9 [4 h* @2 W
_ULARGE_INTEGER RealData;
- a4 A6 i( h3 d# ^9 q
. W8 x9 V% M( w1 j
- q' U8 u% K) e/ A& B
: b' ^. d( o+ J* R% {( w CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
7 |- i# f0 J+ X# a
% z7 X( i0 Y+ n% D, {1 y4 p. g; \) h4 u
) d% Y! p$ t, k D
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,1 {$ G/ q2 s. \% O, m
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);! x* B4 W; o& @( \
w$ [4 C6 D0 j/ ?
: q7 `9 T* @8 P. l" F. L b' _) v7 c, j+ u% m" y4 k6 e/ D% p
hr = pStorage->CreateStream(LPICTURE,' D( n5 f1 W3 L5 c* j
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);* ^% Y% @4 Q, D' D: O! r9 D5 u
' ^7 R5 [( `2 o- W; R2 s; c4 i$ H1 Y9 N* _. [; l5 X
! i" b0 H3 K( z. a' \. \ m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
" P6 o R5 I) u: G' ]8 i) x# y FileStream->Release();/ {& I& J0 P4 k n
pStorage->Release();( Y5 a0 X2 x, K) G8 E% L% D
Buffer->Flush(); ! x7 W, m% s/ A% N9 ]' k
" V& @& y' r/ x+ v/ ~9 j B
& e, e' E4 P8 g" d* i
0 G5 S+ U" o2 k& S: V8 \
// Get Statistics For Final Size Of Byte Array* e$ Z' t% p3 l$ q* Q% F! ~
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
' c/ E, d5 v1 g6 S: B
! B+ K) ?# P, u/ H7 Z. J C' i& } V" p4 m/ B6 G
9 m- N& U. b! ~8 Z0 p4 B/ E# \1 u
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data) l7 v7 N U% D2 ~9 [5 @7 Y
SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...! r6 J+ j, n/ Q$ e. o/ @# X
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;* @0 c7 N7 {6 l8 `" s e
else ByteSkip = (DWORD)SkipFloat;
4 o! H, i6 N9 I% p ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
1 R7 R) F p& I6 L2 \6 {: |
: g# |8 X+ e* p3 N- R // Find Difference Between The Two Values
5 K7 g* x6 C6 i6 Y3 E# @& S& {$ C ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);& b7 m0 N, l# p/ M* b; ~
7 g2 O$ O+ i- `- s0 F3 ~3 \& x
; [8 L# Y+ q, E c9 p
6 X! R' k% s# D1 I# x // Allocate Only The Pure Picture Data
: a3 a# k8 v% G6 l3 k# C RealData.LowPart = 0;
6 a4 F1 I( y, Z3 G RealData.HighPart = 0;% A+ E$ x! y! g+ l2 d" n
RealData.QuadPart = ByteSkip;
; c! e7 X! I8 e- y- T! E BufferBytes = (BYTE*)malloc(OutStream);+ e2 w; t2 q: l8 c& @2 m
if(BufferBytes == NULL)
0 g, x' Z0 d! f {
( h7 v" f/ n2 V$ |& p Buffer->Release();( [$ l3 U6 h, S; r0 l' R9 E: y1 k4 {
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
S) n# j6 G* t- f$ ?1 W MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
4 y, `) a1 C4 t2 H5 h+ H }( T5 }$ t, B" l, s3 J) d
' H+ Z+ n( U0 l8 z
0 ?5 P9 t( e! V/ n% f8 D, Q0 N4 B4 H. r& D j( s$ f- }& k
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);% F2 K# u, Q; E) x! N l% P2 U
' V! [' m( _% T$ f$ N# G6 T+ H: I P
( C2 Y! E, D' ~1 M# [. p$ @
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
[$ {) Y" _2 v4 l" |9 v9 V2 Q$ B4 L/ j {
" b! X4 N8 A$ s* y0 S BitmapFile.Write(BufferBytes, OutData);
9 [4 k: ~3 i# V) i BitmapFile.Close();
5 r5 d A& e1 O. t- v) }. t! n& Q4 c bResult = TRUE;/ E: W U+ u$ w, x
}4 a$ q/ f( g4 [+ G( B0 N& o
else // Write File Failed...
; Y5 z+ ~+ y( k0 t$ f {: r! V$ t3 h' V$ k
TCHAR szCause[255];
' n7 B- B: k- N2 ?1 Z$ z2 R e.GetErrorMessage(szCause, 255, NULL);/ L6 H# g; b7 @6 S& E
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;, m& E1 ^) j e
MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
" y, ~2 L/ g* W0 z1 q3 I bResult = FALSE;: w: ^' ~ i9 M, R$ N
}
" M7 @! F, o; u6 r+ B
+ c7 r% F9 m G. j2 y. r X1 u( z Buffer->Release();
+ |8 z$ ^" _2 u) @% L3 E free(BufferBytes);! L( I* C' ]! U6 V! I
- X& r: ]" p# ]+ f# \$ m- M6 H% Y: |; ]6 W2 b1 x) j# N2 Y
$ a2 t f1 x' H3 l
return(bResult);
+ c1 F" _* _+ K- s( Q! z. K! ^} |
|