|
BOOL CPicture::SaveAsBitmap(CString sFilePathName): i. m% S8 M( q! r, `. l/ M' N2 B- h
//=============================================================================
+ P7 i6 B; k+ V. |2 L{
; C( @8 V( _, P; i" R BOOL bResult = FALSE;: d$ I" ~/ {+ x: H5 m4 T; P
ILockBytes *Buffer = 0;
+ S* o# U4 J# K) ]& W8 l* d IStorage *pStorage = 0;
8 @" K) q, |% `, t8 s }, y3 U+ J IStream *FileStream = 0;
. X) K% ~: q; [9 G, R9 F& H BYTE *BufferBytes;* S, d" M; I; }; c5 ]0 |
STATSTG BytesStatistics;
/ R# I9 t% ^, b2 @: Z& \ DWORD OutData;
9 n( ]1 G& X" X: T long OutStream;* V4 i6 Z0 r9 n: U2 w
CFile BitmapFile; CFileException e;
, F0 }; k5 B6 j) k, k6 v double SkipFloat = 0;
1 g+ J* N" g$ B! B- p DWORD ByteSkip = 0;
3 N! t7 q4 [3 E! S5 X8 [ _ULARGE_INTEGER RealData;4 `) h w4 K3 j0 L* z
- S- t+ }- g; j4 b8 B5 P
" ^4 j+ o( L8 p7 t+ l
# G& J$ w- H- b/ v% F8 y CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer5 l* `7 q6 I Y. E! t0 d6 Q6 H9 P
( `& `6 M* x# o- Y
( | M, m% [2 J; ~8 m! E
9 N/ V( @2 C) g2 R# q% ? HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,5 n" g2 h/ l# g
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);5 j, y$ P, l0 n" f6 h$ J: U, S
/ M; `. p) _/ R( i [+ E* b
4 Z$ J2 L# y) _ ~0 C. P* s4 e$ M3 i. J ~2 S
hr = pStorage->CreateStream(LPICTURE,. j8 c: |" P# i9 S1 s
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);: n) K" Q) E; ` V) ~
% N# t3 K8 G% q* P$ Q0 z& }2 ?! h
7 @- Y* K/ g' U, k' Q( \0 F* O2 P8 e/ @" |
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream. c' F, y- W( d3 e, `$ l
FileStream->Release();
+ U/ [+ s8 p. W# q" F pStorage->Release();. o+ d' I" A! G* Y9 |8 ]* ?
Buffer->Flush();
5 n& v% n- m3 P; f2 Z3 o# ]
9 X" w- C' q" X" ?/ E/ I
3 ^; U- c5 [5 h+ D; |! K8 H- s4 Q, [- i1 P- @2 R' Y
// Get Statistics For Final Size Of Byte Array
! V+ ^& g9 q3 c; ^$ h h7 i Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
; P+ L4 V+ C7 c- d1 W4 s3 r0 Z/ s7 z; t$ d3 O! ]* [
' b6 `/ O6 ^! {( @+ H4 I5 T$ d% L# T4 a- D
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
( |1 k% p" r s& G+ M SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
, o4 u# C/ T4 ~# M if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
% P! v2 ~ J4 V: \" R8 S8 D9 l else ByteSkip = (DWORD)SkipFloat;
_3 T0 o, N% v; X3 Z' ^ ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...2 u$ e* }7 r/ A& g6 V) p2 l* [
4 O) f1 t' K- R5 Z- V7 I4 Z( B
// Find Difference Between The Two Values
: W6 G, F, R3 C, _; b, w% D ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
+ E, S+ p7 p7 }5 t& |& ^* e0 H1 T& n# \
% y+ `9 m! i+ y% e7 K
/ D6 @5 L7 e6 x, L v
// Allocate Only The Pure Picture Data
0 q8 f4 t) r# l( G) m8 Y- n RealData.LowPart = 0;- K- O1 N5 h, E
RealData.HighPart = 0;
% \6 k9 F/ Z0 m* K& l4 Z8 _ RealData.QuadPart = ByteSkip;/ s( D' f( z, }5 w
BufferBytes = (BYTE*)malloc(OutStream);
* e8 @( Z. L8 G9 b b* I if(BufferBytes == NULL)
+ b% e3 L; F6 l {
% c. e6 ? ?& P: s1 d4 w3 \& |* ?' Z Buffer->Release();6 M4 W8 b5 P3 V
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
6 y* V, [! V) i1 t* x. | MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);3 w+ Z: k. S) g! j" @
}, F# ~. E1 _6 O% Y* i% C
3 G) ~' r, ^, X, {) X9 B/ k6 o4 t3 x( M0 \4 b
& {- W& W, I, I w7 d% \. t
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
4 H9 H; C3 B* d4 X
& W0 d# |% A7 F; B/ K) \4 K4 \. W
' o. u; p# h' ~! S6 z
- Z) l7 C$ ]! {: c' G if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
" Z5 H3 B4 }9 h" L/ R. Q {4 B9 ?8 E, j/ l: Z6 D+ B/ [. K7 t
BitmapFile.Write(BufferBytes, OutData);
# g. p$ O0 S( @, }3 k BitmapFile.Close();
3 A4 V2 C9 s; H bResult = TRUE;
7 Y* W5 F1 B/ _, Y! r ] }
' K$ r9 }( J/ z else // Write File Failed...0 h. U5 l; K) _ M9 d
{" U) n: z9 T8 _. K0 t/ j
TCHAR szCause[255];3 ~6 L Q& l+ [1 {" s
e.GetErrorMessage(szCause, 255, NULL);9 V! b5 D* V% _7 [9 M3 k
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
1 d$ U! r4 r6 h& o1 L( s7 O MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);0 z7 i; L* Q+ v" n2 f" M& o5 X: F
bResult = FALSE;
# F4 X, Q- S: C' ^ }8 ]: \# o+ c |5 O$ V* i# }6 [3 L
" K$ Z/ o5 ~( {# z+ ^8 n# V! q Buffer->Release();/ N; {! R% z1 C$ N/ b% W, l
free(BufferBytes);2 C+ W- {; {! ^4 w/ V. d# o
- i" l' w' i0 D( T3 R
. {0 i- C9 ~, {! t! `
: u8 V _" K* U1 ^% [ return(bResult);* l8 W4 p' A R8 W- g: }$ C8 W
} |
|