|
|
BOOL CPicture::SaveAsBitmap(CString sFilePathName)8 Y- l- h# D/ g. _* C* y
//=============================================================================* O4 k% U. j& C1 A% p4 y
{
& Q" o: Y' t: T! O% @2 |; n- M* v BOOL bResult = FALSE;
- o, X; }& v5 N2 w. T1 L ILockBytes *Buffer = 0;
- Y4 H6 \: }/ ^' Q5 Y. H! I" k IStorage *pStorage = 0;: A1 v: f, @$ z7 V x
IStream *FileStream = 0;
v4 c) C' [( B$ I" p BYTE *BufferBytes;; ^7 x1 V1 v8 s m" s$ l5 j
STATSTG BytesStatistics;
& @/ r8 J/ X* a( d DWORD OutData;
' W- k# m+ l' F4 ?8 r long OutStream;
0 ?9 d% [$ n* W CFile BitmapFile; CFileException e;
7 d- d. L% F6 V* \# y- b3 x double SkipFloat = 0;8 `/ j; k; F, }$ U) ^9 K, Q
DWORD ByteSkip = 0;4 P- w* ]3 i. D) @6 u- \
_ULARGE_INTEGER RealData;
+ i+ S+ W/ ]" P( [& ^$ P. D" R2 E+ J- y8 K, |- P. d J% d) C
z& {8 E. o5 b
. W' {8 i Z3 X: E CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer* w9 `+ D3 B' O1 ~0 q; u4 \- P; t
% w' f" ~8 t1 D; |/ X4 y* a0 h8 g1 T) J6 ^% O
; d/ o) u9 k% w8 r5 D
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,0 X* h( Q( \7 s) B
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
( K8 [! M2 t4 H) |
9 f9 S1 j q) h$ D' d& l
/ F: X5 g& f2 G# ?4 D* [1 F, ]5 O- A& l* d" X
hr = pStorage->CreateStream(LPICTURE,
5 ?3 r- {1 r0 B- d- f STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);8 B3 Z8 B5 _' s& i4 P C
9 C: u0 Y7 @$ }$ r% ]2 R) s" p& P$ c6 G4 y; C7 G: V
. S1 d/ b5 j! ^ m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream* Y/ n0 k! {2 g3 q3 G% t+ M
FileStream->Release();
# {$ A/ y0 z+ l4 `, g8 P1 u pStorage->Release();3 u3 l: m+ T2 {% E4 I; G
Buffer->Flush();
, Z; s, n+ x7 z* j# F4 O5 z y& ?
) b0 { B! S( h: X
( E& [; w* T- S. X. ~9 d( X3 J! J6 U4 K. N) N E
// Get Statistics For Final Size Of Byte Array4 P7 w, z* o) u5 I! m. u
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
# _3 B+ E" R1 K; y' R6 o' `$ p; G9 _/ r3 |
; O: I- @' V2 e W# F4 ?& \, r7 G5 j$ z% C
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data): K" d* c% a4 p7 |
SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...- a. V& `) N! V+ y$ H+ N
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;, U/ j- I1 Z, m: B6 P) j# x1 a) t
else ByteSkip = (DWORD)SkipFloat;7 X% V* Z& q! F! L' l
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
8 ]% l9 A+ N5 j; V
; E& w9 N/ F+ I+ `# D- @ // Find Difference Between The Two Values
" G# U7 b+ |% i: h; \8 i5 ]9 s ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);) f7 i* u0 E9 d' Y5 b
) Z4 r& Z) d. E, I% d/ r
: i+ V, J; v4 f9 o$ \& D. G$ }
+ P* z/ g* [ j8 F7 |' F // Allocate Only The Pure Picture Data0 U, Z% _, z K( Q9 b
RealData.LowPart = 0;
7 i- E" t. C. g6 H7 S RealData.HighPart = 0;
/ L; i5 Q. `; u2 \+ j P RealData.QuadPart = ByteSkip;6 P& G6 N9 r" c( t* [; L! t- a( T
BufferBytes = (BYTE*)malloc(OutStream);
7 v) r& y& A" q) [ if(BufferBytes == NULL)
( F. X7 q( |4 c$ E {/ _6 c1 Y2 R% _2 C) v+ F
Buffer->Release();" O `# u0 z4 |
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;5 _. F+ c% T r$ v" [
MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);1 c7 D! b, _, _0 x% M- Y4 S5 o! G
}
+ f/ _% y) I! o u1 N9 {2 j4 [+ E0 U0 W! `4 y& u
; a& W1 d9 h) Z0 d9 u l& f
- P# O4 ^& r7 L; k) e- J Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
# V3 i" N j0 b4 b% X9 L4 ]0 ~& m, y& K! m# \
) l$ |, {! D$ [4 p8 s+ ?$ ^. e) a+ a: {9 L7 k; ]0 Z* d
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e)); L; F! E, C+ M/ Y* Q! V( m
{
* Z- w- m0 r6 g/ t BitmapFile.Write(BufferBytes, OutData);8 s- J* Z( L0 I( ~
BitmapFile.Close();& K, u1 i5 D1 y$ w, V' d
bResult = TRUE;
/ H9 B6 ^+ w' {: L2 U' q0 x0 f }" I/ Q v; C& \" M' Z
else // Write File Failed...
' u( h0 y( t j4 C {* U0 C1 x/ ^# R8 x- p
TCHAR szCause[255];! P2 S- ^! P: l3 z& J
e.GetErrorMessage(szCause, 255, NULL);$ o7 Z3 s( w& A2 u( z+ P
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
3 H" a5 G* g' j( m- A6 P MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);6 }. z. A5 ~, \; A, x
bResult = FALSE;
" W p+ H, a4 [: B( o4 G }' n2 r, W" l4 | d% k6 Q. I
) k$ @2 T# N" u
Buffer->Release();& D( o& Y3 e5 v( T6 k- l4 L
free(BufferBytes);
" c: v: g* U( ?/ @/ w. f5 U
7 F9 t4 u- x0 C
. V, Z& ^0 q+ r# a4 e" W- o' ?+ ^' n, j" t
return(bResult);
1 q+ k6 z$ f& ?5 }" \} |
|