从剪贴板读取并保存图片到文件
2007-12-07 16:23
671 查看
//"DibImage.h"
#if !defined(AFX_DIBIMAGE_H__254F3D1E_BB20_40DA_AE07_E8E0219DFA8C__INCLUDED_)
#define AFX_DIBIMAGE_H__254F3D1E_BB20_40DA_AE07_E8E0219DFA8C__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
DECLARE_HANDLE(HDIB); // DIB句柄
//几个用到的函数声明,做全局函数使用
HGLOBAL CopyHandle (HGLOBAL h);
WORD WINAPI GetPaletteSize(LPSTR lpbi);
BOOL WINAPI SaveToFile(HANDLE hDib, CFile& file);
#endif
//DibImage.cpp
#include "stdafx.h"
#include "DPASSUB.h"
#include"DibImage.h"
HGLOBAL CopyHandle (HGLOBAL h)
{
if (h == NULL)
{
return NULL;
}
DWORD dwLen =GlobalSize((HGLOBAL) h); // 获取指定内存区域大小
HGLOBAL hCopy = GlobalAlloc(GHND, dwLen); // 分配新内存空间
if (hCopy != NULL) // 判断分配是否成功
{
void* lpCopy = GlobalLock((HGLOBAL) hCopy);
void* lp = GlobalLock((HGLOBAL) h);
memcpy(lpCopy, lp, dwLen);
GlobalUnlock(hCopy);
GlobalUnlock(h);
}
return hCopy;
}
WORD WINAPI GetPaletteSize(LPSTR lpbi)
{
DWORD dwClrUsed;
dwClrUsed=((LPBITMAPINFOHEADER)lpbi)->biClrUsed;
if (dwClrUsed == 0)
switch ( ((LPBITMAPINFOHEADER)lpbi)->biBitCount )
{
case 1:
dwClrUsed=2;
break;
case 4:
dwClrUsed=16;
break;
case 8:
dwClrUsed=256;
break;
default:
dwClrUsed=0;
break;
}
return (WORD)(dwClrUsed * sizeof(RGBQUAD));
}
BOOL WINAPI SaveToFile(HANDLE hDib, CFile& file)
{
BITMAPFILEHEADER bmfHdr;
LPBITMAPINFOHEADER lpBI;
DWORD dwDIBSize;
if (hDib == NULL)
return FALSE;
lpBI = (LPBITMAPINFOHEADER) ::GlobalLock((HGLOBAL) hDib);
if (lpBI == NULL)
return FALSE;
bmfHdr.bfType = ((WORD) ('M' << 8) | 'B'); // "BM"
dwDIBSize = *(LPDWORD)lpBI + ::GetPaletteSize((LPSTR)lpBI);
if ((lpBI->biCompression == BI_RLE8) || (lpBI->biCompression == BI_RLE4))
{
dwDIBSize += lpBI->biSizeImage;
}
else
{
DWORD dwBmBitsSize;
dwBmBitsSize = ( ( (lpBI->biWidth)*((DWORD)lpBI->biBitCount) + 31) / 32 * 4) * lpBI->biHeight;
dwDIBSize += dwBmBitsSize;
lpBI->biSizeImage = dwBmBitsSize;
}
bmfHdr.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER);
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + lpBI->biSize
+ GetPaletteSize((LPSTR)lpBI);
file.Write((LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER));
//file.WriteHuge(lpBI, dwDIBSize);
file.Write(lpBI, dwDIBSize);
::GlobalUnlock((HGLOBAL) hDib);
return TRUE;
}
//具体操作实现
void CDPASUB::OnPasteAsFile()
{
// TODO: 在此添加命令处理程序代码
HDIB hNewDIB=NULL;
if(OpenClipboard())
{
if(IsClipboardFormatAvailable(CF_DIB))
hNewDIB=(HDIB)CopyHandle(GetClipboardData(CF_DIB));
CloseClipboard();
}
if(hNewDIB==NULL) return;
CFileDialog savePath(FALSE ,NULL,"save.bmp",OFN_HIDEREADONLY,"Bitmap Files(*.bmp)|*.bmp||",NULL);
savePath.m_ofn.lpstrTitle="请选择保存路径并输入文件名";
if(savePath.DoModal()==IDOK)
{
CString fullName;
fullName=savePath.GetPathName();
CFile file;
file.Open(fullName,CFile::modeCreate|CFile::modeWrite);
SaveToFile(hNewDIB,file);//将位图存为指定名字的文件
file.Close();
GlobalFree(hNewDIB);
}
return;
}
#if !defined(AFX_DIBIMAGE_H__254F3D1E_BB20_40DA_AE07_E8E0219DFA8C__INCLUDED_)
#define AFX_DIBIMAGE_H__254F3D1E_BB20_40DA_AE07_E8E0219DFA8C__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
DECLARE_HANDLE(HDIB); // DIB句柄
//几个用到的函数声明,做全局函数使用
HGLOBAL CopyHandle (HGLOBAL h);
WORD WINAPI GetPaletteSize(LPSTR lpbi);
BOOL WINAPI SaveToFile(HANDLE hDib, CFile& file);
#endif
//DibImage.cpp
#include "stdafx.h"
#include "DPASSUB.h"
#include"DibImage.h"
HGLOBAL CopyHandle (HGLOBAL h)
{
if (h == NULL)
{
return NULL;
}
DWORD dwLen =GlobalSize((HGLOBAL) h); // 获取指定内存区域大小
HGLOBAL hCopy = GlobalAlloc(GHND, dwLen); // 分配新内存空间
if (hCopy != NULL) // 判断分配是否成功
{
void* lpCopy = GlobalLock((HGLOBAL) hCopy);
void* lp = GlobalLock((HGLOBAL) h);
memcpy(lpCopy, lp, dwLen);
GlobalUnlock(hCopy);
GlobalUnlock(h);
}
return hCopy;
}
WORD WINAPI GetPaletteSize(LPSTR lpbi)
{
DWORD dwClrUsed;
dwClrUsed=((LPBITMAPINFOHEADER)lpbi)->biClrUsed;
if (dwClrUsed == 0)
switch ( ((LPBITMAPINFOHEADER)lpbi)->biBitCount )
{
case 1:
dwClrUsed=2;
break;
case 4:
dwClrUsed=16;
break;
case 8:
dwClrUsed=256;
break;
default:
dwClrUsed=0;
break;
}
return (WORD)(dwClrUsed * sizeof(RGBQUAD));
}
BOOL WINAPI SaveToFile(HANDLE hDib, CFile& file)
{
BITMAPFILEHEADER bmfHdr;
LPBITMAPINFOHEADER lpBI;
DWORD dwDIBSize;
if (hDib == NULL)
return FALSE;
lpBI = (LPBITMAPINFOHEADER) ::GlobalLock((HGLOBAL) hDib);
if (lpBI == NULL)
return FALSE;
bmfHdr.bfType = ((WORD) ('M' << 8) | 'B'); // "BM"
dwDIBSize = *(LPDWORD)lpBI + ::GetPaletteSize((LPSTR)lpBI);
if ((lpBI->biCompression == BI_RLE8) || (lpBI->biCompression == BI_RLE4))
{
dwDIBSize += lpBI->biSizeImage;
}
else
{
DWORD dwBmBitsSize;
dwBmBitsSize = ( ( (lpBI->biWidth)*((DWORD)lpBI->biBitCount) + 31) / 32 * 4) * lpBI->biHeight;
dwDIBSize += dwBmBitsSize;
lpBI->biSizeImage = dwBmBitsSize;
}
bmfHdr.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER);
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + lpBI->biSize
+ GetPaletteSize((LPSTR)lpBI);
file.Write((LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER));
//file.WriteHuge(lpBI, dwDIBSize);
file.Write(lpBI, dwDIBSize);
::GlobalUnlock((HGLOBAL) hDib);
return TRUE;
}
//具体操作实现
void CDPASUB::OnPasteAsFile()
{
// TODO: 在此添加命令处理程序代码
HDIB hNewDIB=NULL;
if(OpenClipboard())
{
if(IsClipboardFormatAvailable(CF_DIB))
hNewDIB=(HDIB)CopyHandle(GetClipboardData(CF_DIB));
CloseClipboard();
}
if(hNewDIB==NULL) return;
CFileDialog savePath(FALSE ,NULL,"save.bmp",OFN_HIDEREADONLY,"Bitmap Files(*.bmp)|*.bmp||",NULL);
savePath.m_ofn.lpstrTitle="请选择保存路径并输入文件名";
if(savePath.DoModal()==IDOK)
{
CString fullName;
fullName=savePath.GetPathName();
CFile file;
file.Open(fullName,CFile::modeCreate|CFile::modeWrite);
SaveToFile(hNewDIB,file);//将位图存为指定名字的文件
file.Close();
GlobalFree(hNewDIB);
}
return;
}
相关文章推荐
- 从剪贴板读取并保存图片到文件
- 读取文件中的所有图片的路径,保存到txt文件中。
- WP7 Isolated Storage详解(7)-读取、保存图片文件
- WP7 Isolated Storage详解(7)-读取、保存图片文件
- Python 读取图片文件为矩阵和保存矩阵为图片的方法
- WP7 IsolatedStorage--读取、保存图片文件
- 读取网络上的图片并保存到本机,图片文件的文件名不变
- 读取视频文件,保存帧图片为ppm文件
- 读取资源图片保存在本地解决文件无法创建问题。
- 数据库操作_连接SQL Server数据库示例;连接ACCESS数据库;连接到 Oracle 数据库示例;SqlCommand 执行SQL命令示例;SqlDataReader 读取数据示例;使用DataAdapter填充数据到DataSet;使用DataTable存储数据库表;将数据库数据填充到 XML 文件;10 使用带输入参数的存储过程;11 使用带输入、输出参数的存储过程示;12 获得数据库中表的数目和名称;13 保存图片到SQL Server数据库示例;14 获得插入记录标识号;Exce
- vb.net 使用Access数据库 保存和读取图片文件
- 【EMGU】读取视频AVI文件+保存任意帧为图片
- 利用Python PIL、cPickle将图片读取和保存为pkl格式文件
- iphone Documents文件中保存的图片如何读取并显示?
- 用C#编程从数据库中读取图片数据导进Excel文件的方法(如何从数据库中读取保存的文件,直接打开,中间不保存到本地)
- Android读取url图片保存及文件读取
- WP7 Isolated Storage详解 读取、保存图片文件
- 用C#编程从数据库中读取图片数据导进Excel文件的方法(如何从数据库中读取保存的文件,直接打开,中间不保存到本地)
- c#从剪贴板取出图片,然后写上字,保存到文件
- Python之BeautifulSoup学习之三 读取本地html文件,并将其中图片保存下来