|
|
BOOL CPicture::SaveAsBitmap(CString sFilePathName); l1 i; l4 c- \- y0 B$ Z
//=============================================================================
5 T6 N6 x8 V1 ^: j- \% |8 O6 {) S{8 z- N. {, p: _& V t
BOOL bResult = FALSE;
* |4 w: p* w# @: s" a( V ILockBytes *Buffer = 0;9 A* R& z: _# J( N- R
IStorage *pStorage = 0;! K0 _! u6 o3 ?3 e4 P; o
IStream *FileStream = 0;
3 X) L! ^5 X3 Q0 F6 B2 J; ]& p( L BYTE *BufferBytes;8 ]# L# T, z5 }- W2 @1 J! N @
STATSTG BytesStatistics;' s$ u7 a% C5 ?8 Q/ e2 l* j, S% ^
DWORD OutData;
7 I. a8 A( W% F, j% \' M% W) z long OutStream;& Z o/ q# T8 _3 y* A- N
CFile BitmapFile; CFileException e;
4 b: Q: ]6 J( b- `7 U, I3 ^/ M double SkipFloat = 0;
/ {+ M8 s4 w! L( m6 J/ T2 J DWORD ByteSkip = 0;. {+ ~8 m8 P/ h
_ULARGE_INTEGER RealData;
1 {. K* s. f7 b9 d% }* E# e* _& ~0 E! B) `
- D1 l0 h, ^2 b6 R( G1 |* S- g& A/ \
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
; U- Z2 R' y3 C( V
8 z* t4 M; H3 B* B/ x1 E5 x- z
2 t; W' R! M/ S9 O5 ]8 B' u% ]0 `
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
# E2 D7 q5 H- }( I; v" g0 Z STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
4 ^; `0 Z, o! l* B5 A: h
. g e. N( \) z' o/ f' z: |( N% H1 L ]0 m2 Y
3 I5 Q. G: ]3 O7 F9 ^# q+ J6 Y! X hr = pStorage->CreateStream(LPICTURE,3 \; `5 \- J) N& V
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);6 r( A, f1 W( P) q( J
0 u1 ]* a- K# g* Y! L+ y& G4 @
4 H( y/ Q# Z& X7 `, p- f9 X: a6 Y- h$ ^7 c" E8 A
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
: S* t- |: m9 P: s7 j FileStream->Release();6 n4 w1 C/ U( @" g
pStorage->Release();" [% l* t4 w+ A
Buffer->Flush();
5 S9 Q1 G; U$ p# Z5 Z9 V2 ]6 I# E3 v- _
% b' P) J; p0 k$ s8 p- K5 k: ]1 |9 J7 ]5 @1 t
// Get Statistics For Final Size Of Byte Array, Q' V$ N- ?; ~6 W2 W* n8 E$ L& i! x
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
( S; o, [8 S/ c7 A, g8 ]6 t6 j
% p+ k- q8 a' ^% a8 T. R
& c4 l6 l/ G( E9 u+ f
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)8 \# N) ]# G1 k& H: ?1 Q* a2 G5 j
SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
$ q+ X* v" L N) \8 U9 {8 K5 N2 a) P if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;' F! J9 `9 i c4 I1 Z! G& W/ R
else ByteSkip = (DWORD)SkipFloat;5 ^8 s1 n# l* ~
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...6 Z s) P% e) s, M
9 B2 `% X! }& ^8 ~ // Find Difference Between The Two Values
; z( w- D- n3 E2 f* |" a ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
4 z% p2 {; U. P) V, w4 q7 ]' ]8 R) H6 U+ A! L3 d
. J. g4 }: z" P% p
6 u7 r. T2 p/ w% s8 v8 K8 }/ b // Allocate Only The Pure Picture Data( }: ^4 {3 F2 E+ _5 ~' B! q
RealData.LowPart = 0;
" B0 e; y. R) q( | RealData.HighPart = 0;# J( D9 o" v$ K* K* k
RealData.QuadPart = ByteSkip;
$ Q' g/ c# M+ \' x BufferBytes = (BYTE*)malloc(OutStream);
3 F( C. Q. g4 c+ e; D if(BufferBytes == NULL)
& m; z5 P$ d" F3 i% T5 B {3 U: Q+ e9 P* u$ K3 {
Buffer->Release();
7 u: u- p5 n5 Y2 G! x HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
; L8 s. i4 t2 A' d9 i z. ? MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);7 S* \- E/ m+ ^
}* B9 D& f+ c+ e, e
5 u* O5 `% O" ]& v; y6 T
+ k. _# [, h* N' v# M+ \+ u" ^) N' P
5 ~+ C8 [' T6 a! x) U# g5 d Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
: J9 I1 _. N6 I4 {2 f6 {
9 x- s& ]. ?! l n: w% ]2 P
& J5 p0 Q. u0 ]+ X9 C, @7 @" s. e3 Y8 F. e) B
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
9 J% F& J" X" J. L; v0 \, | {
1 E! w5 S4 T. `" e" T BitmapFile.Write(BufferBytes, OutData);
! _* N/ X5 u3 q# J! u2 W3 B BitmapFile.Close();6 [" ~3 u `1 x$ K
bResult = TRUE;! ~2 B/ Y7 x& `, C* X/ ^. b; Z# [
}
2 D4 y/ @9 H! X p else // Write File Failed...+ C0 h" D, B& t: a( ~9 S+ E) R
{
. _) e9 E! w6 C" { TCHAR szCause[255];3 g: @ u. Q5 E- k6 f$ a
e.GetErrorMessage(szCause, 255, NULL);3 i; C3 ]' H; r: d1 a, ?7 Y' S
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;3 A0 C% c. |7 e* n! B1 F% I9 O* c
MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
! T. b) w& G5 m1 j" `# ?* i0 F' a: W bResult = FALSE;
( t3 Q. M: g% f }
c( n8 ~0 |4 Z. s + F3 Q( e3 ?, ?2 E
Buffer->Release();' a, ^ ]3 ?8 K% T c* W# K& H
free(BufferBytes);
% p( e, P4 W8 A: C
- [% U% j1 H4 ^/ i# Z- X# ]. W
u/ s% d! v- m7 t% W. X5 E5 }7 G) V _' n0 `4 ]* g1 O/ e
return(bResult);0 Q0 {, z- G7 v% i0 k7 s4 D e
} |
|