您的位置:首页 > 其它

从剪贴板读取并保存图片到文件

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐