|
|
BOOL CPicture::SaveAsBitmap(CString sFilePathName)5 _, ^9 E8 t+ C( y( F2 K
//=============================================================================, ` R3 k& [& q
{
; A1 ^7 v s$ ? BOOL bResult = FALSE;
- _2 h7 v3 r/ i( l4 @( p ILockBytes *Buffer = 0;
9 o3 U" J X" ^3 U2 O6 t- ^" k9 t IStorage *pStorage = 0;4 o" N0 ~& u$ o7 ]! c. p
IStream *FileStream = 0;! {6 ]9 A1 y# x2 r$ J1 Q/ U
BYTE *BufferBytes;
% N$ G# o2 M* E STATSTG BytesStatistics;3 D/ L# w- u1 l0 {* B2 Y
DWORD OutData;
2 `, K6 s( Y* X1 K; Q L long OutStream;( C, E& A5 J' e- A1 s3 {; |
CFile BitmapFile; CFileException e;* x$ p' b7 i- n# ^" K. @
double SkipFloat = 0;
: C' [8 y8 C1 T, Q1 B/ c/ \ DWORD ByteSkip = 0;
6 }4 h+ ^2 \% w q _ULARGE_INTEGER RealData;
& t; E! g: B) v2 |; s2 `
- U: o5 D2 n3 G7 B
) v( ~1 D% ^( ]8 k: R% l4 m2 @
, d. a$ Q7 y- n: V CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer5 D5 o4 k! o$ P1 X4 y5 D
, z* n4 P4 [5 s$ v1 `
2 _ u4 }- J3 h0 W; V1 w' m4 x* A* ]' I' j% g% h: b0 j
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
5 x3 L7 V0 l2 X STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
9 _; `# K1 `. k) F
1 e7 e" q) @7 r- N l, W" R) U N n! q) F- D. d, R/ W' o X7 @
# Y r; I7 Z6 C5 l
hr = pStorage->CreateStream(LPICTURE,
5 G/ o! ]- [! U( d3 a5 W5 x X" H STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);
* u- R5 g8 O5 r1 e8 w3 H s: D) x1 y: }4 V1 I6 @: B
! E/ }0 o4 o9 W' D, G* Q
( v9 L* Z0 H: a m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
, k. K4 i' y F5 x% N FileStream->Release();! }$ z/ {! Q% y( [, V8 A7 e6 S$ e
pStorage->Release();7 S# l5 ?' H" R
Buffer->Flush(); ' ?& |; G+ g8 \" C: u) f# [1 J
/ G" a! E; {& J
& } m0 d8 Q# u% h& k9 y8 O7 ^7 o5 \
. ^& u& D. `0 @1 }! y // Get Statistics For Final Size Of Byte Array
. o/ B4 d' Y1 A2 [" M$ B/ B Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
% j6 B8 A) ]/ f
( P# z" a2 c; [) P+ T3 A
$ U% x+ o) o9 b! L* b6 h0 {
/ g# g6 ^* J* i2 C, ?' X // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
$ r& N) i- O) N5 m, w/ j SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
* R' u) e" r9 k4 f, p6 M* S if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
% X; @) B2 ?* b) R else ByteSkip = (DWORD)SkipFloat;
+ a$ P4 X" ?. [6 E/ G8 m ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...2 A# C8 \' ^0 W+ G6 ?
) `! L* J' A/ B4 f2 s9 W // Find Difference Between The Two Values
' c, I7 b2 @) x4 \7 ]' G ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);7 Q/ E2 ^. O; T6 \) q1 F3 T
% }3 n7 C, ^# S& v& x$ S% W4 ?- q
8 u/ [2 p8 h+ S! x; f1 l' b+ ^ @3 ~
7 D% r/ |# X: }8 G' v
// Allocate Only The Pure Picture Data K! p& L% o; y* S$ y2 A
RealData.LowPart = 0;1 W( [7 Q9 k! R7 |, Q3 s W
RealData.HighPart = 0;0 o _7 g* |1 X2 _* a5 ~6 i4 N; \
RealData.QuadPart = ByteSkip;* K# U2 H3 B0 w, [' v
BufferBytes = (BYTE*)malloc(OutStream);
/ ]- T$ j1 ^3 Y; k if(BufferBytes == NULL)2 @6 f; O P" ?5 _% G5 q) ] Z
{. G5 X0 L; m) S- X8 r t8 p5 d
Buffer->Release();
! i( }. D9 \& E4 a9 K$ e HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;2 C" F ~! {1 g0 y9 H/ q' I8 h
MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
0 ?4 W3 ?7 T8 G! `- U }
9 s: \) G$ ? z, C! s! e3 J5 J9 E
( e" J2 }: \; B7 M5 ]1 F6 b& e! F, w( q
" ~" e p1 x. \9 H) O" M Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
( H- V# f, J" f8 R: d
2 O( z @. x2 i3 `) G) s9 O) F4 P. U6 m, s2 A
3 q) T* i7 G$ O3 o! T if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
- C/ P2 _: P0 I: K {
0 S# Z( I- q, U3 j3 d# ^: w4 E BitmapFile.Write(BufferBytes, OutData);: p; g/ o w/ x. r9 P* |
BitmapFile.Close();
* F" v0 T+ p: G/ |% u" B& _* w bResult = TRUE;
8 o9 [# n! k# Z9 {1 J3 X } o5 f+ J8 |: i& S8 W5 w4 i
else // Write File Failed...
, j2 Q+ Q: X. g% x4 \! q: s {
' E+ E. ~, r( Q9 s3 p( z TCHAR szCause[255];
1 ^5 J, r6 t" [5 t, o' H+ h e.GetErrorMessage(szCause, 255, NULL);
4 k& Q& d, q1 H. d# u1 r, Y* l HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
# f, a1 T' A2 V4 x. q) V MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);) c9 u+ `: F* d9 X H
bResult = FALSE;. K3 l8 j" K; `4 v' I6 i
}/ |1 l: Y) Q6 Q4 r0 f
: T* k. Q/ u+ I+ S
Buffer->Release();6 v, n) d+ i' F7 l! A- w* W
free(BufferBytes);9 U% M! K- n7 c' d
+ n$ ?" L' Z' g7 X |; X6 a6 z
* L) V% t. m" J3 K! ?
~& _! O6 B4 M! v; l return(bResult);
5 e! }* m1 x- ^0 H. H& @3 t6 w} |
|