|
|
BOOL CPicture::SaveAsBitmap(CString sFilePathName): Q0 W/ R; j; d% ~0 j- k
//=============================================================================: l3 l$ [* z0 G( D4 ~
{5 ?! B0 H, J) z0 T8 D W
BOOL bResult = FALSE;9 b0 N; ~6 b& }) D, g8 Q+ q
ILockBytes *Buffer = 0;0 Y' G1 o1 r7 w: L" d
IStorage *pStorage = 0;* B1 W+ f' B5 p1 h) {6 b" O6 w8 a
IStream *FileStream = 0;
. z% k U, S3 y$ Q8 c BYTE *BufferBytes;* S4 E$ H. T; Y k$ I+ ^4 o* a
STATSTG BytesStatistics;
# s: J. V* v i$ p DWORD OutData;( w; S4 y% n) l6 F" h
long OutStream;
3 r% f; J3 W, d0 W. } CFile BitmapFile; CFileException e;
" G. m V, u1 T! Z double SkipFloat = 0; z1 H8 p7 q* O! B
DWORD ByteSkip = 0;6 m$ ?- c- g$ V) J- b' L3 n# @, n
_ULARGE_INTEGER RealData;+ @" M- d: P, y. j
9 j7 x4 ?7 |- O" l+ L' o; P/ T' Z0 V/ t# O; w
: a3 ] t6 |6 v- A" b, X
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer: ?) x; w; ?8 e- H, a! n
" C Z* w/ A9 T- X n& D& r( P( [- Z* S$ y
% C6 O4 s9 a4 ]5 o8 m! E$ \$ c1 J HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,: S$ w. \9 y/ _
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);$ i+ H+ l, E8 M* m7 P I5 x
) D. t7 y* o2 t
7 [* B3 ~1 B8 K4 \3 d4 v9 G+ o7 Q- B2 n" l( s$ W+ X- L% s( ^
hr = pStorage->CreateStream(LPICTURE,8 H2 ?6 V. ~! v( J% }( v
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);: A3 ~: e8 L6 R7 E6 c
/ C0 m5 U3 \' z7 |, u( C' ~
: @5 _2 A s% M! G) I' c
( b- y: `. t: F& k m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream' r% C1 v) m/ B, J
FileStream->Release(); L( | p" B% x- L" t, s! T
pStorage->Release();& d4 M2 U% g/ I( L
Buffer->Flush(); 3 I: A2 T9 P: [
# ]; J9 N. [; k% D+ t' P$ [* d
9 }: d' ]# m! N1 g, _* K7 {- h6 v+ p3 b X
// Get Statistics For Final Size Of Byte Array
* ~% O) @& I! z$ d8 v6 _. x Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
4 J0 {" W% W1 B! ^) w, C" R' h) J/ V& Q" L- C
8 Q g* e* R/ j0 X6 m0 G, |
. H( I) z* T) V9 n: u // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)0 e% ~7 N n8 p0 v+ Q8 c3 E
SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
8 Y" O5 e- r4 I7 N2 M8 a# q5 T if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;6 O4 A3 \- e0 p. Z
else ByteSkip = (DWORD)SkipFloat;
/ Y9 \2 _- k8 t* s5 D ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
; @( Y$ d2 R* m( M; j. _) U$ v 1 {" V1 U; u6 o! i5 r6 M
// Find Difference Between The Two Values Q+ @' \4 {/ h7 j2 U
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);0 f ~$ i9 v8 ` i
& e: T% M! U# M9 o$ t; D5 [- [' \( _( \, g9 B6 _$ _8 i2 P; p7 t
+ | R$ p8 }' v) R$ |! q2 G3 q
// Allocate Only The Pure Picture Data
7 Y$ H- | V$ j0 [; l RealData.LowPart = 0; N+ H2 j& ]* u& m6 l! u
RealData.HighPart = 0;
3 ^6 `$ c- L5 `3 J) Y# f RealData.QuadPart = ByteSkip;
. K: V9 I# U% _- h( s. t1 r BufferBytes = (BYTE*)malloc(OutStream);* S; ]( D1 ^( |; \& r2 n
if(BufferBytes == NULL)
! l$ K% f& M/ U* }) n/ \/ C {
& U }. R* O1 @6 d Buffer->Release();) n8 o% I4 D$ }4 ]
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;& f; u8 \, z. v; h
MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
4 P) @" Y% ` K9 g }
, x5 E- _3 W$ Y% E4 c! ]; p. r$ i s H. h+ H* z1 ^. c" W/ @
, O7 U: }" C- v/ e
) t8 J. T) |/ d+ b Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);, S+ M& ^7 m7 } C( ?. P3 p5 u
! r/ ~& W4 Y4 {/ W
; x3 g; C3 S+ ^" Z) \$ Z6 z' I7 {. i9 M( e* d
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
: V+ I" A# S: M {
& @2 Q$ t4 ]5 z2 r BitmapFile.Write(BufferBytes, OutData);
5 x+ g& `4 Z) P' R BitmapFile.Close();
" \- p! i+ w# S bResult = TRUE;
3 Q7 ~+ X# Q1 X5 S }
8 E& \+ l2 D* I* w; s else // Write File Failed...
" x0 A- T) o4 n {
& ?/ ?, H6 g3 O# X1 { TCHAR szCause[255];5 T. a5 o. J% S: T& u9 D' V' [
e.GetErrorMessage(szCause, 255, NULL);, N& F& \6 t2 s* [3 ?0 L
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;/ F+ }' a/ U9 b% j
MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);; J' S2 f) _6 h! C! W
bResult = FALSE;# W, D" d' O7 W3 Q' H& y
}& R% R* g6 [7 Z# _* V7 p
4 v+ r! t" a4 y( b$ q& ?
Buffer->Release();
+ R/ @4 G1 k" M9 T$ N+ \ free(BufferBytes);( _! Y0 z+ Z; i$ N2 O
' j- n' U3 _ v0 Q3 E3 s4 A/ r
& j4 ~: E o5 a1 [+ ^9 E: Q: p/ W- A# P
return(bResult);
- |4 u6 J0 @$ \$ Y: Q} |
|