|
|
BOOL CPicture::SaveAsBitmap(CString sFilePathName)
) ]5 F4 ?: U/ S7 e6 J//=============================================================================
! l4 |% ~3 h8 |3 W+ ^! r/ e' e{8 K; ]+ |7 S" X* u5 w' o% d
BOOL bResult = FALSE;
! a& i! C7 ?; `) d ILockBytes *Buffer = 0;9 `) A- F# l2 C! G! k# ~5 W; u% E
IStorage *pStorage = 0;
1 ?! k7 ]$ L/ o5 M) i( _; K% K IStream *FileStream = 0;
c3 A+ ?% b4 [9 R5 H BYTE *BufferBytes;
% g' `3 k" O, G$ F STATSTG BytesStatistics;
$ `3 M* R+ @0 O ^ \# W0 z; }5 J DWORD OutData;
( @/ P/ R7 G2 } C, Z3 w long OutStream;- e: T1 O5 R+ a5 c/ y1 i. X8 D
CFile BitmapFile; CFileException e;' ^; q8 X# F+ n0 t# E/ k
double SkipFloat = 0;0 U$ N5 y+ |" j3 @: p! a
DWORD ByteSkip = 0;" W; N5 ^$ E" S/ w3 c- ~6 c
_ULARGE_INTEGER RealData;
7 B* g+ j/ P0 I& }3 _
; [2 z/ { i) b/ y6 _
8 N2 P2 [, x% ^7 k- P3 f# `' M! ?4 D# g8 G1 x
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
& E% Z2 |; @1 j* _( |. b+ C& @9 x2 E( b" K* ~9 [; h) N" z, M
/ ?2 W5 d0 E6 D
$ d; Q3 Z/ g/ Y: G [0 Y
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
$ t% n1 q8 w' ~. G. p( }' E8 p STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
3 b- }* V: g1 Q7 @- Z& M) \# T+ W# u3 i( ]
, [4 \% s+ Q5 e4 I2 b2 T6 }1 u5 o: |+ H$ E6 T. n4 o* x$ Q
hr = pStorage->CreateStream(LPICTURE,
: m# T* Y5 P% M( h, Y+ { STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);" P4 r; U. \7 U) X# R$ J; A; @
* O7 d4 ~2 f& Z2 }4 o, v4 U
+ [1 f6 n! z$ K2 B+ l. z
6 x6 e4 f2 J( t/ D, b% C
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream+ ^- n3 t% K# E% F/ I% B
FileStream->Release();
9 @4 t" ^1 D+ R pStorage->Release();
; V6 }/ H, g( C* y5 X7 l& Q Buffer->Flush();
7 t- h& L3 w" m7 w# h$ S$ B0 {. ^$ c( c) T
6 F5 b5 B% a K$ ~3 f
: N' A! A* \+ V3 ^/ t // Get Statistics For Final Size Of Byte Array- ?7 m+ n2 o! a. u
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
& `- v( g- o- \: ?; b3 i0 G. i: R
1 t3 ?: q E% F! }# R( W; `$ `3 L- v. a3 T
3 e7 y! s' f$ R- `# p
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
5 L) h5 D1 M( W, U SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...% k( `/ f6 ]1 a* ] |
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
6 n( Y# U9 g( q( u0 B else ByteSkip = (DWORD)SkipFloat;
- C, n# `+ L* j8 `) r* H ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...3 x; n* C9 S/ r" [* _
9 |: h& y8 q' H. A1 p; Q; P+ o // Find Difference Between The Two Values$ \1 ]& S1 b5 J% _
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);. Q: \1 _+ B U. c; ]
2 g. z0 _6 o' _0 h' W. v7 D( N4 p2 W. A6 e( u
5 | B! G0 m v2 W$ i+ w // Allocate Only The Pure Picture Data
S) g2 b3 p+ J6 z& n6 V' f, Z1 p RealData.LowPart = 0;
! T, _% I1 j7 r: D( j7 [2 F RealData.HighPart = 0;
/ v/ X5 B( u2 o9 B RealData.QuadPart = ByteSkip;
G Q/ A6 a; f/ E; h) a BufferBytes = (BYTE*)malloc(OutStream);
' ?& k& {% ^2 z if(BufferBytes == NULL)
' j& A5 n8 \7 S {- H7 P/ V, v- } {7 j p& N8 L
Buffer->Release();
- g9 i. w( x- k; s! c% H/ W HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
}1 s& L0 a+ C1 y( l& F4 u3 M MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
7 U0 b) f. W# w$ j6 [# u& V }
1 n& q9 I- E/ C* W4 T5 l7 |$ z3 ^5 _" i6 M# H K
0 k: \3 M! ] R y4 V1 o
0 n6 E$ w% `) M0 i4 ` Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
1 W+ Z, ], r8 h5 C. l* p
8 z0 l: }+ }; \& l. G
" Q |7 R0 ?/ k3 _4 \6 h+ w. O# E1 B" A9 P9 k( A+ F/ }
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
& S7 x, P- ?! [% Z" P {
# X: A! T" w N# t9 c8 R3 Z BitmapFile.Write(BufferBytes, OutData);0 B. [1 U( \# n
BitmapFile.Close();% Q: Y' Y0 Y2 m+ c. k. ~# t
bResult = TRUE;- C9 Q7 h" S( R. V5 c. F
}
% G, J [5 r! o1 T4 K else // Write File Failed...
# t7 Y' }/ U( s; S& o {( G! e/ A: K: w
TCHAR szCause[255];( d2 g* F4 A1 {
e.GetErrorMessage(szCause, 255, NULL);
% d6 _3 B3 ?, Y2 O$ J( n8 \ HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
w1 t. g p- D1 C' H: v MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
3 c! f" y2 ^8 C$ W1 n bResult = FALSE;0 p* G2 j \" [. \2 s; N
}# {$ ?' W9 \8 X1 a
3 J/ f1 E! @+ c0 u
Buffer->Release();
; Z6 c% K8 G I+ U+ Z; p free(BufferBytes);
' E% K4 }! f$ \; w& a" v* V
4 Q2 S- M, z6 J. S7 h* r( Q* v' z5 \5 _/ o6 Z, L
* u0 i! F6 G8 D/ P' Z# o
return(bResult);
- {# o, @5 o8 {) }} |
|