|
|
BOOL CPicture::SaveAsBitmap(CString sFilePathName)7 {& \( @ m9 }$ ]8 f6 J. A
//=============================================================================
" s: m2 O! X! Y$ w' X{ y5 w' z% y/ _" F7 r& |4 k& O' |3 }
BOOL bResult = FALSE;4 A% b# v+ D" r, r
ILockBytes *Buffer = 0;/ S* T# V' y7 n5 _; o: `
IStorage *pStorage = 0;8 q5 S1 h3 ~, ^: Q& t
IStream *FileStream = 0;
0 N3 r- |1 b4 g \6 Z" E$ b BYTE *BufferBytes;
8 M( a2 `8 r' B STATSTG BytesStatistics;5 w' S8 k; U" l U& |! a d# D9 r- p9 }
DWORD OutData;3 o7 o8 D( s0 ]! W! y) g
long OutStream;
9 s& Q* r6 c) j1 v( { CFile BitmapFile; CFileException e;
$ J4 m5 s8 e8 [! T6 R double SkipFloat = 0;1 a {( X/ p0 Z! c* m% X
DWORD ByteSkip = 0;+ C* C) H! z- i; V- e9 ^; ^1 L
_ULARGE_INTEGER RealData;
1 {: ?$ |' @" U6 U! l5 k
- }: p; E' q% g7 M5 J: G0 d( E: b# c; {) z3 N9 H6 `
- P9 D U; F' o4 @' |: o
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
9 Y; u. |7 P: b, ]3 \
* k- s! X7 [* d: S
* m- o e1 W! u
' u; e R" w# @- { HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
2 n: i% S, j! g2 g( J; P STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
c. J1 Z! m6 Z5 N ~8 h# O* h: k# P$ T# H2 j2 L& H ?
2 e/ |8 p2 |8 E j3 ^% Q0 s
8 H1 t# a, Z% D! }0 f" x# r hr = pStorage->CreateStream(LPICTURE,0 {: ]5 ] y. B- R7 j- Y
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);3 e$ N* b, C; v
2 d) Z2 A* e" H0 D2 z9 f1 d5 S `$ d9 I( [6 h
8 i! }* ]) J4 d: |, K+ A6 T
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream: _3 O) d; M" a0 p
FileStream->Release();, s/ K3 H. p) \3 O* Q; ?! p' z
pStorage->Release();! s" N& |* |0 H0 d% n: a
Buffer->Flush(); . n3 L) f g \. Q; N: n4 }4 h
2 k @& j5 c2 D/ i) T; x8 [" C
' p" x7 h% e4 P ?9 v# ]* z) i( c
0 N: u1 r- Y2 ]8 r" `( o // Get Statistics For Final Size Of Byte Array: Y7 p4 O3 H9 X
Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
8 e( \# u" j" }7 y8 U( t9 ^( U" `: l
9 X! l" U ~% m3 M m/ V9 M& L3 }+ O# l. y( ^
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
& v; i0 z& T8 i) x$ S. C SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
9 q! \+ ?. u3 V" v if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;, o& Y' N8 U4 b* h" i" m
else ByteSkip = (DWORD)SkipFloat;
) f! C- I- T2 I7 T ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
- T& e4 b9 D4 P- O( ~% l4 @9 p
, C1 S# N5 g3 w# s // Find Difference Between The Two Values+ b# H# E, j3 G( r. g: i7 T3 E
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
! V4 o+ b6 ?' a
7 u" G1 a6 s! J2 \% P: Z( J" E. {$ w3 @* z- L- r
9 X" C \$ y2 c3 I // Allocate Only The Pure Picture Data
% \; p+ j% ~1 J2 z3 Y; R RealData.LowPart = 0;
) q8 N8 X& h7 L p3 L `7 r RealData.HighPart = 0;
: K! Q' g- z. Q+ @& L2 p RealData.QuadPart = ByteSkip;
# P2 B2 N# f! S BufferBytes = (BYTE*)malloc(OutStream);
0 c+ H1 C) k# ^; Q4 z9 l) m if(BufferBytes == NULL)
/ D" `, @$ y( V( K4 ` {
5 f$ ^6 `! ^% ^3 n/ j3 W% b* X9 v Buffer->Release();6 j1 I/ t/ U* Q1 [. g
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
( p- h" [% I! s$ t' }" _/ g2 b7 B MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);; W, I; a+ M+ j g
}" g3 }5 t7 y) H% _
% w& G& ?7 ]: B! g
$ \1 W5 u7 K `+ s! h* g1 k9 K
; Y- [$ f1 A2 d8 s' M Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);# L$ P9 y2 A6 s
- I, o6 {7 p" ~5 e$ d- O( g D7 u
9 v3 F8 X) ?5 b1 O, H' X7 P. z3 ~/ o4 d7 X. o$ o3 }
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
2 x0 ?7 h5 Q2 W3 B" V/ W% X {
! n" c& O- h8 A# D BitmapFile.Write(BufferBytes, OutData);
* Z8 c- t' n; q4 N" r/ f( F BitmapFile.Close();) r+ @. y! Y6 B' B9 @# B% C* a) G
bResult = TRUE;
9 X$ C U( ?% h! J9 b* _5 ` }, m! j. a6 s9 b; m/ `' @
else // Write File Failed...- K; w( O$ D" O0 |, d4 N: a) r
{/ f1 ?, e/ F) [) v! b
TCHAR szCause[255];4 e" D9 j, P( `
e.GetErrorMessage(szCause, 255, NULL);8 W: x0 L& S, k3 \ z; C
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
& m7 M, R2 Q4 N1 M) x MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
, [- n) e# A& g6 C: e/ G' i bResult = FALSE;
4 L3 q d: v; d, \( w5 |5 Z% r }
- b8 ~% }0 q' J6 z |' d3 [0 a9 i" l4 R$ `% H3 f
Buffer->Release();
! }- \3 G0 X. @* R" R( D free(BufferBytes);
- A u' A4 B( F
* r) B% _* K0 m2 W% J* N( h" R. ?- J' H, `! D: k5 l2 r
! g. M; E, B |$ C
return(bResult);6 a7 U7 a# a/ H, N" q
} |
|