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

来源:互联网 发布:php外包接单平台 编辑:程序博客网 时间:2024/05/22 00:29

多亏了大家的经验分享,我才能顺利地实现VC编程的入门。虽然不知道如何表达,但希望我的一点收获能够为其他遇到同样问题的人带来一点便利。

//"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;
}

原创粉丝点击