|
|
BOOL CPicture::SaveAsBitmap(CString sFilePathName), |$ H0 G& E0 `
//=============================================================================
# [+ ~0 z$ s5 L$ D# B8 C{
# k3 h) d3 [3 p# I& |, }7 q BOOL bResult = FALSE;& _+ q4 f4 C; c: L/ p: ^ p4 f
ILockBytes *Buffer = 0;
: c' F& v" J) H- a" L7 |' M IStorage *pStorage = 0;4 W7 h7 d3 a) T' W1 ~, V$ F( O
IStream *FileStream = 0;( [4 ]' m. [8 ^% W1 G) _
BYTE *BufferBytes;
4 r) k6 [+ i0 S! y* j STATSTG BytesStatistics;
# c4 |, K: T/ y$ g5 X DWORD OutData;
: f5 f: [5 }, w3 T long OutStream;
+ N' t, b3 i `. i/ ~- z& r CFile BitmapFile; CFileException e;1 E% I. y' p' F5 K( Q0 e5 X' a
double SkipFloat = 0;: X g, z/ t0 I) B+ ^2 @6 o6 {
DWORD ByteSkip = 0;
5 m& r- I( @: }3 o+ l5 H+ R/ I _ULARGE_INTEGER RealData;' E6 v3 P, c; x) K' I0 v
7 Z8 \2 c0 R" G3 y3 d6 F* S2 Q. z2 {% m2 S c$ i
! P8 H+ L: R9 I CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
: Z9 m! ^! c* z( O0 j0 ~7 _ [. W6 q/ } @5 R1 A i, \
/ _/ o# R$ e& }# W: l4 E
- \ G& w$ v2 _* G
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
5 y8 f' _) ^4 I- ?9 ^" @ STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
& H2 o% V7 u& U5 ]' o0 A8 o# f
& o9 M# ~, _# \! T/ i0 w I* Q* e! J+ Y
9 p+ Z, H: o. w
hr = pStorage->CreateStream(LPICTURE,
' N2 A" s; V* F% S STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);3 B6 n# n. w' B0 Y: m O- ?
8 i* r! @9 I5 B: s. b+ y2 g' j0 Y# k2 b" q0 ]
* O( H: c" m% U/ a) m$ P m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream1 e. t4 e) ~" t) u0 b
FileStream->Release();! e9 a1 ~4 V) B5 E/ J
pStorage->Release();2 G' C3 k, z l+ i
Buffer->Flush();
~) j3 H% V6 x; W# f% k8 k$ e0 h5 p& Q& T6 m$ J; \- a1 F
+ v/ J1 o8 F& v% t+ u
1 U/ _% D0 D- p& I+ v
// Get Statistics For Final Size Of Byte Array+ x n5 }3 V W2 u4 K x/ W
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
8 F! L2 ]0 h# S" u7 O, D1 L7 k. W9 M1 l- O) L6 v8 u4 p, Y5 o
, q$ m" s5 w- a9 G/ T' Z
$ d& A9 J) e4 w& }3 h
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
; }; s7 d' e9 w% L4 F# y3 v SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
2 @' k' _) p% ]" g _. N2 i- Q if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
/ z4 B6 \1 S, X0 p& M2 g* { else ByteSkip = (DWORD)SkipFloat;3 v' f2 H: E7 d1 h4 V
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...7 z4 b% E' q4 G, C$ v( M
1 e. z+ E( M3 P( W. I( J
// Find Difference Between The Two Values
$ |! u* P! W$ {6 U( t6 y ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);, h: l! t. o9 B( ?2 H2 O% i3 S
) N, o. n& [2 ^. q$ I# f
# l% ^/ b% s+ q& n. G: k- u- f
7 ?2 W o, p2 P, C. } // Allocate Only The Pure Picture Data
& s: l0 J0 z" {$ b- u RealData.LowPart = 0;
: K" \2 c9 f6 ~2 u" F" s& q/ j RealData.HighPart = 0;
% Y# v$ V, [9 J& _. i RealData.QuadPart = ByteSkip;7 Y" V4 G4 q: W9 }1 [3 V% L' w
BufferBytes = (BYTE*)malloc(OutStream);
R2 }7 H: K: H0 H" k- u% [ if(BufferBytes == NULL)) l$ B1 p. m% n' w. X: F! p
{3 ?/ M) @( I8 Y" L* d% v; P
Buffer->Release();
) ^# ?: K6 O3 q, z2 y$ s6 F HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;% S6 g! ^5 M* \1 s0 ?) L
MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);0 a8 N- C' m' P- o" \
}* l5 J5 O# J1 x
" T* G! |1 O0 Y+ W4 K9 o4 @
! d( o6 M2 q! N4 K. f; ~7 j' t4 }* d( I
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
$ m ?/ h6 l/ n @ W P0 C2 W0 f8 M) T, G( O
% N7 u! \2 v9 Y" x5 ^
: e+ X7 q: m* ~7 P% b6 E
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))' }" z+ [( o D
{% J: _. `& D% S# \
BitmapFile.Write(BufferBytes, OutData);
" W5 m* v" g2 E: F/ S BitmapFile.Close();. |- Q$ ]# ?" y/ e( _2 V
bResult = TRUE;
( b3 q* j! {2 ]- W' L* n }
1 b7 J6 P4 ]9 P" Z! g4 d else // Write File Failed...: p* v0 t8 I' K! P; q) B2 |, g
{
" q/ x( ?/ k& d1 a9 z" M% } TCHAR szCause[255];
% q- N) G! M4 S* t) z, p- l' ?3 g e.GetErrorMessage(szCause, 255, NULL);* u- _) N0 k. k1 V% j& ]4 A6 p
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;2 E. n1 M8 Y! Y! M
MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
: r1 c: s+ R0 q y* w1 }2 k; P bResult = FALSE;
; ]/ ^- X1 [9 b) U5 ] }: m5 _' k+ j0 t
7 x. X4 { _4 l0 C: I4 y Buffer->Release();+ m* D0 S' q0 q" k* ^0 F" n% t5 b: d
free(BufferBytes);
9 ~, g9 v, H, o& y z% h" _* t: `$ O$ q7 q, G8 O& k& x
4 F4 U1 o" c# R( u, J0 `1 m4 k" ?1 V; M7 K7 N1 M* `
return(bResult);
2 s, X! w) i+ _9 f: D7 w} |
|