|
|
BOOL CPicture::SaveAsBitmap(CString sFilePathName)
1 c# l4 c9 K3 i/ a0 i//=============================================================================
3 d I: N5 l* }1 V{8 e# `* {* p- S3 R' P( f* d
BOOL bResult = FALSE;' B5 }/ h% @1 Y6 t1 h4 x4 ?$ Q# T d- W
ILockBytes *Buffer = 0;
- B4 {/ _ d8 e' _4 c IStorage *pStorage = 0;- }' b$ p" K! y {3 j" ]+ [5 P: q
IStream *FileStream = 0;
" K( k3 {7 i, @% `/ l BYTE *BufferBytes; ?- j+ E, V" k/ j9 z9 `
STATSTG BytesStatistics;
5 p6 r5 Q( _* p3 n. B4 x DWORD OutData;! H% u- E& v+ v: @$ I/ N+ ^
long OutStream;! u9 U& y2 _* q& N% h& w2 D& `. z" z
CFile BitmapFile; CFileException e;+ Y) G6 w" |) W
double SkipFloat = 0;1 h9 V" N6 X0 u6 J) Q
DWORD ByteSkip = 0;9 g$ N8 L+ x+ z: ?
_ULARGE_INTEGER RealData;" [. D+ k) E' u: y. ]2 [
5 t* @" R6 M) [ v7 r1 Q9 h& b, `1 M; u
6 F9 b' m. L8 H( G- y2 M; R
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer6 ?: t% [3 V6 o' }
; y' [# ~8 a6 t6 u3 U
% Y6 Z$ _8 P6 O4 E* E i1 \
) n, k4 V0 r$ A A HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
D0 g2 k( s* Y6 z+ y* J STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);3 ~+ g: F8 K5 n& [
8 K, r6 G- Z, s* T# S' x8 ?, ~
# X8 g% e9 ]- _/ Q$ R
hr = pStorage->CreateStream(LPICTURE,
: P) }# _4 B; Z8 q+ J STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);
% `" g7 h: [1 u, u4 j5 U
. }" G. i3 g0 z$ i: `
# Y9 ]+ Q8 Q4 X! U" q4 w3 ^$ [
+ ?3 a7 M4 m- T4 q" B+ ^1 l; U$ x m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
6 m* w1 n# i( G2 a7 A {/ E FileStream->Release();$ V' d8 c% t+ T5 C
pStorage->Release();1 }) J3 \4 b/ o0 O7 x
Buffer->Flush(); # c l$ y% |% o8 {% B! h' B, ?& _, U
1 a- q0 d7 W: d/ ]
+ Q8 {, u5 q& w" D3 J, S" E+ a' `. S u, P' j
// Get Statistics For Final Size Of Byte Array
& c" R. f) z7 A: O0 p+ C/ S Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
5 q0 ?5 X# ]1 D# q
0 h: \$ ^& q9 W3 i4 M0 O Y% m1 }6 [3 U/ `+ T( ^
3 E: p0 e$ \4 u# g5 ]$ U5 y9 U // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
1 S4 A* I0 U1 V! e0 ^# C SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...3 i6 j# q( {. x7 Q% ]% w
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
2 x/ E7 x0 v7 B2 Z" j7 U$ ? else ByteSkip = (DWORD)SkipFloat;
) m( {+ R0 C- Z! v' @4 D' A! S ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...$ c/ N. }# D: R' R' x+ W
, e' H! v% I4 S2 y" o# {
// Find Difference Between The Two Values5 i- ^ f8 C4 p9 _. M' H) \+ I
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
* _# M" I7 Z. v# l8 A, `3 Q+ B
. Q: e$ |+ e2 r+ d* W. Z
% T7 K$ M1 x( D" U$ f/ N7 t; ^4 Y# F0 B% @
// Allocate Only The Pure Picture Data
& b. o% R7 H- N9 @) n$ B RealData.LowPart = 0;0 D. E0 y, c( L. L& E# n8 f
RealData.HighPart = 0;
+ n7 _) s: A' a, \5 P0 X0 x2 D, t RealData.QuadPart = ByteSkip;
. R; R' r+ U! i0 K7 ]. e BufferBytes = (BYTE*)malloc(OutStream);9 D* r k8 q3 Q. x
if(BufferBytes == NULL)
, ~5 B/ ? A( [& ?, x @ {9 _8 a" D1 @4 V) ~ t- \7 j
Buffer->Release();0 S7 K/ S7 m9 X$ [$ ]$ g
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
! t: B1 i# p: V) @& c5 d) [8 t% ^) I MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
% i R* J0 }9 l" K0 d9 U }
1 K0 J( M3 b, B2 _' G. _" N, ]- U# x! A
' @1 g, l$ U2 Z8 V a/ ^! T
, d' q& n: i/ n+ W# o- ?
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);! O- k9 Y n; W8 ?$ b
* o. C8 I5 r1 l6 g
$ [ _. |; u' R: i
( V. R$ e0 f( J$ m; R if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
/ {) q2 {2 i, Z4 t) R {
8 [- A5 x& Y# V' J) e; n BitmapFile.Write(BufferBytes, OutData);
! k4 \+ z% L, G4 c BitmapFile.Close();
|, D& e2 L. ~ bResult = TRUE;/ n* M3 A3 f' d! N
}; \: I' j" @. G) Z6 o4 Q( [ i
else // Write File Failed...
3 T: _7 |/ j8 k! ^+ i. V+ ` {2 _. S( `) L$ D( c! t
TCHAR szCause[255];
! _9 ]/ i; r5 g1 T* D; M e.GetErrorMessage(szCause, 255, NULL);, O# |, ?8 S- `# P# ]1 p2 j! j% A. g
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
: P6 E1 l0 E) x# u MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH); f8 s# O/ l# o1 g
bResult = FALSE;6 ?8 [3 x3 W! e4 @- N( E6 h; Z4 [
}4 h* b' I d; T
* V* {+ n* W6 z
Buffer->Release();: ]! ]0 H+ e7 g2 y+ m- m2 T, d* z% B9 d
free(BufferBytes);
$ M( Y, o2 j! `+ w9 k- E! U; U8 T
. r# m i5 g' Q/ i& n2 o7 y; V
% r6 ?8 q5 R% c$ [0 Z9 Z; k return(bResult);. }- s1 L8 w& {3 e4 s1 I& X' M K$ A! R
} |
|