zoukankan
html css js c++ java
DDB to DIB
bool
CCStaticDrawDlg::SaveBitmapFile(CString strFileName, CBitmap
&
bmp,CDC
*
pdc)
{
BITMAP bm;
bmp.GetBitmap (
&
bm);
int
nWidth
=
bm.bmWidth;
int
nHeight
=
bm.bmHeight;
int
nLineBits
=
bm.bmWidthBytes;
if
((nLineBits
%
8
)
!=
0
)
nLineBits
+=
8
-
nLineBits
%
8
;
int
nBitCounts
=
nLineBits
*
bm.bmHeight ;
int
nBits
=
24
;
//
bm.bmBitsPixel;
int
nBitmapInfoSize
=
0
;
if
(nBits
<=
8
)
{
int
nColors
=
1
<<
nBits;
int
nPalUnitSize
=
sizeof
(RGBQUAD);
nBitmapInfoSize
=
sizeof
(BITMAPINFOHEADER)
+
nPalUnitSize
*
nColors;
}
else
nBitmapInfoSize
=
sizeof
(BITMAPINFOHEADER);
BITMAPINFO
*
pbmpinfo
=
NULL;
pbmpinfo
=
(BITMAPINFO
*
)(
new
BYTE[nBitmapInfoSize]);
ZeroMemory((
void
*
)pbmpinfo,nBitmapInfoSize);
BITMAPINFOHEADER
*
pInfoHead
=
(BITMAPINFOHEADER
*
)pbmpinfo;
ZeroMemory((
void
*
)pInfoHead,
sizeof
(BITMAPINFOHEADER));
pInfoHead
->
biSize
=
sizeof
(BITMAPINFOHEADER);
pInfoHead
->
biBitCount
=
nBits;
pInfoHead
->
biPlanes
=
1
;
pInfoHead
->
biSizeImage
=
nBitCounts;
pInfoHead
->
biCompression
=
BI_RGB;
pInfoHead
->
biWidth
=
nWidth;
pInfoHead
->
biHeight
=
nHeight;
CDC dc;
dc.CreateDC(
"
DISPLAY
"
,NULL,NULL,NULL);
int
nLx
=
dc.GetDeviceCaps (LOGPIXELSX);
int
nLy
=
dc.GetDeviceCaps (LOGPIXELSY);
double
dbInchPerMeter
=
39.375
;
int
nPMx
=
(
int
)((
double
)nLx
*
dbInchPerMeter);
int
nPMy
=
(
int
)((
double
)nLy
*
dbInchPerMeter);
pInfoHead
->
biXPelsPerMeter
=
nPMx;
//
3780;
pInfoHead
->
biYPelsPerMeter
=
nPMy;
//
3780;
if
(nBits
<=
8
)
{
int
nColors
=
1
<<
nBits;
GetDIBColorTable(dc.m_hDC,
0
,nColors,pbmpinfo
->
bmiColors);
}
BYTE
*
pBits
=
NULL;
//
HGLOBAL hGlobal = ::GlobalAlloc(GMEM_FIXED, nBitCounts);
//
pBits = (BYTE *)::GlobalLock(hGlobal);
pBits
=
new
byte
[nBitCounts];
ZeroMemory((
void
*
)pBits,nBitCounts);
GetDIBits(pdc
->
m_hDC,(HBITMAP)bmp,
0
,nHeight,pBits,pbmpinfo,DIB_RGB_COLORS);
BITMAPFILEHEADER bmfHeader;
int
nFileHeadSize
=
sizeof
(BITMAPFILEHEADER);
ZeroMemory((
void
*
)
&
bmfHeader,
sizeof
(BITMAPFILEHEADER));
bmfHeader.bfType
=
19778
;
//
'BM' ((WORD) ('M' << 8) | 'B');
bmfHeader.bfSize
=
nFileHeadSize
+
nBitmapInfoSize
+
nBitCounts;
bmfHeader.bfOffBits
=
sizeof
(BITMAPFILEHEADER)
+
nBitmapInfoSize;
CFile file;
if
(
!
file.Open (strFileName,CFile::modeCreate
|
CFile::modeWrite))
{
AfxMessageBox(
"
Write File Error!
"
);
return
FALSE;
}
file.Write (
&
bmfHeader,
sizeof
(BITMAPFILEHEADER));
file.Write (pbmpinfo,nBitmapInfoSize);
file.WriteHuge(pBits, nBitCounts);
file.Close ();
delete pBits;
//
::GlobalUnlock (hGlobal);
//
::GlobalFree (hGlobal);
delete[] pbmpinfo;
return
TRUE;
}
查看全文
相关阅读:
初學C#窗口事件
Visual Studio 2005.net 代码段(Snippet)丢失的解决方案
使用C#代码段,提高工作效率(C# code snippet)
同时拥有静态IP和动态IP
让XP启动时不加载Autoexec.bat
C#中构造函数和析构函数的用法
C# 輸入關鍵字後按Tab鍵無法帶出相關內容
C# 打開文件
system.net.mail 與system.web.mail的區別
C#中的建立事件
原文地址:https://www.cnblogs.com/wqj1212/p/1047159.html
最新文章
人生不相见,动如参与商
常见C#面试题目(ZZ)
.NET 2.0中的字符串比较
读易[12]·如何做好职业规划(乾卦)
在SQL Server 2005中用存储过程实现搜索功能
PHOTOSHOP等高线探秘(部分)
◎Design Pattern: Abstract Factory 模式
Photoshop阴影与内阴影
图层样式探秘——等高线本质完全剖析
javascript中三个等号的意思
热门文章
javascript中replace正则表达式语法
好书
Photoshop快捷键失效(画笔缩放快捷键)
蒙板
◎Ant的使用 buildfile
UNION or OR in SQL Server Queries
SQL Server性能调优:资源管理之内存管理篇
Adding Column to a SQL Server Table
保护SQL语句不被Sql Profiler / 事件探查器 捕获跟踪到 (SQL2000)
通过事务日志恢复SqlServer数据库到一个特定的时间点
Copyright © 2011-2022 走看看