|
|
BOOL CPicture::SaveAsBitmap(CString sFilePathName)$ v8 d$ ^: R! |5 F
//=============================================================================9 \5 x. l/ f- E# r! K0 M
{
$ c G: ?) `( i/ A8 v ~ BOOL bResult = FALSE;
) z6 N! L$ K6 H& W2 a ILockBytes *Buffer = 0;
, C. T7 K! l8 k( f IStorage *pStorage = 0;
5 t! J. L% L- {( | IStream *FileStream = 0;# n* g2 @0 [) g: H4 M
BYTE *BufferBytes;' X) p9 P7 }) ?
STATSTG BytesStatistics;
3 t9 H6 {, \* I9 Y% l, A3 R+ |$ P DWORD OutData;' u) i2 a2 }" [7 i
long OutStream;3 i& K" C! }% I$ F+ g v' m4 O
CFile BitmapFile; CFileException e;2 d, x& S& `. F8 E2 B8 |2 C
double SkipFloat = 0;( w. m0 C4 g: c* [
DWORD ByteSkip = 0;
+ I. A" b: O1 Q! } _ULARGE_INTEGER RealData;& p/ C5 [# v. C. }/ i+ c+ @2 y1 ~
) z& e0 Z' E- g i- n) l8 q+ ]7 j! r. O- H" b7 o8 x: M" N4 }
* B9 i& r; c& ~: h
CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer* Q* L$ ~; m [$ U; O
# G1 V) i% ?( K- v& B
! { X; D$ d8 t% p7 m3 U5 O) q% X0 j, H9 _) J* T
HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
% y9 [# o1 i+ ~, I7 v6 L9 |2 c! q- O STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
! A5 z) [7 n2 e0 g1 ? {( T4 h) [: U+ {' `" f% I& t2 _0 W
8 G# I, y+ j" M4 @ _' w
4 H+ v+ U2 e/ ?' |1 d! Y9 B6 ~# `
hr = pStorage->CreateStream(LPICTURE," o# ~$ G5 G3 q, N+ W0 N3 A
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);
/ r' u; b& e' ^# ^: M( |
. R* s: u; n" y0 Y, ~* I: U4 s6 P" [$ F7 J/ j+ k8 d
/ C* |7 b5 s' r% p
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream$ R0 N' |, Q+ F% {7 k7 b- ~: {
FileStream->Release();4 W* T: w2 e+ [" ~ R) u
pStorage->Release();( [: s' G4 X1 a& O, y
Buffer->Flush(); , V4 R8 Y% y i0 \; t# R g
0 F' h& N" G8 [
, m4 \+ q& ~ c% y, R) x9 R
' o3 S5 U& [* U9 |! P+ @! i( `' s // Get Statistics For Final Size Of Byte Array
+ Y v8 u9 W5 J) y( X Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);
6 w/ y" G* V) J4 J" E+ ^, {4 A
* E% B: j0 H% l1 c) e7 B
7 A1 C! F! `* M1 a! [* D
) k' n, F1 r$ h; z& H* l+ F, t$ v // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)+ M# b% {; ?4 |0 i2 ^# i5 T
SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
7 w$ {7 R+ Z7 t. ~3 D1 r+ n/ M if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;" L6 ?& j o% E, {) Q0 y
else ByteSkip = (DWORD)SkipFloat;/ w/ x; _# w p q
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
- n% e/ B9 _' C! g7 i: @$ U/ Z : g0 m v7 X3 Q I( G& I. g
// Find Difference Between The Two Values6 p6 @9 J6 W6 H+ z( u; Q
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
1 ^- J! P, C: G. w/ |0 z. r/ F, Y* z# ]3 _+ }8 w) @7 c
9 Y. {2 s% m5 I4 K, W9 ?* A A' W q7 k8 }" y3 ~% c
// Allocate Only The Pure Picture Data
V0 S& _% ~- K* X& d) V7 d# | RealData.LowPart = 0;' M8 ~0 ^: X# w2 x
RealData.HighPart = 0;
! u' O8 d% Z2 r, @: G: u9 d( J5 \% R! ~ RealData.QuadPart = ByteSkip;3 @$ K# T7 `( y
BufferBytes = (BYTE*)malloc(OutStream);$ ^) q/ P. h7 P0 b
if(BufferBytes == NULL)
6 ~" b0 V& R0 O% X+ { {
! @; d% O: ~* z% d$ C- P$ q1 ~ Buffer->Release();% ^- w8 K0 v; O5 A% o2 [
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;' W% b- s1 `4 f& Q: |
MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
6 z2 K. _, B$ I: [' W* @/ f }
7 B0 w! |, j K6 W' t5 H9 K+ p
2 G' T7 u/ a& u; n }2 X4 W1 v# j5 z
' {. v8 `, O2 i
8 t' |4 V% j* g3 F4 J& y Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
0 q; S8 }5 @/ S0 r: R6 g ^( `0 {' k1 ]: @( e' q3 j/ k
$ D3 m) c6 j1 e9 ?7 z- c( t: v
7 J% u8 [2 j5 K# x if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
5 S4 C% `- z; x l/ g4 v {( D- c" K4 @) P
BitmapFile.Write(BufferBytes, OutData);/ [8 Y) f" T* c" b5 {4 ~
BitmapFile.Close();
$ H; e# e; _' X2 q7 {# i bResult = TRUE;
4 i# l/ ?% P2 |6 g% \! x }/ [+ j! T# W- j( a! u8 {0 J
else // Write File Failed...
+ P3 [ w5 E1 ]& t1 a; v- V; ~ {9 x/ c5 c, F) h1 L& [
TCHAR szCause[255];
6 }- A& ]# q, w e.GetErrorMessage(szCause, 255, NULL);
, B, `" r W' x0 n- d/ i5 ~ HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
; _. X4 n9 ^. L5 v+ B2 h# P# W MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);- s& R' @: U2 n9 O
bResult = FALSE;( E" E% Z H9 W6 i
}' M' H: s" w7 f4 J: p; T
2 `6 _4 c% B" E! i2 w7 w ? Buffer->Release();$ q! Y- O. o" s( ?! {* O; A) D
free(BufferBytes);
0 ^$ m: Y1 l5 q$ X, b$ Z
! ~2 s1 {& i2 R1 i* N) E. ~# H I( Q- Z4 ?% u
0 W0 t- C8 t, x& y return(bResult);
' r5 n- x- x$ j} |
|