|
|
BOOL CPicture::SaveAsBitmap(CString sFilePathName)4 Y2 k x1 h& n0 I6 Q6 F
//=============================================================================
, n* C5 j! ^' h{
! }, c B! [1 V5 O \' K BOOL bResult = FALSE;/ q- L; S+ Q, h# C8 V
ILockBytes *Buffer = 0;
- N; @ i; _; C2 S: I7 N z IStorage *pStorage = 0;
& e( R5 c% d; [8 |. R IStream *FileStream = 0;2 Y6 n) j+ f3 ^* H
BYTE *BufferBytes;
' b/ b( _3 [1 m/ C& M) o' E) G STATSTG BytesStatistics;) L, d7 F, J* N+ B$ h" {6 ] w# [
DWORD OutData;9 u7 L# m H/ n6 q- s4 V
long OutStream;. _# p ^* ~6 _' e: B; H. s2 \, Y* L
CFile BitmapFile; CFileException e;! a% x2 z% Y( z, }* E! s% z
double SkipFloat = 0;
' {8 i4 e0 L! F4 J. n* p6 P/ U DWORD ByteSkip = 0;
* y+ L3 S8 K$ r6 B8 G! `8 S _ULARGE_INTEGER RealData;' B7 w% f9 h0 Y: ~8 q
$ N5 v$ R1 H& K" h) M7 z* D
" t2 W) p+ T; V' `, V" }( Y$ S/ d" B( A3 z1 ]# e$ {$ L
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer# y. m2 U% M: Z. a
! M$ Q$ ^( I! I# p0 i; y
" {$ d. T6 f; v3 {- f) Y, @2 Z5 @7 K! Q( d
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
+ T4 s& f2 ?5 Y/ ?6 A STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);4 m4 k# m% t7 V w. ^
0 }( L* R' ^* Z! a2 N; W4 `
6 j: L$ t! d- S$ g; G9 J
& R% i# @* d; {. S6 K4 ]
hr = pStorage->CreateStream(LPICTURE,2 Z8 [" c+ q7 {+ G
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);1 P4 V B$ @4 x: _1 v @% i9 n, {
& E" X" o# T: v! f ?
& I1 Q& o0 o3 ?3 r6 s2 U% |3 R# P4 s% k& Z' q4 }. [
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream8 t6 [7 I& c4 {+ q/ t* h1 H& H+ ]
FileStream->Release();$ e7 V% D0 S0 A/ N4 [
pStorage->Release();6 k& |1 ~; m/ B. Y& M
Buffer->Flush();
; O% U6 v' e5 S+ x- L" e1 t1 J
, E! }+ S. {# O, L8 ^* Z* G7 B) f0 J/ C6 A# G
/ ^+ b" C2 k8 r% W6 o% X // Get Statistics For Final Size Of Byte Array
$ M: p y. q! P: c+ _ Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
; e) Z" x5 ?8 e" ~* d/ \
# Q! A) S) ^* `" [1 z, z0 s# p6 x7 A1 g0 @& V& ~' o& X3 F( T2 r
/ n" n1 {: W0 p& G9 ~ // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data): G' @0 |# \. H7 s2 L- v
SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...3 {/ D% @. Z# Q6 d
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
, I+ I7 _7 J# k8 p1 V/ d* r0 k else ByteSkip = (DWORD)SkipFloat;8 E& }" {4 x/ h' ? G7 D3 G- p
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...4 c( ~' g, g) K0 j: T, S
3 W2 t& o9 L/ a% T* H // Find Difference Between The Two Values
. c }$ \- r- ?8 k6 o# _: B& J ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);% b2 ^8 Y: E( {- s# L
5 L7 u3 T) v7 L1 A* m3 k
% C0 C/ t6 g' r
: r8 }1 Z z7 y$ H9 |: a6 [0 } // Allocate Only The Pure Picture Data7 ]. D/ f# Z) i, w
RealData.LowPart = 0;
" b# L' f' g5 D RealData.HighPart = 0;
- [8 Q( b1 B) ^2 }( l; O D RealData.QuadPart = ByteSkip;
2 X0 N- B0 n% u# U BufferBytes = (BYTE*)malloc(OutStream);
$ P# M& |: D) p5 t( c: H+ Z) a if(BufferBytes == NULL)% d5 Q! O! n/ }5 T, d! u$ t
{
( b) u6 M$ x1 r @+ w! M% { Buffer->Release();
+ F( A; i) o) k: ~* F HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;& {+ [1 r% z! s* ?
MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);3 h n8 q! n E) Q" G" m
}
6 A/ t& z5 P( f3 a5 p' ?( {
/ C5 B" N! Z- o" n1 n1 w8 Q( ], W8 f" e' _9 }. S
5 Y- Z6 l7 P' Z) V3 E3 m, s
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);) P5 S; |, J$ Y) r2 u
7 u1 v4 f* e+ {
' O# G1 O5 ~4 p) S) d
% C5 V+ T7 S3 z+ c3 S8 b
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))* G" R" H+ T" X5 ?+ W
{
" r; ]6 _9 h1 ?5 z* b9 k' Y BitmapFile.Write(BufferBytes, OutData);
: ^% V% a B# R8 F! g% d; T BitmapFile.Close();' q6 h, c! Y3 \1 e
bResult = TRUE;2 b9 H9 p' W* s( t5 T7 _
}$ o! u0 }9 W. j! a5 R! Q6 o
else // Write File Failed...3 x. q5 E0 Z+ I
{9 E% @$ h1 s3 O
TCHAR szCause[255];
J. \! E3 }4 Q2 |9 p3 D U+ H e.GetErrorMessage(szCause, 255, NULL);
0 q" q% O$ D: i% C, j+ N# O/ K HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;. s3 e1 d+ P( J7 y. \8 ^
MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
, H5 |, G; q! h' v) x, F& H( T bResult = FALSE;6 }0 @& `5 L8 u
}: K3 I3 J1 J; |' r7 {
* I9 B- }1 v8 \- {2 ~! t1 N
Buffer->Release();
a! P2 @* a& d free(BufferBytes);1 ?! K8 M. P& U- C$ t3 I
" \4 T3 J( K5 n
% a4 ?4 y7 B% D5 ~
- P5 e% r+ z" j9 n6 ]* z8 z
return(bResult);/ E+ t6 ^, L: o2 ~7 g
} |
|