|
|
BOOL CPicture::SaveAsBitmap(CString sFilePathName)) ^; D: K4 i! l! z6 J8 r
//=============================================================================
4 Q: v2 j; C$ i* b4 M4 c+ L{
# A4 w: B% M, t1 ? BOOL bResult = FALSE;* W$ j# \* Q/ m* K# T
ILockBytes *Buffer = 0;
Y' A8 Z+ ^1 ?2 B7 ~+ c1 N IStorage *pStorage = 0;3 R' H# H* t* q- m* D
IStream *FileStream = 0;9 s2 _6 Q1 d- Q% z2 B% y
BYTE *BufferBytes;% A/ ]/ ~5 u t4 _8 k: x( g0 ?
STATSTG BytesStatistics;3 C8 L3 D0 F9 N" ^7 e# y5 z
DWORD OutData;1 D& b' I% J5 f; ~+ ]7 X2 B5 n8 Z
long OutStream;
5 H* ]- B& p" h4 R" C5 U CFile BitmapFile; CFileException e;
/ ?5 }" ]4 _4 p4 j) } double SkipFloat = 0;
. I* g V( C5 S& f; }" o) f DWORD ByteSkip = 0;1 W1 p* e7 z( E
_ULARGE_INTEGER RealData;. ^! S+ `" a3 C# P. }5 E
1 u- _' T* Z/ x- V4 F# O
9 u$ i8 n- r* x5 t! Y! p# a `
+ D* v+ ?3 J; s- t3 | CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer( N2 W- a8 P) X) B- u
" E4 D3 ]" U1 T5 \/ S5 |* ]
/ o% i9 ^1 N$ ?# |) Q# \8 b7 |/ |& g$ d2 `& @& e+ a0 e, V
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,( W2 F) ?; j2 p) P% B
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
+ d- }; I8 E/ W: j( y
3 b z7 l. y- x5 c+ @' h4 z }) P" z5 p
5 U" I6 H$ J V/ o/ d* c
hr = pStorage->CreateStream(LPICTURE,
/ Y! G9 h: x, K8 s' O N: m: J STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);
U, D: h1 U- @5 A4 h3 C3 B% i$ v9 \1 F$ D
6 G& p5 R6 o+ b$ ]3 e6 T
, [; F% E) [( f5 R+ G1 ]0 i6 i
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream; |9 |2 S! {$ ~9 ?% k
FileStream->Release();' v1 X$ P$ P6 p Q0 F% |/ L2 U
pStorage->Release();( S$ _) |# a' s. N) b
Buffer->Flush(); 9 I' }" o' X0 t+ B. m2 z) w
: {3 o- y w8 {, M* }& i
4 V! ^3 E3 p M7 l& V4 N' v3 ^; o0 [
// Get Statistics For Final Size Of Byte Array
+ e' ?7 s% e0 Y Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);6 @5 @* | c7 t/ |; \& \
0 N/ E, w1 k# O* s
7 Q# u2 ^. G' N% {4 j9 u3 O( H$ H# i+ r4 O
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
4 J, C# w0 o( L- h SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...9 }- q, ^' ]" R
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;" ]9 N. V R) \9 O+ [* k+ B
else ByteSkip = (DWORD)SkipFloat;
3 Z% s' V' \" q9 f. F ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
2 J: L( P! ]' s( W
! _- ~& }+ p2 K, U) P6 f // Find Difference Between The Two Values" C7 s3 _* h# g% _! G& f- G
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
9 t2 `7 R6 J/ a( I. D
. N- l8 X& f2 y% j' |; Y7 f$ H6 M5 Q4 ]$ d& Q
3 o. n% x, }0 x; T, T. e
// Allocate Only The Pure Picture Data
* o: N) I" `7 W4 u RealData.LowPart = 0;
$ ?5 `: Y+ U/ w9 D( k2 L9 C RealData.HighPart = 0;
$ v3 J- u9 u) i: N$ B2 k, g' U7 j RealData.QuadPart = ByteSkip;# k$ I. ]( |5 W8 j
BufferBytes = (BYTE*)malloc(OutStream);
; p1 I; c, @3 b' h; i! w if(BufferBytes == NULL)4 t" {- ]8 r5 Z* _
{
3 p5 u9 `3 @' N* F; l* v Buffer->Release();
& V6 A6 R8 B+ A+ ~# b6 A9 M2 k2 } HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;, u2 S, C( w$ F
MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);5 R; z G: D3 f4 _3 r' m/ q9 u7 g& @
}3 w4 z6 }# h& V9 |+ }
$ d6 A) q* }5 {* r
+ | t* r" Y C# u
I( n. D. G# \% s, M; Z
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);" h, ^4 X$ z2 _6 E
* j& \) g( B/ `$ E5 [
. ~, i+ R# e4 ], D; X8 c
) I# Z; e3 s8 a) f" N2 v4 b9 S% I if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))6 H) o) Y2 e0 x6 x) t& C H' |) M
{* C5 F, W/ H$ k2 ^0 n" x
BitmapFile.Write(BufferBytes, OutData);' A, @3 Y/ ?, ?+ S N8 `( d
BitmapFile.Close();
! X) K2 k) Z. `4 t bResult = TRUE;! f7 {* V; p0 c, z8 }3 P
}
8 A$ `. I# ^8 A" j8 A" b' q else // Write File Failed...3 {2 b1 h( R3 |0 u, K7 h g
{
, y4 K" b1 ?1 P* o" Z TCHAR szCause[255];
/ w: k- p5 s- H6 J e.GetErrorMessage(szCause, 255, NULL);
; G+ k! R& a7 G5 W& \ HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;. \8 x+ d Q& F: s% C
MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);' F9 F. Y) R/ m
bResult = FALSE;
/ U& }* w3 X! a1 q! \+ @ }& O" q$ b0 u& G5 R& E! |6 F U( h- q& D
/ Y# G Q) ?0 l Buffer->Release();% U: ^5 L3 a4 J4 ~0 |% Q7 K1 R
free(BufferBytes);/ @ H9 }; \8 Y) f. ]/ b8 Q j
8 d5 |/ }: Q @% X1 T _1 A% g u, M
; E. o& Z9 Z' X: ]- ~. M% }9 U) R0 u, l% w) t' ]+ |& J5 D3 U
return(bResult);
6 Q/ ^2 Z5 x9 I' g& j+ h' _! Y} |
|