HDIB DIB::JiequBMP(HANDLE hDIB)
{
HANDLE hNewDIB;//close???有内存的问题没?????
LPBYTE lpS,lpD;
LPBITMAPINFOHEADER lpbi,lpbinew;//参数后带new的是新图像的参数
WORD wBytesPerLine,wBytesPerLinenew;
long lOffset,lOffsetnew;
wBytesPerLine = this->BytePerLine(hDIB);
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
//我选择矩形的区域,rtdesti是我在原背景图像中拖出的矩形框,想把这个矩形框的图像变成新的图像
long l,t,h,w,R,G,B;
DWORD newsizeimage;
l=rtdesti.left;
t=rtdesti.top;
w=rtdesti.Width();
h=rtdesti.Height();
wBytesPerLinenew=WIDTHBYTES(w*24);
newsizeimage=wBytesPerLinenew*h;
hNewDIB = GlobalAlloc(GHND,sizeof(BITMAPINFOHEADER)+newsizeimage);
lpbinew = (LPBITMAPINFOHEADER)GlobalLock(hNewDIB);
lpD = (LPBYTE)GlobalLock(hNewDIB);
lpS = (LPBYTE)lpbi;
memcpy(lpD,lpS,sizeof(BITMAPINFOHEADER));
lpS = lpS+sizeof(BITMAPINFOHEADER);
lpD = lpD+sizeof(BITMAPINFOHEADER);
lpbinew->biHeight=h;
lpbinew->biWidth=w;
lpbinew->biSizeImage=newsizeimage;
for(int i=t;i<t+h;i++)
{
for(int j=l;j<l+w;j++)
{
lOffset = this->PixelOffset(i,j,wBytesPerLine);
R = *(lpS+lOffset++);
G = *(lpS+lOffset++);
B = *(lpS+lOffset++);
lOffsetnew= this->PixelOffset(i-t,j-l,wBytesPerLinenew);
*(lpD+lOffsetnew++)=R;
*(lpD+lOffsetnew++)=G;
*(lpD+lOffsetnew)=B;
}
}
GlobalUnlock(hDIB);
GlobalUnlock(hNewDIB);
GlobalFree(hDIB);
return hNewDIB;
}
{
HANDLE hNewDIB;//close???有内存的问题没?????
LPBYTE lpS,lpD;
LPBITMAPINFOHEADER lpbi,lpbinew;//参数后带new的是新图像的参数
WORD wBytesPerLine,wBytesPerLinenew;
long lOffset,lOffsetnew;
wBytesPerLine = this->BytePerLine(hDIB);
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
//我选择矩形的区域,rtdesti是我在原背景图像中拖出的矩形框,想把这个矩形框的图像变成新的图像
long l,t,h,w,R,G,B;
DWORD newsizeimage;
l=rtdesti.left;
t=rtdesti.top;
w=rtdesti.Width();
h=rtdesti.Height();
wBytesPerLinenew=WIDTHBYTES(w*24);
newsizeimage=wBytesPerLinenew*h;
hNewDIB = GlobalAlloc(GHND,sizeof(BITMAPINFOHEADER)+newsizeimage);
lpbinew = (LPBITMAPINFOHEADER)GlobalLock(hNewDIB);
lpD = (LPBYTE)GlobalLock(hNewDIB);
lpS = (LPBYTE)lpbi;
memcpy(lpD,lpS,sizeof(BITMAPINFOHEADER));
lpS = lpS+sizeof(BITMAPINFOHEADER);
lpD = lpD+sizeof(BITMAPINFOHEADER);
lpbinew->biHeight=h;
lpbinew->biWidth=w;
lpbinew->biSizeImage=newsizeimage;
for(int i=t;i<t+h;i++)
{
for(int j=l;j<l+w;j++)
{
lOffset = this->PixelOffset(i,j,wBytesPerLine);
R = *(lpS+lOffset++);
G = *(lpS+lOffset++);
B = *(lpS+lOffset++);
lOffsetnew= this->PixelOffset(i-t,j-l,wBytesPerLinenew);
*(lpD+lOffsetnew++)=R;
*(lpD+lOffsetnew++)=G;
*(lpD+lOffsetnew)=B;
}
}
GlobalUnlock(hDIB);
GlobalUnlock(hNewDIB);
GlobalFree(hDIB);
return hNewDIB;
}
每一个记录的字节数应该是4的倍数。