|
|
BOOL CPicture::SaveAsBitmap(CString sFilePathName)
0 F2 M! n& q$ W5 _: J: ^//=============================================================================" c- S. U. L2 {3 J2 g
{5 j+ Z: U q/ {/ ?9 F& E) \
BOOL bResult = FALSE;
( k/ n3 c/ S' [ ILockBytes *Buffer = 0;
$ l9 G: Z3 O( Y% G IStorage *pStorage = 0;" { y, Y; f: {2 r) t
IStream *FileStream = 0;
* N3 H. j) e. M6 l9 f& Z* \. P BYTE *BufferBytes;
) R% n- o7 l4 s0 C STATSTG BytesStatistics;4 W4 Z, b! M5 X
DWORD OutData;5 u) _$ i( H. x0 z8 ] E
long OutStream;0 b" @8 S4 g# G: P" D6 z$ L
CFile BitmapFile; CFileException e;
0 x. _1 n; U2 Y9 }# w! J$ t& j double SkipFloat = 0;+ I/ u3 K6 ^( v Y8 Y( l
DWORD ByteSkip = 0;
$ K0 _8 l+ R0 t& C5 m& z9 o _ULARGE_INTEGER RealData;
6 w( L5 d5 }4 e% e+ j# j& G0 u6 q8 m: t% F& _
' y3 T5 a& P! m1 Q. _' H3 j
. o; D% _1 c1 c3 Q0 f+ h( k
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer6 n% A0 J9 ^( M; ~6 e
% U7 @, x% g5 e v! p4 d B# T- X, Q
! q3 T/ l3 {/ Y3 N, u HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
9 H, `7 W$ r& b2 w% m0 v" e5 m STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);( w# y- L) |! a1 h: X
/ g$ @4 w* E, M- M1 p2 W- X p7 h% x6 A3 s2 z S0 r) m
; N0 D; z4 Y1 ?. p" E0 c hr = pStorage->CreateStream(LPICTURE,
' l; |5 X+ L- K+ ^( X6 t' Y STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);
, \- q* M# @# F' d
0 u0 a8 s' s7 n! j2 g* d
- d) x: [: m' I+ a5 f
; p. |) i! Y. w5 w$ ^: F m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream! u7 ?+ V3 P" z* w& b8 I2 G6 ~4 I
FileStream->Release();+ Y: S) X2 W- \
pStorage->Release();: i9 ^+ M# w& d, T5 A
Buffer->Flush();
- j2 G# |" \3 T7 \4 k! i* F! `$ ]1 Y9 J. T0 D
% D4 V' F! W8 w! D; K/ o; K' |1 j& q: A
' E. n; B, @" `8 ~8 [+ K // Get Statistics For Final Size Of Byte Array- i, o6 `, S' k5 t( m: I
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME); e4 b4 [0 D$ O( p
: X; {. k3 Q- r2 T1 E* d: K$ x, {2 `! w- [/ j$ b
0 m9 [5 o$ J* i5 C3 {
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
# u$ ~. A5 G& R) d) @ SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
# ]& d; }- n. ?' d if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;2 J0 K5 I9 s4 C, T* n
else ByteSkip = (DWORD)SkipFloat;4 a6 V9 T, {& k% e- ^
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
5 ~0 o- R& _" X7 T
~& J3 I/ S) ^* d2 I5 i // Find Difference Between The Two Values
/ g, u5 Q3 D# H4 ^ ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
2 |1 o, `0 `6 R6 U( I& D$ z3 F+ p
$ g2 ]" X# m/ F5 w7 W
- m" ^1 p) r7 [* i& ]* P6 Z" D$ u0 ^' U" Q/ N+ _# {
// Allocate Only The Pure Picture Data
" B0 f1 ]- b# Y) r4 a/ [1 V RealData.LowPart = 0;
2 ?3 ~9 h: `/ C RealData.HighPart = 0;
+ Q+ ~; @) q* E& P* @( q RealData.QuadPart = ByteSkip;
6 N6 ]) }/ x) x0 {6 o* s BufferBytes = (BYTE*)malloc(OutStream);
" r7 f" H6 {3 b y/ D+ h8 a/ |6 R if(BufferBytes == NULL)$ y: p( B/ q2 ?$ V& I1 y! X6 Q* I d
{( g7 w) e2 s0 _/ P; M( }# d
Buffer->Release();; j4 P; F0 k, v9 K
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
* P) W2 ^+ M/ n* V MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);8 k T3 N6 s- V$ Y5 @* t8 z7 P" Q. R
}& [" m! s! f! i8 q
- k$ a1 |5 \0 g* i, I% c2 A$ M
- z: C2 G" `; Y, D0 Q( d7 o, Z$ o8 P6 T; j
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);* f6 y! m, ~: w/ N& v) ^: p
1 k# g% h- ? B5 e1 F2 r
) i- k3 q# Q; _
- ]0 l2 {" h, R5 W if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
: A: e6 n7 o- w/ o( q7 u) R# n {, j1 i" f" p+ i* v
BitmapFile.Write(BufferBytes, OutData);
5 N. [) E: k1 y BitmapFile.Close();
7 x+ W7 ~ b3 m7 A# _# y% T bResult = TRUE;
( Z8 _- e" F$ {' j }* a- H [6 B" ?( E6 r
else // Write File Failed...5 [# B: c7 L7 F; s
{
$ D& N2 T- H# h! R- `4 z0 R% X TCHAR szCause[255];
7 O) x0 [: u% x# R B8 G+ T! ] e.GetErrorMessage(szCause, 255, NULL);
9 m/ n- T$ [4 G$ l/ v. z: Q HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
5 ~3 J+ ]7 q& ~, @; \5 a MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
3 L0 [4 C/ H2 L' ~% ]- q9 o0 A bResult = FALSE;
- C9 y% J8 i1 v& C! { }
7 H& P3 _" H6 h: b( H! V+ [& c1 G 0 O" g2 [3 D4 M8 ~) ]/ @8 }% c
Buffer->Release();' y( e& l/ q6 F- A, E9 U0 q
free(BufferBytes);. T" H9 u. x, e1 R. v/ e
) _ u0 J3 i; z4 y& \" e* N, l$ r5 |! L; ], i) a+ X* c% X
% c; `0 K* g" X3 s M return(bResult);
9 j0 O. J" W. v) A! Q! G# d} |
|