|
|
BOOL CPicture::SaveAsBitmap(CString sFilePathName)
8 ~8 m& f% a& T u0 X+ t1 m//=============================================================================/ U0 ~0 J a/ r: F. x( }
{7 S" l5 F7 Z* @$ F+ c( @5 b. T
BOOL bResult = FALSE;
W5 \7 I7 i) y& K ILockBytes *Buffer = 0;
9 u8 p0 H" o5 s& y IStorage *pStorage = 0;8 Z2 M+ _' B& i r& ?
IStream *FileStream = 0; V# X& s0 d- y% o3 R6 L2 W0 h# x- G
BYTE *BufferBytes;3 i5 d7 V7 i/ S; w2 H
STATSTG BytesStatistics;6 [" L. J+ E% N- J4 a2 {- y8 t
DWORD OutData;
S. h9 z) N& t0 ~. ~ long OutStream;+ G$ m* N* d7 t9 @' [ L
CFile BitmapFile; CFileException e;2 m- s5 j3 Q8 R9 G3 O9 [8 q; H, ~
double SkipFloat = 0;
$ {2 X' ?! v6 A6 e DWORD ByteSkip = 0;
* E7 D, z9 ?# E+ Z' X0 i8 _7 t _ULARGE_INTEGER RealData;
4 w- S, y i+ {9 p* i7 d: |4 o+ I6 V+ E; }% o
8 y5 `' I. {9 {; ^
( C; ?4 W$ P8 f2 z0 P6 y4 W CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer8 i( E. \8 A0 M! P3 B
5 }' x; O/ j- R- z0 k3 V% ]& R* {/ ^& x0 i0 W E! ~4 n; `
% e8 g$ @- T- a% [ HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
3 x# m4 o( i" S) l7 b( x STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);& n _0 Y5 r, b) S4 H
4 {- e& {0 n% L' f7 H% e* |5 G% u+ m
8 N+ J4 t- z) F; q hr = pStorage->CreateStream(LPICTURE,( R2 g- \5 s# S6 Q
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);- H/ A' k# H% M) q3 Z- i
# K! A/ B/ b) F1 B' l1 V# X
X% C8 j+ S% ^4 ^. v2 z6 L( `3 c3 S" v$ @3 k
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream0 U, l& D( F: _2 o+ E; e+ j/ |! M
FileStream->Release();
/ _9 {# ~" i# k$ Q6 l }$ G7 @ pStorage->Release();! d4 s9 q+ E* V+ ~( G
Buffer->Flush(); : R1 H6 x8 \, N* ~$ c
& x4 [ j7 C$ B, K) J
, ~; q6 U: C, L& z; I0 _& Q( `9 y- t. g; R) x* A6 _$ z: f
// Get Statistics For Final Size Of Byte Array
- B! F0 V, I0 s' n4 H: |/ j Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
' m M$ e+ S1 E) u+ y1 g/ Z# J0 V2 }/ S! q" W3 Y( v
0 s3 ~& M1 S* U; a w* Q* ]- C1 D% u
+ f1 I% z( i- k // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
& _' r, S [5 ?) \; Q. V SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks.../ C' ^0 f2 E3 y* k8 S4 A8 |" ~# x
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
4 E; I, B/ V: n" \ else ByteSkip = (DWORD)SkipFloat;1 S' L9 K' r; @( X
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
9 x: E. }4 Y" d2 R5 x( _6 i$ b) _ 6 d) X0 I2 ~# X1 T. x/ ?3 Q# ]
// Find Difference Between The Two Values
! Q9 |/ f5 p& ?6 r8 J ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);" P( f: T* f- R+ f3 g- U' \# W
2 w' C4 R8 j2 k) G) a3 W
! W& P% R8 P1 ~- b8 y7 @8 t0 L# |1 Z2 @5 I& X# I: T6 h
// Allocate Only The Pure Picture Data
/ o5 [3 `% B: G! h* B6 S RealData.LowPart = 0;, ~5 p! h2 E, M# t( ?2 @8 t
RealData.HighPart = 0;: p/ q6 i9 V- ^" o4 M% D( y
RealData.QuadPart = ByteSkip;* d; V! `. V# J$ h( b
BufferBytes = (BYTE*)malloc(OutStream);
, u, |" _! j4 |+ v+ Z if(BufferBytes == NULL)* L. c3 A" T" o8 o0 ^& ]- J
{
0 S8 D5 E% N% v( I' u1 _6 q Buffer->Release();
" H' Y! G( ^, Q/ L HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
! I% l6 N, G7 e. g% L' M MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);! L; c6 h$ b+ R# D' `
}) |) n$ Z1 b3 D$ `, W) ^2 X
$ X6 a& H# _8 ~7 W% h6 l6 o
7 X1 }8 k- [ Z- U' F4 r6 f* ^
- v3 Z; G4 ~2 X. G q Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);2 j' T/ ?# C+ A1 g0 T
% j4 m0 F; x* F& ]9 G1 P
7 y# e1 x" l+ g5 y1 d4 ] l
/ }. _3 }3 @* Q6 ~5 g2 R8 y if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
0 ~! k% G: ~' S3 P {
# Q! g% I K( w3 s" k0 h BitmapFile.Write(BufferBytes, OutData);" x) r d% c7 X7 v6 S3 ~0 p
BitmapFile.Close();
2 X' @' D* r2 c' d bResult = TRUE;8 I2 l- v& ~2 ^" U% l
}6 Y% ^) G3 Z7 L1 `1 [" W
else // Write File Failed.... r9 E1 X, b) K F- b1 S1 u. E
{" x0 o3 i; t, o2 r
TCHAR szCause[255];
( L) |! W" f f4 C5 ~ e.GetErrorMessage(szCause, 255, NULL);
7 S1 p% }- c+ Y5 z' t( Y2 U HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
9 ?/ K* W# T" N MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
0 {) b; D k# f9 m) h& ]$ T% c$ Y bResult = FALSE;; \2 J/ P0 n4 W" w- w; E+ x
}
, G7 ^1 i4 N; a
6 k3 C/ \! }: o6 S$ j/ p Buffer->Release();
/ r f: a7 D1 T3 N$ { free(BufferBytes);: [4 `0 w+ p. V, n! l0 Z2 h
+ e) R& g9 `& n2 x* \: w$ Q3 L
J. ^7 A ^# Z" L/ S: H! N! ^
( x2 H R/ ?& u- P9 p% O) s e return(bResult);
$ I& [( `1 f3 L2 f5 ]7 m+ U8 W0 J9 g} |
|