GDI如何拼接两张位图?

mirroatl400 2016-05-19 05:06:28
加精
!!!!!!!!!!!!!!!!!!!!!!!!!!!!
...全文
965 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
yedou 2016-06-06
  • 打赏
  • 举报
回复
gdi gdi+都略麻烦 直接用MFC的Cimage 然后GetDC bitblt 简单方便
schlafenhamster 2016-06-02
  • 打赏
  • 举报
回复
给你一个 256 色 bmp 的 拼接 (Merge) 程序。

void CPartialBitmapView::MergePartialBmp(char *MergeFile,char *MergedFile)
{// 1st get MergedFile's bits.
	FILE *bmpDst;
	bmpDst=fopen(MergedFile,"rb");
	fseek(bmpDst,0L,SEEK_END);
	LONG filelenDst=ftell(bmpDst);
	fseek(bmpDst,0L,SEEK_SET);
	BYTE *bufferDst=new BYTE[filelenDst];
	fread(bufferDst,sizeof(char),filelenDst,bmpDst);
	fclose(bmpDst);
//
	LPBITMAPFILEHEADER pBMPfileDst=(LPBITMAPFILEHEADER) bufferDst;
	LPBITMAPINFOHEADER pBMPinfoDst=(LPBITMAPINFOHEADER) (bufferDst+sizeof(BITMAPFILEHEADER)); 
	int colord=0;//
//	if(pBMPinfoDst->biClrUsed != 256 || pBMPinfoDst->biClrUsed ==0) 
	colord=1 << pBMPinfoDst->biBitCount;//1<<8
	if(colord != 256 ) return;
// width height and bits
	WORD widDst=(WORD)pBMPinfoDst->biWidth;// 640
	WORD heiDst=(WORD)pBMPinfoDst->biHeight;// 480
	BYTE *bitsDstAt=bufferDst+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colord*sizeof(RGBQUAD);//=4;
	RGBQUAD *rgbDst=(RGBQUAD*)(bufferDst+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));
//// 2nd get MergeFile's bits. ///////////////////////////////////////////////
	FILE *bmpSrc;
	bmpSrc=fopen(MergeFile,"rb");
	fseek(bmpSrc,0L,SEEK_END);
	LONG filelenSrc=ftell(bmpSrc);// 17462
	fseek(bmpSrc,0L,SEEK_SET);
	BYTE *bufferSrc=new BYTE[filelenSrc];
	fread(bufferSrc,sizeof(char),filelenSrc,bmpSrc);
	fclose(bmpSrc);
//
	LPBITMAPFILEHEADER pBMPfileSrc=(LPBITMAPFILEHEADER) bufferSrc;
	LPBITMAPINFOHEADER pBMPinfoSrc=(LPBITMAPINFOHEADER) (bufferSrc+sizeof(BITMAPFILEHEADER)); 
// merging pos
    int Xstart=pBMPfileSrc->bfReserved1;
    int Ystart=pBMPfileSrc->bfReserved2; 
afxDump << Xstart << ";" << Ystart << "\n";// 256;192
	int colors=0;//
	colors=1 << pBMPinfoSrc->biBitCount;//1<<8
	if(colors != 256 ) return;
// 
	WORD widSrc=(WORD)pBMPinfoSrc->biWidth;// 128
	WORD heiSrc=(WORD)pBMPinfoSrc->biHeight;// 128
	WORD Xend=Xstart+widSrc;
	WORD Yend=Ystart+heiSrc;
afxDump << Xend << ";" << Yend << "\n";// 384;320
//
	BYTE *bitsSrcAt=bufferSrc+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colors*sizeof(RGBQUAD);
// Pallete
	RGBQUAD *rgbSrc=(RGBQUAD*)(bufferSrc+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));
// copy Pallete
	memcpy(rgbDst,rgbSrc,colors*sizeof(RGBQUAD));
// now copy bits
	for(int hei=Yend-1;hei >= Ystart;hei--)// vertical flip
	{// 192   320
		for(int wid=Xstart;wid < Xend;wid++)
		{
			bitsDstAt[(heiDst-hei-1)*widDst+wid]=bitsSrcAt[(heiSrc-1-(hei-Ystart))*widSrc+(wid-Xstart)];//
		}
	}
// write back
	bmpDst=fopen(MergedFile,"wb");
	fwrite(bufferDst,1,filelenDst,bmpDst);
	fclose(bmpDst);
//
	if(bufferSrc) delete [] bufferSrc;
	if(bufferDst) delete [] bufferDst;
//
}
分割程序参考 “PartialBitmap.zip” http://download.csdn.net/detail/schlafenhamster/4526898 “不使用CDC直接裁剪Bitmap文件。 主要函数 SavePartialBmp(int Xstart,int Ystart,int Xend,int Yend)”
schlafenhamster 2016-05-31
  • 打赏
  • 举报
回复
分割 bmp时 可以 利用 BITMAPFILEHEADER 的2个保留 word // for merging late pBMPfile->bfReserved1=Xstart; pBMPfile->bfReserved2=Ystart;
赵4老师 2016-05-31
  • 打赏
  • 举报
回复
为什么就不能是|和—拼接呢?
赵4老师 2016-05-30
  • 打赏
  • 举报
回复
为什么就不能是和■拼接呢?
schlafenhamster 2016-05-29
  • 打赏
  • 举报
回复
拼接位图 要知道 位图拼接 到 什么位置 !
f0075155 2016-05-28
  • 打赏
  • 举报
回复
我想说这想法真的很不错啊!
worldy 2016-05-24
  • 打赏
  • 举报
回复
引用 6 楼 rrrfff 的回复:
长宽一致的话自己合并位图数据, 并修正位图头信息就行了, 不需要GDI参与
gdi参与比较简单,上下对接还比较简单,横向拼接就比较麻烦了
灰灰君呀 2016-05-24
  • 打赏
  • 举报
回复
引用 1 楼 VisualEleven 的回复:
StretchBlt/BitBlt()贴多张图就实现了拼接了~

AlphaBlend可以实现位图的叠加.
RLib 2016-05-22
  • 打赏
  • 举报
回复
长宽一致的话自己合并位图数据, 并修正位图头信息就行了, 不需要GDI参与
worldy 2016-05-21
  • 打赏
  • 举报
回复
或者,使用BitBlt,第一张位图放入(0,0)位置,第二张位图放入(0,Height1)位置 width1,第一张位图的宽度 Height1,第一张位图的高度
worldy 2016-05-21
  • 打赏
  • 举报
回复
使用BitBlt,第一张位图放入(0,0)位置,第二张位图放入(Width1,0)位置
旅行着 2016-05-21
  • 打赏
  • 举报
回复
http://baike.baidu.com/link?url=UzVfiRJTMoV_lmuoiG_4pBRxie-3yZztqftPjleam48oxXHSaXgvx_2j1qw5caur6GrLJ9COozQ5Mi0U9hS2-a 看看函数参数,就懂了吧
mirroatl400 2016-05-20
  • 打赏
  • 举报
回复
能贴下参考代码么?
引用 1 楼 VisualEleven 的回复:
StretchBlt/BitBlt()贴多张图就实现了拼接了~
Eleven 2016-05-19
  • 打赏
  • 举报
回复
StretchBlt/BitBlt()贴多张图就实现了拼接了~

19,468

社区成员

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

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