19,468
社区成员
发帖
与我相关
我的任务
分享
CFileDialog file(TRUE, _T("(*.bmp)|*.bmp","*.bmp" ,OFN_EXPLORER ,"位图文件(*.bmp)"));
if(!file.DoModal())
return;
CDC *pDC;
CRect rect;
GetWindowRect(rect);
pDC = GetDC();
CDC dcMemory;
CBitmap bitmapdes,bitmapsrc;
CString filename;
HDC m_hMemDC;
LONG m_nWidth,m_nHeight;
filename = file.GetPathName();
HBITMAP hbitmap = (HBITMAP) LoadImage(NULL,filename,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
bitmapsrc.Attach(hbitmap);
//CDC *pDC;
CDC memdc;
if(!memdc.CreateCompatibleDC(pDC)) return;
memdc.SelectObject(bitmapsrc);
pDC->StretchBlt(0,0,50,50,&memdc,100,100,50,50,SRCCOPY);
// 至此,可以在对话框中显示剪裁的位图图像
//但是如何把这个显示出来的矩形区逾保存至bitmap对象中呢?
HBITMAP temp = CreateCompatibleBitmap(memdc.GetSafeHdc(),50,50);//这句生成bitmap,保存的图像是一片黑的,画出也是一版黑
memdc.DeleteDC();
bitmapdes.Attach(temp);
SaveBitmapToFile(bitmapdes,_T("C:\\a.bmp"));
BITMAP bmInfo;
bitmapdes.GetObject(sizeof(bmInfo),&bmInfo);
dcMemory.CreateCompatibleDC(pDC);
dcMemory.SelectObject(&bitmapdes);
memdc.SelectObject(bitmapdes);
//m_hMemDC = (HDC)hbitmap; // 与客户区兼容的内存DC句柄
m_hMemDC = (HDC)bitmapsrc.GetSafeHandle();
m_nWidth = bmInfo.bmWidth; // BMP图像的宽度
m_nHeight = bmInfo.bmHeight; // BMP图像的高度
pDC->BitBlt(0,0,bmInfo.bmWidth,bmInfo.bmHeight,&dcMemory,0,0,SRCCOPY);
ReleaseDC(pDC);
DECLARE_HANDLE(HDIB);
class CDib : public CObject
{
private:
HDIB m_hDib;
};
CDib* CDib::CropDIB(LPRECT lpRect) // 扣出
{
if (m_hDib == NULL)
{
return NULL;
}
LPBITMAPINFO lpbmi = NULL;
LPSTR lpSourceBits;
LPSTR lpTargetBits;
HDC hDC = NULL;
HDC hSourceDC;
HDC hTargetDC;
HBITMAP hSourceBitmap;
HBITMAP hTargetBitmap;
HBITMAP hOldTargetBitmap;
HBITMAP hOldSourceBitmap;
DWORD dwSourceBitsSize;
DWORD dwTargetBitsSize;
DWORD dwTargetHeaderSize;
int nWidth;
int nHeight;
CDib* newDIB = new CDib;
DWORD dwSize;
LPBITMAPINFO lpSrcDIB = (LPBITMAPINFO) m_hDib;
//////////////////////////////////////////////////////////////////////////
// 信息头
// 为新的DIB申请内存并填充其BITMAPINFO结构
dwTargetHeaderSize = sizeof( BITMAPINFOHEADER ) + GetPaletteSize();
lpbmi = (LPBITMAPINFO) new BYTE[dwTargetHeaderSize];
memcpy(lpbmi, lpSrcDIB, dwTargetHeaderSize);
nWidth = RECTWIDTH(lpRect);
nHeight = RECTHEIGHT(lpRect);
lpbmi->bmiHeader.biWidth = nWidth;
lpbmi->bmiHeader.biHeight = nHeight;
// 利用DIBSections和BitBlt函数进行格式转换
hDC = GetDC( NULL );
hTargetBitmap = CreateDIBSection( hDC, lpbmi, DIB_RGB_COLORS, (VOID **)&lpTargetBits, NULL, 0 );
hSourceBitmap = CreateDIBSection( hDC, lpSrcDIB, DIB_RGB_COLORS, (VOID **)&lpSourceBits, NULL, 0 );
hSourceDC = CreateCompatibleDC( hDC );
hTargetDC = CreateCompatibleDC( hDC );
dwSourceBitsSize = lpSrcDIB->bmiHeader.biHeight * GetBytesPerLine();
dwTargetBitsSize = lpbmi->bmiHeader.biHeight * WIDTHBYTES(nWidth*GetBitsCount());
memcpy( lpSourceBits, (void *)GetDIBBits(), dwSourceBitsSize );
lpbmi->bmiHeader.biSizeImage = dwTargetBitsSize;
// 把DIBSections选入设备上下文
hOldSourceBitmap = (HBITMAP)SelectObject( hSourceDC, hSourceBitmap );
hOldTargetBitmap = (HBITMAP)SelectObject( hTargetDC, hTargetBitmap );
// Crop
BitBlt(hTargetDC,
0,
0,
nWidth,
nHeight,
hSourceDC,
lpRect->left,
lpRect->top,
SRCCOPY);
SelectObject( hSourceDC, hOldSourceBitmap );
SelectObject( hTargetDC, hOldTargetBitmap );
DeleteDC( hSourceDC );
DeleteDC( hTargetDC );
ReleaseDC( NULL, hDC );
GdiFlush();
// 拷贝位数据
dwSize = dwTargetHeaderSize + dwTargetBitsSize;
newDIB->m_hDib = (HDIB) new BYTE[dwSize];
// 信息头
memcpy( newDIB->m_hDib, lpbmi, dwTargetHeaderSize );
// DIB数据
memcpy((BYTE*)newDIB->m_hDib + dwTargetHeaderSize, lpTargetBits, dwTargetBitsSize );
DeleteObject( hTargetBitmap );
DeleteObject( hSourceBitmap );
delete[] lpbmi;
lpbmi = NULL;
return newDIB;
}
HBITMAP hBitmap = CreateCompatibleBitmap(memdc.GetSafeHdc(), 50, 50);
HDC hNewDC = CreateCompatibleDC(memdc.GetSafeHdc());
HBITMAP hOldBitmap = SelectObject(hNewDC, hBitmap);
BitBlt(hNewDC, 0, 0, 50, 50, memdc.GetSafeHdc(), 0, 0, SRCCOPY);
SelectObject(hNewDC, hOldBitmap);