|
|
BOOL CPicture::SaveAsBitmap(CString sFilePathName)' C# p* Y- I9 N- p% d' J
//=============================================================================
$ I( @% c+ f: V{
w9 F9 H& e# w; P6 w b BOOL bResult = FALSE;
# K& Q6 k& O/ Q+ p1 ?7 P ILockBytes *Buffer = 0;/ T _) t+ C/ n$ A+ y/ S% g; ~
IStorage *pStorage = 0;
, `* Z: _6 h! C; s+ [( | IStream *FileStream = 0;
# _* ^, u8 B* @7 i0 q% [ BYTE *BufferBytes;* P- o! H6 k9 y$ ~9 Q1 X, f3 Y
STATSTG BytesStatistics;( A) v3 L. a+ z+ |) i% _! s" c* `2 ?
DWORD OutData;2 J* P% b+ B$ y( k. V; o
long OutStream;
7 T( n2 q. C! x5 M0 C7 D/ T$ ~ CFile BitmapFile; CFileException e;
2 k. C7 A! f. ?( W" p double SkipFloat = 0;7 t; u% {" O( o/ Y9 l8 h
DWORD ByteSkip = 0;9 o% p- l; j7 D' }8 g4 z/ Y
_ULARGE_INTEGER RealData;; t. a# j \+ R* R5 u
. _; d+ ~3 r {6 Q. G1 \
. `) w% Q: d( C j9 J
( W' S) m; _! _+ X2 n8 _ T CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
3 Z. E. X7 ~, R( {2 t! P4 Z1 }# `" X: l+ M
% ]5 B# X; _& D7 `& S9 R; i( A0 n
& B9 o% M4 E! L' b# O HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,/ `9 k9 o7 u& `- M* i0 b, l
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);6 K/ \/ [1 W! ^4 O3 |
( o3 u/ J& y$ y0 Y$ Y3 ^% n# s v, f& }
! s3 h3 W$ V/ Q& m! h% l6 d hr = pStorage->CreateStream(LPICTURE,$ j0 @0 M2 T2 ^9 z3 v) m9 @
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);
6 a2 Q: X' q$ n
: e! }! }# b( O6 a6 z# w, j7 `
' ~: F* c8 R0 S- D0 A! I
! R% q3 S% a) ^& q0 L6 W4 | m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream: i* X* n. |+ `, @/ t$ B, L
FileStream->Release();
0 L1 A& { B: A }3 _ pStorage->Release();
% U3 X" a( A$ t2 c4 z$ o Buffer->Flush(); 2 P) V+ ~' _; }7 a* c$ G
: r. U, E; `' N0 p* ? \
, K' w4 `/ R& H& N) W) f' W) k, H
' s4 \6 X8 ^/ @ // Get Statistics For Final Size Of Byte Array
5 Q" t5 a1 r0 F7 r2 @7 D) E Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
5 V: S7 |+ Q+ V8 a9 X- S* j# q/ [0 L, A3 ?/ U+ c# E! h$ t
8 y9 P- I5 a3 J: a4 ~0 A7 w% l( p% L7 }8 p* P8 b
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)0 w0 ~& M2 z% ^0 ?/ ~& A
SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...0 f1 l3 b' y: w/ H5 u7 C
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
6 [: h O8 a( S# i( X4 v1 ?5 i else ByteSkip = (DWORD)SkipFloat;
6 F# K/ g$ R$ T) _ ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
% D4 M4 j% ~- h* N2 ^- [: P 4 ^; ?8 g; h' F4 U0 y% o4 z
// Find Difference Between The Two Values) \5 w, j. @; P2 Y+ k5 o& G6 l
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
. q+ q3 Z1 P, Z' k9 N$ \+ D
( t0 `1 q7 R1 j+ J" D1 e
4 o- m0 i' n1 D. X% B8 c9 u. G) G1 W0 C5 l1 h0 k
// Allocate Only The Pure Picture Data' i: V: _/ n& H( E1 y0 l
RealData.LowPart = 0;
* V( |, r4 p# g. S, t RealData.HighPart = 0;
) j& x0 W' d0 I7 Z9 ?' J" e: ^ RealData.QuadPart = ByteSkip;
' y& s6 y; j9 O) ~/ l$ A+ f BufferBytes = (BYTE*)malloc(OutStream);
" B a4 j! r' Q if(BufferBytes == NULL); L! Y0 N: S) J
{2 _. G: P+ @$ O. f- r% q
Buffer->Release();4 d! c) P; {& _/ J: V" w$ {
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;6 }# y8 K; ]" q7 I8 `
MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);" n _% y8 h' M2 R: h0 T& d5 k
}
% v3 B' ^% c: `& N
8 H! c ^" H2 F2 m1 ?
/ R1 ?3 Q, e' Q6 a2 }2 x0 a( k" S( i1 s. |0 _/ T% u" W/ b: [9 u
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);8 M. j& V9 F% \# i3 ?! h/ _3 T
; e! h. t1 W& ]7 [! q0 C$ `+ |
/ h; ? b% i X; o( ]2 u1 i0 ^9 C$ U
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
$ T4 a) e; `7 b) u# i6 z {
, u* S, `* M9 M% V% M BitmapFile.Write(BufferBytes, OutData);& f* ?" {* g0 t$ k S0 T4 D
BitmapFile.Close();* O( R( U. e1 l" d, c
bResult = TRUE;$ U( C i$ ]+ U) L/ c
}
s& t/ D* X3 x4 u- E5 e else // Write File Failed..., O. t7 o: _; z% c' D
{
0 s2 d7 U: _, b/ h( R$ j TCHAR szCause[255];
# |+ T. V5 e! N- ^2 c$ ]$ K e.GetErrorMessage(szCause, 255, NULL);
* ]# f& N8 w. |8 I4 s HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
* m% \4 d, Y, z; l: y1 P9 u MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
8 C3 _3 _" o: Z8 N3 H, b9 Z( m9 k bResult = FALSE;' X" u+ O2 Z) I% A% A: k9 ?" {8 ~
}3 s# l/ x7 F1 i' m0 @5 k
# U$ g/ ?9 ^' C Buffer->Release();% B+ n0 j+ W$ Q
free(BufferBytes);
/ {2 |$ ?* U7 g
3 A* X) k2 `! i+ j; R3 R' ^4 \- f& Y/ n$ l& ]$ {
0 x3 r1 Y, ^7 G6 f+ T! |+ n" B
return(bResult);
3 q, z5 r l5 p} |
|