|
|
BOOL CPicture::SaveAsBitmap(CString sFilePathName)% s6 b. ?. p3 t* `% o
//=============================================================================- ^' F. H, h+ t1 t5 w
{ j3 X/ K! e! t5 ~' x) C
BOOL bResult = FALSE;/ s# J w# E0 @
ILockBytes *Buffer = 0;
5 N9 O8 W# ]2 d# p IStorage *pStorage = 0;
* m5 ~3 I' I% Z# T" ~ IStream *FileStream = 0;" k1 X& C! c; }+ u' A+ Y
BYTE *BufferBytes;
" S6 F4 z2 V' o& K STATSTG BytesStatistics;. ^. o0 g- B4 i! h" k
DWORD OutData;
& _: e% _9 w, Z long OutStream;- ~+ h* {" E5 ~+ A, d' d: V' w
CFile BitmapFile; CFileException e;# K/ Z, e/ B) K# s2 h: D$ {! s& d7 W
double SkipFloat = 0;
3 r% Y' Q, c* q' x) A DWORD ByteSkip = 0;
: F. _4 \+ j/ x% n8 X b6 j0 A _ULARGE_INTEGER RealData;
/ i. e2 U; i- Y9 B3 O, \6 u* q0 G) D% `* `- G3 |: r) ]; Z
- L# P! {( t/ `7 I# }$ H1 V; U" P& U! |
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer) D- Y3 z( |. v7 \2 l5 P+ Q( w( m
1 M$ g2 L$ l8 ?6 D( q% C- C
. |" z7 u% w. Z4 W& E
8 I1 y4 ~2 B4 X, ^ S" K6 x HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
$ `; ^! a0 D; `# U2 {# i STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
! y v2 J6 c6 K: x5 k, U9 b" l, j- A* R( j7 }
9 s+ W7 x8 ~+ s5 G3 \2 c
v- g \7 a5 G6 u& ` hr = pStorage->CreateStream(LPICTURE,
+ f- ^6 b% ?; k. s7 f STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);# r4 d/ s! p! u* K
; e S: p8 x/ E* u+ F3 Q
L) }) `5 Y; P. Y, W+ F2 x
% N/ @* `+ l, i
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream5 ]2 v: W2 L- G- F$ G& {& o
FileStream->Release();
) E$ `/ i: l. f( _' v pStorage->Release();
E/ t' N, x, M o. e Buffer->Flush(); & H, r# x" `. |3 P, m
- O$ T; Z3 u$ @1 l# o3 J: \
5 x4 H9 b4 I3 v+ c
8 h0 a2 e0 K, h // Get Statistics For Final Size Of Byte Array3 W- v/ p* E6 e+ l! K3 O
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
6 F4 m) }5 c" d) p- e
- x/ e% T4 z8 W
: Q. Q- X/ i/ _ F0 ]2 t. F6 R
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)2 |, z$ a7 ?5 U: c, A6 @. @
SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
8 p3 ~1 d2 w9 L3 \. e* P$ v+ G if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;1 ~, T1 Y. v5 ]- a; f+ b0 L+ \
else ByteSkip = (DWORD)SkipFloat;
) ~$ r, M# |6 D. b5 [' b ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...8 E9 u# `" @- i* ?
! D3 M3 r: h; ]& ]* Z& [, \0 e
// Find Difference Between The Two Values
: m, ]3 ? s. H8 I, A3 `# g ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);6 g. ^+ M) T2 k! o, q( j0 p
\8 I9 z7 t9 m8 V7 M+ `8 U* v
2 b' F2 J+ y+ P4 A- Z
2 V7 ~* Q# }/ O$ W2 w0 V% g
// Allocate Only The Pure Picture Data
1 ]6 s9 F4 s7 P0 h. T. C8 ] RealData.LowPart = 0;
# T* }4 C4 p* S4 x RealData.HighPart = 0;9 i) R: ^# F9 `" T( K1 J8 Y
RealData.QuadPart = ByteSkip;
$ C1 Y+ a; @2 e) o) p5 Y/ a( z BufferBytes = (BYTE*)malloc(OutStream);
# k% z q5 k _5 R6 _ if(BufferBytes == NULL)
" @3 T, ^% R5 Z8 W1 h1 R {& c. d+ C* Y3 ^5 k9 t1 I! }4 q
Buffer->Release();
. T; I% O4 Q) ] D- R5 ~2 d HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
1 w7 D- S6 D& h4 h/ \. C+ Y( z MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);8 e, v; T4 b' a6 F
}
8 b5 F J* }/ d- H& l. z$ Y. I, T" F. c$ M7 G* [/ c j
1 J W% Y; V2 u* S% q9 f# O: X" P
9 a7 k. M0 ~* K! r8 X Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);5 n+ W" e( E; b2 d
- Y I: Y. o! i" Y2 ]/ T. d& n1 s( A7 y' E% e. Q% G
6 T8 \; c0 U: a4 k if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
2 ?+ M+ |4 B( [, \1 D5 Q0 X H5 d, r {# U9 d% k2 z# u5 ?
BitmapFile.Write(BufferBytes, OutData);
+ K/ h9 x& t& C5 \ BitmapFile.Close();
" W t* c, j; @4 D2 O# _1 [3 I- [ bResult = TRUE;
' U/ P4 T" M4 _, O8 u T( Z7 k }% p3 U! L0 H7 j% `# F
else // Write File Failed...# ]. H. {. }( a4 }$ ]9 m) g
{
6 a9 {( N+ w. y X. V TCHAR szCause[255];; `& e7 d# H$ a( S% g& _) f% ~5 V4 \
e.GetErrorMessage(szCause, 255, NULL);. Y6 m: F( k$ |6 D* @
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;* o9 _# X1 P2 z
MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);/ m0 `" @$ _) U) U
bResult = FALSE;
; V& l2 f" D. N7 l+ {# O }
. r+ W) [ g' H$ o# [9 ~
3 q* @5 F8 c/ P% o Buffer->Release();% m) v B" J9 Q" I
free(BufferBytes);! }$ \$ w* t9 h* }' l, ?
9 X9 S2 o1 u8 [4 y6 i& b- d3 O. F
- F- }5 Z: Q0 h& @; y7 t% F6 { H
! x, B' ` q2 D, a5 G return(bResult);+ B' U P$ M) z( |
} |
|