怎么把2个一样大小bmp图片拼接合并生成一个bmp文件?谢谢!

MPU 2005-10-18 12:54:27

怎么把2个一样大小bmp图片拼接合并生成一个bmp文件?

把几百个8*8的bmp拼接成一个效率最好不太低.

谢谢!
...全文
1273 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zkx2321 2005-10-18
  • 打赏
  • 举报
回复
好像DIB是从下向上一行一行存储的像素(显示时左上角的在存储的右下角),这样的话对于每个像素的坐标你就应该知道了。

这样的话合并两个DIB的关键就是像素的坐标了。

剩下的你应该知道怎么做了。
legendhui 2005-10-18
  • 打赏
  • 举报
回复
上面的引用自http://community.csdn.net/Expert/topic/4332/4332025.xml?temp=.2718317
legendhui 2005-10-18
  • 打赏
  • 举报
回复
void CUSBSENDDlg::OnSave()
{
// TODO: Add your control notification handler code here
CRect rect;
HBITMAP hBmp;

GetDlgItem(IDC_PIC)->GetWindowRect(rect);
ScreenToClient(rect);

CString strFilter="Bitmap Files (*.bmp)|*.bmp||";
CFileDialog dlg(FALSE,"bmp", NULL, OFN_HIDEREADONLY|OFN_EXPLORER, strFilter, NULL);
if (dlg.DoModal() == IDOK)
{
hBmp=GetSrcBit(rect);
SaveBmp(hBmp,dlg.GetPathName());
}
}

HBITMAP CUSBSENDDlg::GetSrcBit(CRect rect)
{
HDC hBufDC,hDC;
HBITMAP hBitmap, hBitTemp;

CClientDC dc(this);
hDC=dc.GetSafeHdc();
//创建设备上下文(HDC)
hBufDC = CreateCompatibleDC(NULL);

//创建HBITMAP
hBitmap = CreateCompatibleBitmap(hDC,rect.Width(),rect.Height());
hBitTemp = (HBITMAP) SelectObject(hBufDC, hBitmap);

//得到位图缓冲区
StretchBlt(hBufDC,0,0,rect.Width(),rect.Height(),
hDC,rect.left,rect.top,rect.Width(),rect.Height(),SRCCOPY);

//得到最终的位图信息
hBitmap = (HBITMAP) SelectObject(hBufDC, hBitTemp);

//释放内存

DeleteObject(hBitTemp);
::DeleteDC(hBufDC);
ReleaseDC(&dc);
return hBitmap;
}

BOOL CUSBSENDDlg::SaveBmp(HBITMAP hBitmap, CString FileName)
{
//设备描述表
HDC hDC;
//当前分辨率下每象素所占字节数
int iBits;
//位图中每象素所占字节数
WORD wBitCount;
//定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;
//位图属性结构
BITMAP Bitmap;
//位图文件头结构
BITMAPFILEHEADER bmfHdr;
//位图信息头结构
BITMAPINFOHEADER bi;
//指向位图信息头结构
LPBITMAPINFOHEADER lpbi;
//定义文件,分配内存句柄,调色板句柄
HANDLE fh,hDib,hOldPal=NULL;
// HANDLE hPal;
//计算位图文件每个像素所占字节数
hDC = CreateDC("DISPLAY", NULL, NULL, NULL);

iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
DeleteDC(hDC);
if (iBits <= 1) wBitCount = 1;
else if (iBits <= 4) wBitCount = 4;
else if (iBits <= 8) wBitCount = 8;
else wBitCount = 24;

GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrImportant = 0;
bi.biClrUsed = 0;

dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;

//为位图内容分配内存
hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi;

// 处理调色板
// hPal = GetStockObject(DEFAULT_PALETTE);
// if (hPal)
// {
hDC = ::GetDC(NULL);
// hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
// RealizePalette(hDC);
// }

// 获取该调色板下新的像素值
GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)
+dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS);

//恢复调色板
// if (hOldPal)
// {
// ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
// RealizePalette(hDC);
// ::ReleaseDC(NULL, hDC);
// }

//创建位图文件
fh = CreateFile(FileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);

if (fh == INVALID_HANDLE_VALUE) return FALSE;

// 设置位图文件头
bmfHdr.bfType = 0x4D42; // "BM"
dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;
bmfHdr.bfSize = dwDIBSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;
// 写入位图文件头
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
// 写入位图文件其余内容
WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
//清除
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);

return TRUE;
}

MPU 2005-10-18
  • 打赏
  • 举报
回复
legendhui(秋天的叶子) 代码最后能不能把拼接好的图片存为文件。。
niying 2005-10-18
  • 打赏
  • 举报
回复
把两个位图数据结合起来,再修改调色板,位图像素大小,信息头等就行了!对位图熟就容易了!
legendhui 2005-10-18
  • 打赏
  • 举报
回复
CBitmap bitmap1,bitmap2;
CDC memDC,FinalDC;
HBITMAP hBitmap;
BITMAP Bmp1,Bmp2;
int x,y;

FinalDC.CreateCompatibleDC(NULL);

//初始化Bmp2
bitmap2.CreateBitmapIndirect(&Bmp2);
FinalDC.SelectObject(&bitmap2);

memDC.CreateCompatibleDC(NULL);

//处理第一副图
hBitmap = (HBITMAP)::LoadImage(NULL,"First.bmp",IMAGE_BITMAP,0,0,
LR_DEFAULTSIZE | LR_CREATEDIBSECTION | LR_LOADFROMFILE);
bitmap1.Attach(hBitmap);
bitmap1.GetBitmap(&Bmp1);

memDC.SelectObject(&bitmap1);
FinalDC.BitBlt(0,0,Bmp1.bmWidth,Bmp1.bmHeight ,&memDC,0,0,SRCCOPY);
x=Bmp1.bmWidth;
y=Bmp1.bmHeight
//处理第二副图
hBitmap = (HBITMAP)::LoadImage(NULL,"Second.bmp",IMAGE_BITMAP,0,0,
LR_DEFAULTSIZE | LR_CREATEDIBSECTION | LR_LOADFROMFILE);
bitmap1.Attach(hBitmap);

memDC.SelectObject(&bitmap1);
FinalDC.BitBlt(x,y,Bmp1.bmWidth,Bmp1.bmHeight ,&memDC,0,0,SRCCOPY);
saliors 2005-10-18
  • 打赏
  • 举报
回复
先创建一个Y坐标2倍大小的新bmp对象,然后把要合并的bmp图片的数据写进新bmp对象的数据区里就可以了。
y0z0 2005-10-18
  • 打赏
  • 举报
回复
你没说怎么拼呢,横排还是竖排?

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧