|
|
BOOL CPicture::SaveAsBitmap(CString sFilePathName)/ x) J) u! Z5 W1 F7 c
//=============================================================================! Q7 y( |6 Z5 ^ ?: o
{
7 Z" {6 a! O7 P! `! o8 D BOOL bResult = FALSE;
, D( J, p" n! i- z% s0 N ILockBytes *Buffer = 0;# t9 j0 O) M6 v0 p! l
IStorage *pStorage = 0;, m+ X7 F# {7 V1 J( L
IStream *FileStream = 0;
M& t. e% T: W+ ?* w# w( O- t BYTE *BufferBytes;
2 ~/ y# z1 Z- Y$ f( g STATSTG BytesStatistics;
% j+ N. X9 e3 e+ ^( o DWORD OutData;
' @3 |; }) r. f1 o long OutStream;- Y: |; {4 C, s" x* g' u7 }3 S+ P0 o
CFile BitmapFile; CFileException e;
; X+ B$ g2 ~, X& w double SkipFloat = 0;+ _4 B% s- B2 u& J: S ~% E
DWORD ByteSkip = 0;5 \1 u* q0 k8 N# m0 a0 L
_ULARGE_INTEGER RealData;1 _- x, a! x' v; A
& m, D* z) N- J7 s- L
# r; D; G/ \, E. a% F0 f
: K$ q" o9 P$ {* B2 b
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer& a6 C" o9 l0 C- O
7 p$ [' ~+ R9 ^7 f/ ] ^3 \; j6 B% o* y$ A" k
& x' u% A# m" j7 F% L$ f+ W: s HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
) j% Z% N, [8 g; Z2 k STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
* U3 r, E% u; f6 Q q$ z( x/ ]$ a9 B
2 C" i% c- m% C" `& h
& a, j1 L# S+ E6 E" J1 V% _; W hr = pStorage->CreateStream(LPICTURE,. O! S6 m0 c$ |" W+ a( n
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);/ Q" v+ `: Z, s1 d" v; ~
' G/ v/ v4 E( p: M$ V& X T
$ G- m4 B3 K, O
2 \0 C& |& t4 K4 V8 B
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
% m" R; z' c+ m0 y& u# s FileStream->Release();% b0 F# z4 a; u+ e, _ M" ^
pStorage->Release();6 v! v7 o$ @) P0 V: E4 [- Q3 I
Buffer->Flush();
- \4 q" }9 q) \( \" d# ]# f s; {+ J/ D1 a% A. V
- }3 t+ ^* B$ J" z" |, q
- `3 _' F) E9 J( H // Get Statistics For Final Size Of Byte Array V: s+ R3 s. p" i' S
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);4 w/ ?9 v$ B* J7 `8 n+ H" W
+ e8 J. h" ?$ `" K
% E. d ~; F% o
+ @! t! {/ }& u // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
0 I0 ]/ U6 B! Q" E' ]; o' J SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
- Y1 Z4 B: _. _ if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
1 W# a8 _! ^7 _- q3 j+ l* w else ByteSkip = (DWORD)SkipFloat;$ G( E. _6 J0 @4 R! |- O2 Z
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
0 u( r N8 \" p8 Z
& u: r& Y, l( u0 X5 p // Find Difference Between The Two Values9 T0 {$ ^5 t) k% x; Z
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);% J9 ^3 M; u5 a: a5 o+ p. i
3 x4 h8 ? O( u! O/ k6 k9 _% y# S
) ^4 U2 f! I0 W: e& O; C2 ]& E1 I4 h! m' c
// Allocate Only The Pure Picture Data
% W7 q, o) |, }6 u/ F# `2 p RealData.LowPart = 0;- n9 G+ e. P; ^$ m) q* f: h$ _
RealData.HighPart = 0;
& p- p" C4 ]0 g! e a, B8 [& ] RealData.QuadPart = ByteSkip;
. l% `: F7 f$ ^ j; L BufferBytes = (BYTE*)malloc(OutStream);# t W& O; _) F$ `" ?9 o( n' ]9 m
if(BufferBytes == NULL)5 q8 J# k. ?: A3 y' L1 b2 B( k9 S
{$ f0 n- Z7 W( B, l* j2 \+ h$ N
Buffer->Release();
& ]" ^5 f: v$ u4 [ HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;0 L3 k$ i7 E2 o+ `
MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);, X$ m$ U5 F6 Z
}9 b9 I4 R9 S8 p$ Y, B7 e' \
' S, I& a+ G+ c1 z1 W8 `7 U0 R# D
. |+ N3 s5 F' x; x: n- M
& d3 e, K& D5 j( B' }' W! q' G' a
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
' H4 U" Y7 u! C( n* @
2 ?- w5 `: u8 Y% ~" E$ n& f0 b4 M6 a. D a$ b8 U
' I+ Q: y+ l& a8 c if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))7 W3 l: U6 B: e6 x9 F
{( A/ i- p( f2 z
BitmapFile.Write(BufferBytes, OutData);
( X& L6 v- ?8 S1 @4 c" ` BitmapFile.Close();/ p/ s0 l! J4 D. s% f' X. r+ d
bResult = TRUE;
% Y0 a/ r9 c- k5 {" r& k }
5 U* G) e3 i2 [- I. k else // Write File Failed...) X# V* e0 w4 Q
{+ \9 D0 j+ |4 t( P8 P) u# N
TCHAR szCause[255];
+ h x- L5 \& x3 h' C# s; m$ b) ] e.GetErrorMessage(szCause, 255, NULL);9 [3 h7 C6 {2 D
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;" ?; ] c% A2 x: s: v/ q# G' Y
MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);) v2 j2 r8 @- w4 n- I% p$ a+ z
bResult = FALSE;1 @0 J( m/ l$ y3 M/ D. t$ i0 y
}
, L( V3 n2 I+ v# [3 d J8 j% d; n
# v. ]& T" ^4 D ^2 y% u/ M Buffer->Release();
/ O: W# _9 ]' H [ free(BufferBytes);; N: b- y, |5 i! S& p/ _
5 n7 N. S/ U: K4 x; P, M
& a, t l f5 X+ m7 z& c. A
3 B* O2 ~7 ~0 S% |+ Q, M- Y6 q return(bResult);( z0 l" n* L, l3 b0 |4 F$ t
} |
|