|
|
BOOL CPicture::SaveAsBitmap(CString sFilePathName)
; u% |6 ]0 f! i2 h& J0 v8 {//=============================================================================" `" `7 f' t. h' h8 l- }
{
) O( D1 O; l8 X3 l BOOL bResult = FALSE;8 `' c+ b2 ?6 n0 D; [' b
ILockBytes *Buffer = 0;* Y# R4 l- L; T
IStorage *pStorage = 0;
" F9 K- c& e( \# N5 L; }8 w# d IStream *FileStream = 0;
' p: s! s8 p, B BYTE *BufferBytes;* L; e) H$ x$ n6 S7 k/ b0 I8 E
STATSTG BytesStatistics;
& R' u! \3 d6 p; _4 M2 F DWORD OutData;' Y- j B7 c4 c
long OutStream;3 p6 P$ T. Y6 z5 K4 b
CFile BitmapFile; CFileException e;! G5 Q2 U) R1 @
double SkipFloat = 0;
* D+ k; T8 F3 s; ?) \; t4 S DWORD ByteSkip = 0;
0 Y, L+ s7 p8 i+ o. o' R/ `" z _ULARGE_INTEGER RealData;) O6 N% I( f& j- n8 J# _7 [9 a) e
1 G8 Z. I% y" l4 h ]2 q
2 N; e- Q8 x) t( o2 r6 _* o$ S+ r I7 j
" o7 Q, h7 M! R \1 W CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer
. `! B! @4 P9 I. H( h* F1 z8 Z6 z% @4 ?4 G+ i# j0 {' w
& M5 [& W" d9 h/ ]3 V: r' y
3 h# Q1 Q& k4 f( I9 G5 O, |- L# z HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,& T: z' [% x! Y; |4 `
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);& v0 C6 |6 M+ T$ \# R' x. F
l5 X0 F8 S- p) h" f
7 v# ?. w% f( C! B& p3 N" G4 X2 p
hr = pStorage->CreateStream(LPICTURE,7 |1 E+ j+ u; d4 k
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);* X( ?3 ~/ u5 m
1 D& x( i9 c: n0 W) `9 d
( E; X; D, B, ?; F' Y1 D4 a: y2 a8 r$ ]% q! y4 w
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream8 y! Q. F- I9 c$ z3 G
FileStream->Release();
. U) X3 {& V# V pStorage->Release();! H. M# a5 e: B! E
Buffer->Flush();
" R) ?4 `+ r( ?! D0 a8 U
d; r5 w$ ]0 c' C7 {/ v7 K3 L7 D, ]7 D3 N
- r6 N& y4 w, E // Get Statistics For Final Size Of Byte Array
; c# C' g7 X! r: u- C Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);) v- Y2 w4 x1 Z) `- g# y% O* p
. d. ~: R8 a3 ]$ F' E. u6 s- Y' ?1 S6 L1 j$ g% b! q- a
& N5 H7 i+ X9 q) ?, i // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
9 z; K( V7 j/ c4 D2 L5 L& C- [3 R7 N SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...5 L# S$ [; ^5 t1 R
if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
1 x- a" n8 k( c& V4 D else ByteSkip = (DWORD)SkipFloat;
' H, R& Z x" W* f0 W' g( O ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
! R% Y) C- x( f# P( u" ~+ |$ W ! I n0 q& O% [; w0 D
// Find Difference Between The Two Values5 S' ]( ?0 q& j( }8 [% ?4 I9 N
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
: |5 B+ v) K) X, i: o9 }. t b' W' U0 J6 T5 w
, U4 W% n1 x( f, O/ k+ s ~
% v+ Y- d( f6 A4 c* W1 q- M
// Allocate Only The Pure Picture Data$ q9 @ L* b8 ?
RealData.LowPart = 0;: R" Y# |9 \5 ?) r# |, I
RealData.HighPart = 0;
8 s* g6 ^% p$ z: b3 E; n RealData.QuadPart = ByteSkip;" g7 N- o t3 D$ t' c
BufferBytes = (BYTE*)malloc(OutStream);
8 t0 `/ H+ ^, F# K5 u. { if(BufferBytes == NULL)
X! v6 l3 D6 \0 v+ u# K' Z {
+ a: \5 z4 C+ a. \% E( y Buffer->Release();) z* y. k% P) q6 ^9 T7 B! A: w
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
' ]# L* \5 u' C- |" w- y MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);. t( f: }& O% ~ p; H
}. y* O0 q6 w' @, Q
9 R$ Z! x# c _. \
9 J" K" i2 ~! s7 m4 W- n! @
$ p1 g' V6 @! k: t Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);9 a( w) j8 E/ g u
% K8 ]/ {( G7 q) B- W( y- `" d
" k$ A0 _; N* F/ S1 @& j0 j, T7 p
. Q% }- R2 J) q* H% s2 O s
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))* w3 F: F" X+ s1 S
{2 B( `# W% y; ~
BitmapFile.Write(BufferBytes, OutData);$ j# O6 S5 r9 z3 I! V8 L: z
BitmapFile.Close();
( Q) T1 s9 ^+ Q' c) h! L bResult = TRUE;" q& k* p/ F7 E8 I; f
}6 b! O0 L4 w3 |2 {! X( }: p3 c5 h
else // Write File Failed..., t2 V7 f* U* |2 x
{ a# w( k: ~8 j1 m/ T5 ]
TCHAR szCause[255];
7 U8 J; [3 H2 A e.GetErrorMessage(szCause, 255, NULL);' W' F3 k8 e' |# B% F
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
% @* v5 |* U2 q+ X2 Y/ E MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);% N' i. p' ]. ?4 n
bResult = FALSE;
( u i1 A- }% N" _4 K& u }/ {# K6 S, W2 L" V0 Y1 H, J8 f
4 N) w3 u0 Q" A, {8 a Buffer->Release();
) k5 P4 E, u6 }; V( F2 z0 B; l free(BufferBytes);5 v! z% l$ ?3 c: Z# m# K
& ~0 ~7 P' ]; M
- i0 `* O3 A2 l$ W: A5 a6 r ?6 k# V1 E: i, B
return(bResult);
5 B1 V l+ J, H0 Z2 D$ z4 e$ k} |
|