|
|
BOOL CPicture::SaveAsBitmap(CString sFilePathName)
3 o6 X7 {; e( c% O) s7 d//=============================================================================
' f" H; t8 e- ?# `1 X{
" F2 k0 H* q3 n BOOL bResult = FALSE;
) b7 E: R* Y' g# y. J ILockBytes *Buffer = 0;% L0 w g+ a& J
IStorage *pStorage = 0;# ?$ j6 F% u1 B5 a) H
IStream *FileStream = 0;
" p" z% p2 }* V1 z! D" ?+ y BYTE *BufferBytes;
3 q- I2 n& o3 y" K! q STATSTG BytesStatistics;
* C, @0 n+ o, s7 t3 e' j2 D8 p5 x DWORD OutData;
% A- ?( h3 Q) [$ q5 A/ T long OutStream;4 Y9 F9 o, S$ {- A4 b$ o
CFile BitmapFile; CFileException e;# ]$ r: ~$ k' V/ G7 B' x. P9 j4 g9 T
double SkipFloat = 0;* r: `; ~2 t7 o- z, q4 Q( k
DWORD ByteSkip = 0;! V% f: ]2 T; d( t# c
_ULARGE_INTEGER RealData;
5 B( ]5 P4 K/ R3 p: S. ]# j% C
& c v+ i2 v# R5 I/ V I& v
. J5 r4 C2 r: \
4 L8 {& Z! y- l9 _3 M7 X" o CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
: g( W+ b0 y, \* n% x6 d& S" I2 A
' c# n3 `, f/ h6 V( l3 b
' Z; l7 D m0 }8 W4 c8 Q+ C
9 F+ ]1 A4 H6 Z% l* }7 h! ~ HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
2 M8 Q8 a! F8 _- s3 k& W# o/ A! O8 Q6 L0 s STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
% M% Y! C, v5 Z) X- M; `/ `
1 X+ y+ |, G, ]+ |' x) J
+ _0 D, F/ ?4 n* y0 ~' d; a g- W
3 f* M' k( O( l1 Y, k4 l8 q hr = pStorage->CreateStream(LPICTURE,- }* u$ u4 }( ]3 |& B4 A
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);: H2 T! \! f: H0 g4 _ W3 `9 ^
2 J. r* T5 B8 @$ B# X
- n1 G3 Q2 K3 V* \3 C6 V* ~) p3 g3 C+ i9 x5 N
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
9 o& J9 @8 J* B4 M# i FileStream->Release();
: Y$ J* C; R) q( M' _ pStorage->Release();/ A7 O7 K8 R6 v! C6 v7 _
Buffer->Flush(); ; U, s& L. X; y7 x1 X0 I4 b7 n
$ u# A' U* i& [: u2 n# F" Y" `
2 V9 b- C% Y# B3 Y j2 l
: P- N: R- {7 e" E+ c# Z! S2 s& B
// Get Statistics For Final Size Of Byte Array
" J1 k, x# q; p N Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);" ^% J5 m0 b$ O4 y
9 N. M. e V4 l; g" r+ {$ n; L# K/ U3 Q
5 E/ m5 ]) d5 _4 \, i* v, l; Z! D // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
! C8 F2 \( r" D8 U; x. c' j SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...+ {. ^! p% W. o x4 B% {% w6 a7 i
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;* T3 y" t, S# }$ j& }! Y
else ByteSkip = (DWORD)SkipFloat;
- n, ]) o% v4 t9 h: W ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks.... J* _5 r8 }. \0 x
+ u" @. W& Z/ `% ] // Find Difference Between The Two Values
& ^1 N5 n6 h2 |) \ ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);1 }$ a2 R: _# q$ a8 ~0 k
4 m" C8 ? p, D% [2 T% d
+ ^: M2 m- ?; W+ G; d+ E- W* w- i
% J' b' V9 V5 b8 _, ] // Allocate Only The Pure Picture Data
8 ? Z, H1 Q& L+ |7 i& t RealData.LowPart = 0;
% ^ G; V7 P$ ]6 u$ q4 h RealData.HighPart = 0;
4 C% U# V5 [0 | T RealData.QuadPart = ByteSkip;6 ^2 M, H- w5 w" U$ t- F
BufferBytes = (BYTE*)malloc(OutStream);; t4 w y8 }9 {! B) g2 {2 }: r
if(BufferBytes == NULL)
1 M3 M5 h b" }) Q; t$ H3 a {
7 [0 V& b4 U# O4 o# W' i Buffer->Release();; p% D: ~; I) U/ Q9 |5 V
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
- V) _8 X) r9 J2 L: Z4 N" U8 M; v MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
6 p' Q# U4 u B7 J$ h! D# ~' Z }
3 f2 E$ u2 q; ?# ]' Q- _4 ]% u- L- M
8 x1 |0 Q+ K' w+ O& Z; j" _. ^1 S* K$ {* f0 R" N
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);% L# P, q: C! W
! [9 X7 U7 C; e$ s# H
7 s* h$ _1 i J) M7 P }
6 l, ?3 {, e$ L8 v0 E8 A& Y2 y. O if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
, _+ H2 L0 H0 V( N {; s3 \# r% W0 U2 K j2 I, X
BitmapFile.Write(BufferBytes, OutData);
$ J8 w7 S, o1 X( v BitmapFile.Close();
% y' d1 Q5 Q# }, }6 Q9 f* J- w bResult = TRUE;5 {6 n" q6 N% d8 V- |; ?
}
! p! e6 |( P# L# Q& t3 m else // Write File Failed...
& K5 Q' w4 W: o3 d9 V3 @ {/ u$ a4 C; |5 e# g/ b8 B3 y
TCHAR szCause[255];
) m4 P& W% r' \2 f2 Y! k" d' L e.GetErrorMessage(szCause, 255, NULL);
' c) }1 X3 W! L% K: R. s: { HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;$ d3 B9 i4 H% r3 u. \9 K
MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);8 `! t9 ~4 _1 X! Q" h
bResult = FALSE;8 f, X' F, m! U
}
* R- M2 `& \' s
, U- P1 E; ^& y# C2 p7 H. I# g Buffer->Release();
9 E$ c& E* h" v9 | free(BufferBytes);
* w6 Z! S# ?+ m k
" X* A% H2 U( z- l& a) Y$ V1 Y. }5 T$ p( z' A9 Q: Z; S
1 u+ [9 R5 {) ?$ _' T return(bResult);6 l- {. m1 R! P" c+ f; T( p3 o6 d
} |
|