|
|
BOOL CPicture::SaveAsBitmap(CString sFilePathName)
. Q4 }9 M+ Y2 z* A/ y4 q: P! \9 r) I//=============================================================================
* }; ~- p- e! x! N{, h6 o1 R& T0 }+ O% b% F
BOOL bResult = FALSE;
1 M/ f" v5 j3 b4 } ILockBytes *Buffer = 0; o" R8 K# [9 j& o' M5 Y# ^5 ^( z
IStorage *pStorage = 0;& a; i; F9 \5 C5 T5 \; l8 I% D
IStream *FileStream = 0;1 A) i* U, h ?) J; o. N
BYTE *BufferBytes;
2 g/ l, M3 S# T Y8 U: E. f' O5 y STATSTG BytesStatistics;
# o3 @* Q$ w5 F- L( c$ a' X& W( q DWORD OutData;
2 A6 u' |* Q; y M u1 X long OutStream;
. u3 }8 T- v9 W3 |/ n: o CFile BitmapFile; CFileException e;
7 A1 ]- |- c3 x% v5 \ double SkipFloat = 0;4 n: L6 E4 B6 y+ A, R* g9 I% I' |
DWORD ByteSkip = 0;
0 N# _2 j# e/ a Y1 ^& w, `6 x. t9 F3 t _ULARGE_INTEGER RealData;1 H$ S" v) I2 t# e: Y- F' l
1 z; e: r7 N l0 f) O% E5 l0 A" ?' h, S; G
6 k5 `/ M0 }' B( H! Y0 A2 N! z CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer1 U9 p' h! [! D9 g
3 G$ K2 r+ n; z5 \+ ]
- l5 O: H; {8 v4 A9 x. `
0 S9 }" D6 g$ P1 j0 D9 v HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,. j0 L; [5 f% ?' H M$ t1 M
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);5 \1 M4 q- @ v! w: ]5 a! |
' Y. }: {) v' l2 h! a* B' v# t
) @1 E% Q$ _# g; {
+ S$ o1 l4 M: `* ^' N hr = pStorage->CreateStream(LPICTURE,
: U+ {) l; f! W6 q: w; a$ h! o STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);5 z' K6 V! A4 ]% t+ ~
6 m6 g, ^- W7 ~$ c" }
f- E1 j- J1 X$ Q9 S; |; u
- ]& b- }4 W, ?# c6 g6 L1 _
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
% ~; Z' s- b# b1 F FileStream->Release();! y0 O( [4 Z {+ b$ Z: a# D! N. [
pStorage->Release();' c" w0 U' _7 s0 h4 N
Buffer->Flush();
" ]! R2 ]% k X3 Z6 B. _2 t8 B. a3 z7 K8 Q8 c# C( I6 H
7 D% M5 D, O# R8 X# q/ O
- r# _1 {6 @* ^ W1 V6 f1 H0 _ // Get Statistics For Final Size Of Byte Array; D3 o% n4 l) y# X
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);& o- g& e3 G5 u: ]. y& a
4 Z) c8 A$ S& [+ G* x
~ I0 G( ~+ |
$ r* W2 O2 `% ?# S$ I4 W) p+ Z5 _4 E3 x // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)+ o( ?7 Z+ d+ u7 Z* W$ a
SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
! R; p4 l% V1 f if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;. F% L s+ _9 t- N
else ByteSkip = (DWORD)SkipFloat;* ` G( K# E& @) J! a7 W; T |
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...7 {7 ~2 q/ K0 v2 a, j
3 Y* ]0 I. }8 m _ m4 f // Find Difference Between The Two Values
8 e+ c1 z0 j% A ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);& N( G4 A# B" C8 r! r& m
" q$ \$ A" `9 y4 t2 I, b1 x7 G, }1 I
! w' m c. [/ e; f! b+ [ // Allocate Only The Pure Picture Data6 s9 |8 D4 u0 `" |' O+ k. r, P
RealData.LowPart = 0;
1 @6 f0 C# y6 O' E2 q RealData.HighPart = 0;' C2 S, I6 R+ D) \" \
RealData.QuadPart = ByteSkip;
* M" @0 D- w: Z( @ h( h, _. l BufferBytes = (BYTE*)malloc(OutStream);
/ [: Q% h1 a B) J8 T if(BufferBytes == NULL)" G* o \3 W) B9 q
{7 I4 [1 ?5 r! p0 a8 [7 _/ `
Buffer->Release();
0 j1 ^5 e+ Q* z. ?2 k' e HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
7 I) T o9 ~" T3 }. S MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);& H: V) P: k+ V/ z
}1 r+ J$ Y& h# V8 a! O9 ]
& `( Y7 K3 x8 J" o$ V: i+ X* M! F; o% L/ R1 @8 r
, z/ x' a6 H2 O. U! Y T
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);2 p2 y$ ~+ s2 R7 c- G9 ?4 f& P
- ~0 h( r; C& R4 y& ?9 Z2 ?
: ?: I9 J) x7 y4 k, D- T4 h- S B( J- E2 |
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
8 E. R1 P$ J% J7 _ {' J/ ]+ X3 {0 X% m0 O
BitmapFile.Write(BufferBytes, OutData);4 N* q( w4 W( g# | X
BitmapFile.Close();/ l. K# j. [9 _+ o+ _2 V& \$ ]
bResult = TRUE;
6 [6 Y# j, C' U- [9 [- P2 W4 q }
" ?: q: ~8 @6 W$ L else // Write File Failed...# z. w# P0 S8 w, W( J8 h
{
1 b: i9 X6 G; H TCHAR szCause[255];+ M, {6 L2 a$ c
e.GetErrorMessage(szCause, 255, NULL);
; W) {+ N `% z* E) G, ` HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
x( Q# D7 T$ Y- k* D) S0 b MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);. r/ g7 H `' _0 g2 p6 B
bResult = FALSE;
; Y, z! q+ G) B% T, r/ l. k }
+ U. c* ~' g# W. x8 |6 [
' j0 Q3 l4 J& g8 ?6 E5 i' D" r Buffer->Release();
0 p/ i, W. h5 [4 Y: x" q+ G+ q free(BufferBytes);
5 M* s a9 ^* x, E$ I; E+ ~/ I J5 F9 ?0 P3 `* ~! u
! D( P* e4 ]1 V4 L% t( D! M5 N8 l+ F- j5 M F* b& \
return(bResult);9 s7 i5 C$ X) f; K+ R
} |
|