|
BOOL CPicture::SaveAsBitmap(CString sFilePathName)
0 {+ x0 H; d9 u% n! Y& [/ M//=============================================================================
1 G. H7 r5 g' T6 }; b{
+ o [$ g% p% j* W$ p: p- j BOOL bResult = FALSE;" I( {" r7 C: A; B1 [2 R
ILockBytes *Buffer = 0;
; `9 W$ [+ W3 P* @" b7 g8 F IStorage *pStorage = 0;/ W4 D- {! p0 V2 c% j; S- k+ u
IStream *FileStream = 0;
- i. ]1 w+ ^3 w0 W0 v& w4 @. S' k BYTE *BufferBytes;7 ?6 {0 U/ ~3 ]. z3 t: @& O
STATSTG BytesStatistics;
1 J* N4 Y: m5 F2 q* U$ o DWORD OutData;
4 x3 H& A% W2 \5 a2 n4 H long OutStream;
- a, K% H) G5 | D R' ? CFile BitmapFile; CFileException e;; T) t# E( p5 d5 G1 z0 U% C2 [2 F$ ~
double SkipFloat = 0;# k+ l/ `) G2 \/ S/ U4 F
DWORD ByteSkip = 0;
/ ]5 L, \9 r' k' c5 C# C, q _ULARGE_INTEGER RealData;
" C' l; k) m# r
+ R' S' _% L3 x( Y; B& e. a& @
3 [0 G# `$ |5 C( |3 y( S% C
5 r! R1 E8 p0 T& N CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
; A) H9 Z8 G& k" G0 y" n7 d; ~( _( m. Q3 l5 I
& E' \' c" z0 t$ N2 l
, O* ]7 O$ u4 ?8 Q% T: Y3 E ] HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
- m0 Q+ e: P, D# c) Q" ^ STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);, x# K! L8 }' N+ m: E! M
( N1 G. z. L8 [1 V6 ?. m, M( `1 _1 ~3 J3 v) x
; Y0 P9 P: ]2 c; ]5 V
hr = pStorage->CreateStream(LPICTURE,6 z8 ^0 K; S* W% [, y0 I& z, e# a) i! d
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);
6 G( k& Y$ L0 x& R5 s! m! G2 X8 R1 z# V+ Q) g6 q# i
o- n2 M. F. F4 {6 S
, B) V" N3 m5 A9 F m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream. m9 [% l; N- G; t, N" O
FileStream->Release();
# r2 @& j3 c6 i/ P, f pStorage->Release();$ u& [ ]7 k b& J( s3 G
Buffer->Flush(); - i8 Z ~/ V2 o) c0 O& _
* \5 e2 ^" L( H3 S8 a3 {
+ R3 {! z) o4 t
& s! q- X8 M# X: A1 d9 N+ |$ n* s // Get Statistics For Final Size Of Byte Array
2 n1 V- [5 U5 q0 y% q Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);, k, q/ |5 S0 E
/ b+ x/ k- h9 R- G' V% j, D( s5 F- Z+ \+ Q4 Y1 z6 U* M
/ H U8 q0 S2 H. |% a: }
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)6 P q i* O( V( B6 j# p9 g% j
SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks..." e8 l0 `+ ?& I, H, R' l
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;2 i( N. A* F! r6 q; A, X0 R9 m
else ByteSkip = (DWORD)SkipFloat;$ g& F0 m/ J# o9 G# L, G
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
2 A& p1 }# m3 r 3 K' A+ n0 f, J9 v9 ~
// Find Difference Between The Two Values: T% ~% O; Z U2 K3 B
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
/ D9 C6 _* J- H7 O! b5 t, F3 A
. G" f5 }9 Z; f0 e* Y7 X3 A
2 z/ M" D( K$ ~2 ~# F) y3 K
6 E# U: |3 }+ U$ r$ M- h: a! a: W& p$ ] // Allocate Only The Pure Picture Data
' p$ P0 ~/ d6 M0 P; h( H RealData.LowPart = 0;
5 ^5 L6 n( n* c& R0 ] RealData.HighPart = 0;
6 ]$ V' F3 }' N# A RealData.QuadPart = ByteSkip;7 U" i9 Y! z- j
BufferBytes = (BYTE*)malloc(OutStream);* S g4 ^. n* Y% Q
if(BufferBytes == NULL)
+ \% Q7 |3 I7 }+ ` {
6 P" ~! \+ r6 h Buffer->Release();
8 ?6 r: [3 A+ B9 ? HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
: v4 {! j$ C% M# o0 F! L: G+ x MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
7 x2 h+ N; Y& n& d9 Z6 w4 X: {' L1 `3 z }8 D' b; k$ F% g& F( X
( H/ X; g/ f. |$ G1 [7 B- B- S5 _8 |3 ~- h) O; [9 {; w+ P3 v
) K2 N" }, \8 X! G6 |1 f6 A2 z
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);3 M8 A; z- v$ N. I
; I2 i9 K }/ G7 G" T
2 l4 ?7 M3 p+ k1 t: `+ v8 g
$ p! c+ ]* L6 W1 b if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
5 R) D+ }. p- c2 w {
1 g' x; h. i& W5 b BitmapFile.Write(BufferBytes, OutData);
3 @. B$ W+ I) G BitmapFile.Close();
) I- B! h a* }7 r I bResult = TRUE;
5 B4 z+ ?+ J# J }
) ?+ r+ [, n1 `+ r9 Y else // Write File Failed...9 @" ^9 d+ s+ l! j* t5 R4 d
{1 @" y* x2 q5 [1 {
TCHAR szCause[255];
7 J" W( h% w1 C5 k3 ` e.GetErrorMessage(szCause, 255, NULL);+ \" A% Z9 c9 n( C5 F
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
7 E, n- F: `# ]6 Q6 l* h. U MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
7 g: W& K/ k' b( j1 Q bResult = FALSE;
1 j$ c' j2 @% Y& j) j }
0 w6 C/ h; |0 r' L2 q% L 8 b6 J: C9 x: h3 @5 W) j) a
Buffer->Release();
$ Q# b2 x5 c% `' p' C- b free(BufferBytes);) @. S3 }4 B* D' U0 ^
/ z7 B8 F2 s" B8 M% }, _
q- z( R. Z5 u& ~! V& F& n% }/ S( R. d4 l# d, h
return(bResult);
& X* v9 n8 W; w7 @) l( z} |
|