|
BOOL CPicture::SaveAsBitmap(CString sFilePathName)+ @: \* S* _: T. c2 E8 D3 _ H4 T
//=============================================================================% `0 E m* _6 k+ f4 {
{* I1 _9 T& x- H, n
BOOL bResult = FALSE;
$ d* ] ^. q8 |1 w8 U; T; D ILockBytes *Buffer = 0;: P( C! l! c6 r" j! i; }' x2 ?& i
IStorage *pStorage = 0; M' N! T% b' Y* R" q ^ T
IStream *FileStream = 0;
4 o1 R0 _$ g( d x- F2 E% Z: P: U BYTE *BufferBytes;
, ^# {3 I3 U" |) {. x8 ` STATSTG BytesStatistics;
1 \8 {6 a6 L8 [9 ? DWORD OutData;
' u- |+ p- ~' a long OutStream;5 y( Z4 X, K6 i5 K9 A3 k
CFile BitmapFile; CFileException e;
% C8 {! v( x- x' l2 } double SkipFloat = 0;1 J) d& h8 g' c1 W/ d7 X* Y3 Q! ]' |. y
DWORD ByteSkip = 0;: D, B% T* ]7 c" m2 F7 N! `6 F7 o
_ULARGE_INTEGER RealData;' ~# H" c2 z' s6 ^2 a
$ L4 [) P- |0 b5 ^' c ?. S) W+ u+ c! p8 Y$ N8 u; r
' U; a' y7 K) y# A CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer$ \7 N9 R; f! p4 T
0 {4 Z9 u6 f9 {# m6 m! c, c
- {& i4 L: `( p
9 f, v5 m' ?9 X; @" q* n t HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
, |) [' q: u5 n/ e. `5 \! f STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);1 Y" _4 C) E1 M3 m( N. C/ `& f8 h
2 C1 W9 O1 N" @( ]4 J4 A, @3 G
$ J( ~ {) S7 H
5 w* }4 k' A1 L7 B$ p hr = pStorage->CreateStream(LPICTURE,
' b4 ?" F: Y/ }5 E- o STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream);: ]9 S. X; _8 |
9 m# p! n- y- j/ c# _* x. G- j! {8 W+ W0 M
3 S, f: i8 A3 N8 }$ ^4 Z
m_pPict->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
, |2 v! M5 D# ] o i FileStream->Release();
! R' ~; _) [* _6 U pStorage->Release();
5 L {9 F- N4 Y+ N Buffer->Flush();
. V; g$ Z( f3 `: S& ^0 u/ L* N
; F; D. C0 R# B* R3 U7 z
! ?0 P3 W$ i4 s( M5 G( R) f3 y
7 j1 K9 h2 j+ U% Y: [ // Get Statistics For Final Size Of Byte Array
y2 e2 T4 i7 Y8 ~ Buffer->Stat(&BytesStatistics, STATFLAG_NONAME);: C8 ?! V' Y$ I& z, P8 g) d. p
! D* g2 y: \5 O: p
3 ^0 g% f$ X9 S) ~' S z; s
8 q9 ?7 ^% [8 [ // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only Pure Picture Data)
/ c' d- ~. V( j3 {8 R SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
- x7 q9 e1 s/ o; u if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
( ]* l. B. |8 t N9 r else ByteSkip = (DWORD)SkipFloat;6 b! Z8 c; R* g9 ~+ A" C
ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...
! q% _8 O3 s2 O/ n ( B3 X1 V: ~5 `, _* h9 w [$ P
// Find Difference Between The Two Values2 T5 s& x# `: f* k- R! `
ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip);
! u, u* ~+ |! b/ h$ j" N, ]
. ^2 j+ g7 u" V9 M! T7 p( H. ^; R( l$ W/ I
) f! } Z* B" i) f2 k5 U- W // Allocate Only The Pure Picture Data
5 G; a. }1 m! M1 w RealData.LowPart = 0;
9 M* m! U; L5 i; R' {$ ^4 g RealData.HighPart = 0;
; }* e! t+ ~2 e: Z: k RealData.QuadPart = ByteSkip;
- \% I! H+ J' e0 g7 i BufferBytes = (BYTE*)malloc(OutStream);! ?3 F/ d9 f! S
if(BufferBytes == NULL), \ R4 i$ V; }6 N
{
) ^- q- X; d8 o: x( f9 N% s Buffer->Release();! |/ h8 g& @6 n4 k# C; B
HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;5 Q6 F: v+ D) P/ f6 q8 x5 z
MessageBoxEx(hWnd, Can not allocate enough memory\\t, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
+ ]9 g* p6 X3 ?% x" I. W1 W } y2 R5 T7 Y7 Q+ N
3 k0 D) D& H- Z5 ~
8 }9 z! u- ]4 a5 E, {( Z: {
% S, p5 m7 y, Y Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
% A; g9 D# q2 _% z% G# ^3 {- l+ s7 U+ q N. }. X
- |9 [. n9 t5 n1 @2 f5 n5 ^2 f6 M
1 I; [- R7 q+ `8 |2 _( ^ j7 B, [/ q) T
if(BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
4 p. u. q5 l- h0 [. i" y {
2 k {* v& Z* l# S BitmapFile.Write(BufferBytes, OutData);7 t& `' B" e% q8 _
BitmapFile.Close();5 a6 J2 h& |, T# r' x
bResult = TRUE;
! K* o. k3 B$ v8 T }4 X5 ^) t4 `/ i& ^2 t- U' W
else // Write File Failed...
$ z" O3 R) h' Q( \$ J {5 @$ v! _( h* X/ W
TCHAR szCause[255];
3 r- [9 i# I* {, H7 M$ o e.GetErrorMessage(szCause, 255, NULL);
- x: X- j! E' |: V4 t! H HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;# x3 ?0 u' T9 |5 c) l
MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
' f0 x4 y) q. d8 ]3 _ bResult = FALSE;
Q! K* v% V. w( r( d: D }
. g. \& s1 H1 ?- D4 J/ S
$ {6 Z _( T8 y Buffer->Release(); F6 q U$ j9 D) A
free(BufferBytes);
6 t1 ]% X+ Z, W! {# f: g& S' u! R& \. o t
" g* x$ Q) {( Y8 C/ z% F5 P: v7 A9 d: y
return(bResult);
" z9 R1 O5 }$ {' g} |
|