|
|
BOOL CPicture::SaveAsBitmap(CString sFilePathName)
- R7 M$ E( l: P6 |4 I5 V//=============================================================================
! J( t( d" S! @) B0 Q- W/ w{ e4 ]. G. T' J! X' s
BOOL bResult = FALSE;
$ ~! X: a% A" V" A; O ILockBytes *Buffer = 0;/ a. Y) P5 j$ t/ F' J
IStorage *pStorage = 0;
. U6 L9 O9 ]1 D- ^; ]6 v# T IStream *FileStream = 0; ]9 V- I% G0 }4 x- P# ]$ C! u
BYTE *BufferBytes;
, w' z/ z$ n- V# w1 y( K9 _! q; a: F STATSTG BytesStatistics;- h6 Q5 C( w% C, D: y& }/ {; z; [
DWORD OutData;" j, A* z, B4 T5 I2 f8 H& @4 Y
long OutStream;% ]* n' Z" T- G# v
CFile BitmapFile; CFileException e;
6 R8 @! |( k) T. }6 q& v& V double SkipFloat = 0;& ]( _4 W; W, L! s4 |( ~; ^7 O& N
DWORD ByteSkip = 0;5 k7 w& {8 w( Q' \: F7 } [$ ~4 d
_ULARGE_INTEGER RealData;
+ [3 F9 I r; k+ f. D2 f
" n- ]8 [& \- f7 F& U' u6 N" ?; n/ e2 v& s/ \1 _; e j/ g( f; |/ o
O4 r" Y4 t; ~
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
( o/ y5 s5 u$ \& C; n
& `! \' _5 }7 k9 A9 A
$ C3 l) T! D$ J, z$ K) r
' I" Z6 n* I) m, V8 [ HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
, d" t: F5 l) ^1 {. N$ | S STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);- G% x1 S6 T; ~7 @
& h2 U- p% ^# u/ g: V7 }0 F; f
) e0 ~5 [# _- x' S s5 b3 P. h
) }* L, {" e: M5 y/ ? hr = pStorage->CreateStream(LPICTURE,0 q/ E$ j! W/ z, @8 M6 _7 S5 `) h
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);. T% W3 H4 L7 F. b% T
0 a7 l/ p3 I8 N
: q' o2 M) i5 ?% X- L/ C7 F
0 \. Z- k G( [: j3 v2 n m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream6 ~' P- ]3 z5 E
FileStream->Release();
L+ d. R- D* i0 d( X& w; X- k pStorage->Release();
`4 J7 P: N# ^ Buffer->Flush(); 8 V& Q* A& g+ R0 ~- w3 I- R T: x
+ S: f5 l4 e" Y* i: t
+ ?' Y7 p( b, _! i
. Y a4 {4 p8 H/ M( J5 ~' V // Get Statistics For Final Size Of Byte Array. |5 C3 H+ h6 b& F; x6 S9 f
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);* Y. h' g j/ f% w. |3 P0 V
+ a# s% g: F+ A& Y
7 E4 D L7 S) i' w+ k6 @: F
6 M6 d) g- L9 j // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
% [( }$ N0 P, L2 x a' s5 V5 m& w! \( Y SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
6 X. ^# E, N5 e M8 o. ? if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;5 j) f0 ^+ i' m2 G2 h" {
else ByteSkip = (DWORD)SkipFloat;3 q/ i# ?# n! y$ K( g T) `
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...0 [: W4 T+ i9 C0 N/ ^" ]9 v- B9 @, R
. O$ j0 R" p& b) | // Find Difference Between The Two Values: X7 K9 N/ T1 j r: _ Z( Q
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
9 a) h! p5 `8 O
" l4 ?/ p @5 l0 N: |6 _. R' C! m2 _# H1 R. x* v
' Z( i6 E4 H. T o // Allocate Only The Pure Picture Data
& G( k$ g1 O* {6 R# J RealData.LowPart = 0;$ u, s" _ i' d4 _6 b4 ?* ` B2 f2 D
RealData.HighPart = 0;9 B. b# a1 W$ G: L4 }
RealData.QuadPart = ByteSkip;4 Q6 H4 P5 B$ O. `; t& D/ N4 R" L
BufferBytes = (BYTE*)malloc(OutStream);1 y% g+ m% w# f: |' q) j$ S
if(BufferBytes == NULL)
0 m6 d1 b/ F6 }2 g {
4 `1 r2 A9 v3 x7 i% Y2 ^ Buffer->Release();
6 o1 C. q9 ?- a) b: _- K+ _* a HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;: f% B1 f$ u) m7 A0 L2 n
MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
D( Q; B' o: p: }( Q) J+ U0 t }
# n' T; t" k5 z4 [
* B) v6 i1 W/ I4 x2 A- _7 a! ?5 ^' S
& n& _$ I+ `5 r. _8 m/ ~
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
5 [9 ]; G$ ?. K* O. Z5 c
* |; V7 w! @- Q2 F2 z$ Q7 s O4 J5 J" I; o
7 z2 V0 C1 C, o1 W4 p) q if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
6 G' }9 F' \9 P- ]! | {
: z; e1 J6 h- m. c BitmapFile.Write(BufferBytes, OutData);
1 D- f9 l& Q9 D7 H6 V BitmapFile.Close();
' N+ d. e% p7 R1 T# L% ?3 p f d bResult = TRUE;1 F6 |: l! W# t
}- K B; C: C8 D- |% h! H0 T
else // Write File Failed...
2 |8 e; I9 P+ E {$ |! g, h5 s. r( T
TCHAR szCause[255];( m0 y7 r1 {7 Q- f6 o4 Q' Y/ _, K4 \
e.GetErrorMessage(szCause, 255, NULL);
: h: b: H1 V! ^9 z { z9 ~/ v HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
& n; k% I) d) ~4 {# H% q5 X MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
( g4 f$ c/ b9 a) L( q/ `! s bResult = FALSE;
* A. `3 ]* v6 \ {! J }+ n' g L9 Z$ x, A' ~5 |
# e: B- j+ ]; c! b0 o( ]
Buffer->Release();
8 }$ ?9 L) J# [! F0 I# o; Y: ~ free(BufferBytes);7 Z7 F! c M* l+ w
P& T: }% z: q9 o3 |+ W7 d; H$ k7 p1 X0 j4 N; s- Z( _* N
' |+ @- o! j9 m6 G6 a
return(bResult);& U+ R- h5 q3 \" m& d) q \1 v
} |
|