|
|
BOOL CPicture::SaveAsBitmap(CString sFilePathName) u& n# ~0 l& d9 w0 A. S
//=============================================================================5 A. ^1 J% ^* a9 {( B: Y
{8 j, K9 s; y( n" `/ A8 t. g o' @* f
BOOL bResult = FALSE;) s# y+ Q3 k+ N) {# H
ILockBytes *Buffer = 0;& J9 }/ M6 d; \: ?$ A
IStorage *pStorage = 0;
3 x% t) Z' \/ x$ Z IStream *FileStream = 0;# w! f$ @4 C/ g' X
BYTE *BufferBytes;. a4 U: \- r2 \2 t7 D: z
STATSTG BytesStatistics;5 Y$ u o! G3 k/ i/ `( Q0 `' w% M
DWORD OutData;) e& Z5 |- @6 E/ x1 H; \ g
long OutStream;
& \7 i5 p8 U2 M5 W/ K, O k" e$ C CFile BitmapFile; CFileException e;7 F1 D) X5 r7 U* D$ s; ^) x1 R
double SkipFloat = 0;
2 \7 E R9 |! G: ` DWORD ByteSkip = 0;% g' [4 [! \# \7 n8 U1 t8 }5 N
_ULARGE_INTEGER RealData;
/ R0 C/ F' k$ i9 I& M7 l3 [$ z6 i6 k- b0 z( x/ u F* y
8 ~6 W& H. n @0 g0 q3 H+ M( p) ]# W
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
" ^1 _8 q7 P" x3 c0 p' F
" B, c/ k, f9 t; j) a. U0 o5 h' C, b1 W( L; G) e
$ ^, |, P" p+ O* \! p
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,& U5 v: C# [1 R% y7 }. f
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);$ Z$ `9 \8 p7 |: \ E( D
5 m' w2 @6 e3 V6 M' D3 l
* S6 B, W& ?/ d2 I5 S
% {1 U$ K( i* q: b$ b+ y6 i2 F& m hr = pStorage->CreateStream(LPICTURE,6 U- v B! F" v* I3 _
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);
$ U U$ [1 E; c* Z0 |* ]& n5 h: s5 W
# z5 i( V; ?/ C9 S0 p
5 a0 f6 p4 b6 `; b O2 k4 S m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
# k( ]# ~3 D- z: @3 o- r7 M! { FileStream->Release();( f* y& r1 g7 S' s3 T
pStorage->Release();
# k+ |5 n) k7 Y" t' C: N Buffer->Flush();
+ m/ Y, N, o# i- P8 |( k u, r
% l: ~; R" M3 W8 ^
* F/ y1 w9 o0 T( n. ?
, S( h) C) H. ~7 w9 f0 ~ // Get Statistics For Final Size Of Byte Array
0 D% T e4 J# q! V Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
% c8 Z+ h' C3 P. T. `, Z0 {3 N* K4 H' i7 {5 ^* g. i
# p# N- S$ R& H2 b! a+ W) [0 M& b1 O2 G& ?' ~3 p
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)- e1 i: n7 x( L1 j X: V
SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
' R- [ U5 R( K4 D; O- o0 l4 c if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
/ `$ @# w6 l- Q/ A2 R else ByteSkip = (DWORD)SkipFloat;0 `- o4 O6 E1 Y0 H$ T2 }( a! k8 ?
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...0 R: m D* e4 z0 E5 H3 H
9 G9 W( ~+ l# L7 X# P& c0 W$ z
// Find Difference Between The Two Values' J0 k: K7 A3 o+ t1 P
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
- i/ Z1 _ Z1 N$ z4 t
& k2 k. W. C; M% x, e* A0 Q5 R# H& V' b: |. \! H" G7 h& a
: i- Q+ l) n* c/ w1 |
// Allocate Only The Pure Picture Data' C# S( V( F! o; D
RealData.LowPart = 0;
$ r$ y1 H3 _$ r- ^5 z RealData.HighPart = 0;
6 V$ O$ B& u& i( z+ `3 @ RealData.QuadPart = ByteSkip;% N* {! j* K( F* V
BufferBytes = (BYTE*)malloc(OutStream);
5 Q- O! \3 ?9 ^4 Z1 u6 Z if(BufferBytes == NULL)8 M+ z, {' M/ h6 O* k
{6 d( {; J8 ]# U) k8 Y2 R
Buffer->Release();
" W B0 W' S" j( A$ R# S3 U4 I% D: _ HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
5 ~0 k: V+ P- g0 u' _, @ a0 _ MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);" h5 j- _2 S: }5 Q( V' |) F" z; t
}
, V9 H+ M# c. q5 P+ k, P i( T4 P; ?* x5 y
- C; ^' s ^" p9 |( x) x v% f
. g6 x$ s, F+ B6 {! @' t: h Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
6 R e$ C- p, R4 d1 n( \$ P
% u! z2 j% l: }5 }: y* Z0 H' K+ p( Q/ H( x2 z9 D/ F
# r9 Q1 p% F2 Q# }
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
8 n3 L% a+ m# u* s% @6 r {2 X @/ _# d6 w: S
BitmapFile.Write(BufferBytes, OutData);
, F+ [" t/ j+ @ `* | BitmapFile.Close();
% v2 N5 P' N5 D: i; s bResult = TRUE;
' R8 v% k* D9 x/ y& j t }3 M( t q' T2 }9 s2 ]; `
else // Write File Failed...' @9 ?- D, d; n2 R# M3 s7 u" x
{
" {, B4 u8 S- W* j TCHAR szCause[255];% T8 d( O2 P3 e5 i) {# I3 P1 f+ c4 W
e.GetErrorMessage(szCause, 255, NULL);% s# ?& F' u$ k
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
: y* N7 x' K: i4 w' H) U( z+ J MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
% ~# Z& a% R9 c3 y6 E2 U% J/ Q7 i3 J bResult = FALSE;
% y3 @8 f. Z8 |+ @0 k' A }# A$ x% f0 \# f0 O
5 J p4 ]2 @9 T, E! i# Y; c1 ~ Buffer->Release();4 M% `& Q# ]+ R' k, n0 H* U/ `" E
free(BufferBytes);4 A" K7 X& E7 \9 M5 ~, K
' r1 B5 d0 I( @9 X7 W" {; ~3 k. d" }, K# S
5 D3 A* E& Q$ U8 M" i( ]# g8 r0 Z! P
return(bResult);/ w$ ]* h. S3 T
} |
|