|
|
BOOL CPicture::SaveAsBitmap(CString sFilePathName)# H. b2 K& {% o& w2 V/ s8 y% m
//=============================================================================
) H" v' N5 r# G* G7 G% u{
) e5 U% J' ~, | h" S g/ C3 m; E BOOL bResult = FALSE;
6 A0 _7 J( N, S9 m. A- k0 @9 k( Q ILockBytes *Buffer = 0;
$ M9 t& L# q5 ]! z) D; O IStorage *pStorage = 0;
# C, l1 A: c e( ~) M3 Y IStream *FileStream = 0;& z9 L3 N- a5 T7 x# l o) M
BYTE *BufferBytes;6 l3 m- a" @. f: I
STATSTG BytesStatistics;# H' a6 t6 P" H! z
DWORD OutData;( C. v: N* G" }. d6 x
long OutStream;
! O7 I+ c2 L8 n* v% \( [ CFile BitmapFile; CFileException e; Z! h- n w# i# r( z* Y, y1 e _$ \
double SkipFloat = 0;8 i* l6 T( M# u9 x( ~$ F5 \
DWORD ByteSkip = 0;: l$ x) K. Y3 p* `# P# X; u
_ULARGE_INTEGER RealData;1 U9 b9 q! \' I
) i3 `5 q7 Z4 ]5 N+ R4 M( R
- w, ~( Q8 G% Z0 V+ A- Y
3 A1 Q b' t4 G& e8 L4 w CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
( ^; ~( U @6 Y0 E& w$ A+ a1 x9 j, q, |, a
9 K- @ D$ h( |3 S. J, g% x1 L; J& a' T6 n7 N5 Q+ L
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
9 S3 a( f7 k1 Q+ F9 Q% C) J STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
9 Y9 I/ t1 k- q/ @% i) ~, R. Z
6 |# c4 V. C9 d4 ]1 `3 I9 J6 t
2 D8 _5 o3 D5 @4 e( I/ N+ L2 W3 t- c" s9 P
hr = pStorage->CreateStream(LPICTURE,& `3 @: W' k+ n8 Q0 }
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);
: F8 G$ b& }( m9 o9 n" N' E) A0 F: N. B! s
6 V- y- {* u* ~) |& W% y+ `8 r
! a2 k0 u4 {9 @& d- Q) T m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
9 t. U, _" z8 F4 ^3 { FileStream->Release(); X2 S9 M$ O+ U$ Z
pStorage->Release();
0 M9 Z9 m4 g# h$ b7 ~ Buffer->Flush(); 6 m6 u5 L" g, f0 `- Q" q4 g
% a9 C3 H1 J" o$ `! E* c4 d1 I
( ~! E; N; e3 `" r" T4 Y; j4 n% h. U- F0 _% b5 i3 a) f) D
// Get Statistics For Final Size Of Byte Array
" u' k2 C5 r, d" u8 t# z6 e Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);( A: `; {* ?3 J, y* N$ w6 Q
$ E& x9 \4 ]2 m" r9 w2 V% M- R- U
2 r8 J2 ~5 y: C1 j' c8 d/ G. A& O; g. r# T
// Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
% j% m' E& H( d! F/ _6 V SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks..." m) {" ?# j" [4 }; H m
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;' m+ z0 l8 R5 f1 G5 U' @7 o J, M& [
else ByteSkip = (DWORD)SkipFloat;
- |" H6 i2 e1 @8 Q' _ ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...6 O! R% n- j c+ x$ b5 P
: e4 w. ~2 u: m6 Q8 Y4 F // Find Difference Between The Two Values: d+ b5 Q7 b* G+ d, _6 W
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
( M6 f- a3 I6 Y2 U+ w- K
, x U1 }" N+ l' {& e
6 x/ o, C6 i3 x5 c5 b) X6 e) R4 |. k: c' @0 y! ^1 S1 t
// Allocate Only The Pure Picture Data5 H2 H5 y% g5 A) B$ z: m0 O; }: i6 b2 e/ Z
RealData.LowPart = 0;2 H( d$ ^; |1 L& |0 X) C
RealData.HighPart = 0;: H1 j5 v/ h# a
RealData.QuadPart = ByteSkip;0 |" V7 W1 f8 }& u1 `7 S
BufferBytes = (BYTE*)malloc(OutStream);
b8 s5 F, ` F- L; B3 m if(BufferBytes == NULL): s' I% {3 \: j
{
6 c( I) N3 O {, u# Y7 M) U2 D Buffer->Release();2 ]5 h4 k0 Q: R3 S
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;6 v/ j6 L& [$ t% d, M1 J% `0 Z
MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);/ m1 }5 u: K) B x$ b- L7 R8 C" K- k
}
+ i5 [4 R3 L5 a- ~, N" J9 T
: l! c* S. |/ c: y5 v& `! t
% s+ k, t# M7 V2 T Z5 y2 H, ^+ h( `& P
Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);- e8 `/ I2 k8 h- @
* _( S/ {; A V
# F! e& N, j7 k% n
/ x! p5 x3 H9 |: X if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e)) [* }# L7 E& l! J/ }
{
8 W! c( @, {2 z; w( u BitmapFile.Write(BufferBytes, OutData);2 u* b& r9 d* |6 z O7 L [" k
BitmapFile.Close();
! P2 M/ _# A4 K1 ?- b% I: }5 n% ? bResult = TRUE; S- {( p7 x6 g a: l3 d0 z4 g
}, B; A6 \, ]* i$ a
else // Write File Failed...
) a/ q; ?3 U r: g C5 N {+ j# k ^" I# v3 ?- r+ `: A; `
TCHAR szCause[255];
( S& C+ n6 a& u' f9 q% [2 t+ z e.GetErrorMessage(szCause, 255, NULL);8 _* z, _2 K: ?' f
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;$ ]. ~ k5 A, d5 k$ u8 B
MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);2 H+ ~$ b' n' B6 M8 j4 E, L5 H
bResult = FALSE;
2 v1 y. u2 q, ~8 C, G$ m! n2 d }% x! e' D( o& v, G- g
5 v3 z8 K# |4 S0 o+ P+ z
Buffer->Release();3 t; I: |8 B8 s8 i
free(BufferBytes);
5 @% u$ f' D# H) T6 C
* |* l9 E0 X8 P% i; Y4 Y4 \. d* L4 M% h9 A$ p
2 I% V' p) a* R2 _
return(bResult);
; @% U i5 Y' \} |
|