|
BOOL CPicture::SaveAsBitmap(CString sFilePathName)
: |& n5 p. i9 Q% q2 `//=============================================================================
, x1 o0 d3 J5 C# [( ^{
2 F$ F# d2 {3 w0 X BOOL bResult = FALSE;
! ]$ `/ m* n y* P# T4 }6 s4 m ILockBytes *Buffer = 0;
/ E: z. _% C4 b4 @4 x; m IStorage *pStorage = 0;& g, o6 @( s7 E7 d
IStream *FileStream = 0;$ m9 P/ Z1 k7 t/ `* ~9 ^
BYTE *BufferBytes;5 G- I! o3 ]3 k. C# N. E. s
STATSTG BytesStatistics;
, g7 V# k' a6 F9 m2 J1 c$ y# ^ DWORD OutData;! Q- K/ Z7 P U
long OutStream;
( [3 |3 Y" v K CFile BitmapFile; CFileException e;
8 M6 p3 Q/ Q) U5 C0 O% K) P/ J double SkipFloat = 0;5 ^: w& O1 R0 q- \0 u8 ^ k$ s
DWORD ByteSkip = 0;
- k! y" I( H+ E _ULARGE_INTEGER RealData;2 L- _' {) l* B+ ^0 L, }
9 G' u: f/ J2 u, ]' {- r/ M c U3 _* a
9 C+ \5 X7 {7 P! w3 I3 c# { CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
d/ t5 R$ w" U! i9 S& P/ ~
+ H; M7 S- x! g5 h
& n" F* E% t. z9 e1 G5 J2 K8 N; i8 _7 X% u( {4 Z" L7 J: b% v6 J
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
9 |, m3 K4 Z. I* @# I STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);6 u: E' W; k, w/ s
9 n/ N' R9 b2 B# P5 I* E4 A% S" L, k1 n3 Z8 g- T& }5 s
- V Q# e/ f) | m2 g; J hr = pStorage->CreateStream(LPICTURE,- x% q# u k1 ^; ~3 c; P- c8 l
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);
" n- v/ ]4 N Q5 T8 j9 u- |" x& g9 f P5 U( a& }; V' U0 L
' p, L2 _( ?8 w- A e7 G/ D* I& ~
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
& [1 u1 E* C/ f! Z FileStream->Release();
" H+ r; @, {3 A- l& Y! u7 y pStorage->Release();- ?5 n! V T. O% l' b7 `! x4 m) C
Buffer->Flush(); 2 ^/ {" d1 v$ F$ _/ n* n1 {
; R9 m/ N c$ P
2 N+ b( r8 O0 J* u3 L8 ~
' Y& j, _, j1 f$ m% ` j% X6 W9 i( {, h // Get Statistics For Final Size Of Byte Array
: C' G2 s4 _% y2 X" L4 s4 M3 Z Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
+ ^! s- I, S+ ?" }7 ~
' v6 I* W0 A( ]1 N" k& s/ b: r( G7 h& p8 H6 q t
5 O0 |1 Y. Q" m1 i3 s // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
/ C& |" ~8 T( `( q5 } SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
; m/ b- I# n% Z if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
4 b5 _; V& x! y0 f4 a4 w1 c+ s else ByteSkip = (DWORD)SkipFloat;
2 L; a* a( S9 b( H) q ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
/ P4 X+ E( }7 ]0 M
: Z, U. z& G) Y% }7 B4 z$ L // Find Difference Between The Two Values
$ _: C- Z2 D6 Y* x9 y4 ^ ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);7 _9 _/ Z9 K% `! k2 U
2 {4 ? O8 n( Q8 Q A" \8 V( e. P0 B# f3 F5 y Z) x
8 O5 @3 |% F Z2 v/ t
// Allocate Only The Pure Picture Data
) e3 \( M. k, U4 @1 c/ d2 A3 b' x RealData.LowPart = 0;
2 Y' D5 |4 w# x. ~& O) b RealData.HighPart = 0;
u- A) }0 L5 l1 o; O8 X* M RealData.QuadPart = ByteSkip;& X# ^% Y# Q9 M( H% J. W
BufferBytes = (BYTE*)malloc(OutStream);
$ z$ ?9 |* l* k$ P+ w) g if(BufferBytes == NULL)
$ E9 |7 @2 h7 @% U* |- B; ] {
5 c2 O6 P% u0 `: P3 G Buffer->Release();
9 n7 L; V, L9 s5 w2 E- u" p HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
8 p$ o0 y) L9 h) t3 S4 o MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
7 ^" L% S3 ?# G/ R) t }
3 g1 }' @% P' E
4 H. G$ n0 j0 T7 y0 u
9 X+ j% B0 y5 w8 K! |1 h n9 C
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);* \- M- G$ y: h! X7 y+ O! T& e1 l
" K/ ^2 ?, z6 |0 `! m/ _; }. D* v+ S& e9 D( `2 R' D' |
: f2 `; @# o. [" z/ D0 l$ b
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))* P8 r6 }! r+ V6 c
{
) x ^: b7 c/ O. a. ^ BitmapFile.Write(BufferBytes, OutData);
$ Q d+ s1 p2 ^; F# X" c' @$ F BitmapFile.Close();
+ w) `5 i& U* K# ]8 R bResult = TRUE;
$ Z, N+ h. ?, Q }8 q' ^$ Y& s: a4 l
else // Write File Failed...
! T1 s1 T) ]5 y. v3 P- \ {
: ~ q$ f: y) x' k+ j; I TCHAR szCause[255];% P/ I1 O/ }. q n9 P$ e
e.GetErrorMessage(szCause, 255, NULL);
) ? T8 A( p# l4 |. S HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
3 R' `& N3 {, {/ y Y MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
3 i9 L+ h8 r/ N0 h) y8 S2 ] bResult = FALSE;) v9 {$ V+ _$ e
}2 A$ m( Y2 P! N& I" z; Q
/ o" X5 b3 g7 v; r* R% ? \% N" z
Buffer->Release();
- K. E5 g/ [- } free(BufferBytes);
% P4 v2 f- n% i$ i
8 e2 v u S! |" I' j+ m
" L% o* A) E) d: A' S; Z* C2 _- u9 {
1 ~* [) z# m! A5 `/ v& b return(bResult);
2 W3 u: S# `. U* G) b$ V+ o} |
|