背景bmp是back.bmp,在指定(30,,20)添加高为50宽为40的new.bmp。这个怎么实现?用MFC,而不是GDI
MFC是什么?楼主搞搞清楚,框架。如果没有写这种方法,楼主就不能用啊乖乖的用GDI,写2个CDC合成一下把。
怎么用CDC合成呀?我没做过图片处理,麻烦给代码或关键代码
TransparentBlt
要是实在没有代码就给个可行的编辑步骤,最好包括每部的关键函数
创建一个大的bmp先贴一个,在贴另一个
不懂。我的代码如下:C/C++ code
// 导入背景图片 FILE *fp=fopen("back.bmp", "rb"); if(fp == 0) return 1;
fseek(fp, sizeof(BITMAPFILEHEADER), 0); BITMAPINFOHEADER head; fread(&head, sizeof(BITMAPINFOHEADER), 1, fp); int bmpHeight = head.biHeight; int bmpWidth = head.biWidth; int biBitCount = head.biBitCount; int lineByte = (bmpWidth*biBitCount/8+3)/4*4; RGBQUAD *pColorTable; if(biBitCount == { pColorTable = new RGBQUAD[256]; fread(pColorTable, sizeof(RGBQUAD), 256, fp); } unsigned char *pBmpBuf = new unsigned char[lineByte*bmpHeight]; fread(pBmpBuf, 1, lineByte*bmpHeight, fp);
CDC *m_pMemDC; m_pMemDC = new CDC(); CDC *pDC; pDC = new CDC(); pDC->Attach(GetDC(0)); m_pMemDC->CreateCompatibleDC(pDC); CBitmap *m_pOldBmp = NULL; CBitmap *m_pMemBmp = new CBitmap(); //根据图片的大小创建一个兼容位图 m_pMemBmp->CreateCompatibleBitmap(pDC, bmpWidth, bmpHeight); m_pOldBmp = m_pMemDC->SelectObject(m_pMemBmp);
// 把图像的数据绘制到兼容位图上 SetDIBits(m_pMemDC->GetSafeHdc(), (HBITMAP)m_pMemBmp->m_hObject, 0, bmpHeight, (LPVOID)pBmpBuf, (BITMAPINFO*)&head, DIB_RGB_COLORS);
// 导入新图片 FILE *lfp=fopen("new.bmp", "rb"); if(lfp == 0) return 1; fseek(lfp, sizeof(BITMAPFILEHEADER), 0); BITMAPINFOHEADER lhead; fread(&lhead, sizeof(BITMAPINFOHEADER), 1, lfp); bmpHeight = lhead.biHeight; bmpWidth = lhead.biWidth; biBitCount = lhead.biBitCount; lineByte = (bmpWidth*biBitCount/8+3)/4*4; RGBQUAD *ColorTable; if(biBitCount == { ColorTable = new RGBQUAD[256]; fread(ColorTable, sizeof(RGBQUAD), 256, lfp); } unsigned char *BmpBuf = new unsigned char[lineByte*bmpHeight]; fread(BmpBuf, 1, lineByte*bmpHeight, lfp);
CDC *pMemDC; pMemDC = new CDC(); CDC *DC; DC = new CDC(); DC->Attach(GetDC(0)); pMemDC->CreateCompatibleDC(DC); CBitmap *m_MemBmp = new CBitmap(); //根据图片的大小创建一个兼容位图 m_MemBmp->CreateCompatibleBitmap(DC, bmpWidth, bmpHeight); SetDIBits(pMemDC->GetSafeHdc(), (HBITMAP)m_MemBmp->m_hObject, 0, bmpHeight, (LPVOID)BmpBuf, (BITMAPINFO*)&lhead, DIB_RGB_COLORS);
// 将新图片添加到背景图片?????????? pMemDC->BitBlt(0, 0, bmpWidth, bmpHeight, m_pMemDC, 0, 0, SRCCOPY);
知道怎么读写BMP文件吗(我说的是根据BMP格式,来解释文件的数据)?如果知道的话很容易做呀。C/C++ code #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <time.h>
BYTE *Read8BitBmpFile2Img(const char * filename,int *width,int *height) { FILE *BinFile; BITMAPFILEHEADER FileHeader; BITMAPINFOHEADER BmpHeader; BYTE *pImg; unsigned int size; int Suc=1,w,h;
// Open File *width=*height=0; if((BinFile=fopen(filename,"rb"))==NULL) return NULL; // Read Struct Info if (fread((void *)&FileHeader,1,sizeof(FileHeader),BinFile)!=sizeof(FileHeader)) Suc=-1; if (fread((void *)&BmpHeader,1,sizeof(BmpHeader),BinFile)!=sizeof(BmpHeader)) Suc=-1; if ( (Suc==-1) || (FileHeader.bfOffBits<sizeof(FileHeader)+sizeof(BmpHeader) ) ) { fclose(BinFile); return NULL; }
// Read Image Data *width=w=BmpHeader.biWidth; *height=h=BmpHeader.biHeight; size=w*h; fseek(BinFile,FileHeader.bfOffBits,SEEK_SET); if ( (pImg=new BYTE[size])!=NULL) { for(int i=0;i<h;i++) { if (fread(pImg+(h-1-i)*w,sizeof(BYTE),w,BinFile)!=w) { fclose(BinFile); delete pImg; pImg=NULL; return NULL; } fseek(BinFile,(w+3)/4*4-w,SEEK_CUR); } } fclose(BinFile); return pImg; }
bool Write8BitImg2BmpFile(BYTE *pImg,int width,int height,const char * filename) // 当宽度不是4的倍数时自动添加成4的倍数 { FILE * BinFile; BITMAPFILEHEADER FileHeader; BITMAPINFOHEADER BmpHeader; int i,extend; bool Suc=true; BYTE p[4],*pCur;
// Open File if((BinFile=fopen(filename,"w+b"))==NULL) { return false; } // Fill the FileHeader FileHeader.bfType= ((WORD) (‘M’ << | ‘B’); FileHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+256*4L; FileHeader.bfSize=FileHeader.bfOffBits+width*height ; FileHeader.bfReserved1=0; FileHeader.bfReserved2=0; if (fwrite((void *)&FileHeader,1,sizeof(FileHeader),BinFile)!=sizeof(FileHeader)) Suc=false; // Fill the ImgHeader BmpHeader.biSize = 40; BmpHeader.biWidth = width; BmpHeader.biHeight = height; BmpHeader.biPlanes = 1 ; BmpHeader.biBitCount = 8 ; BmpHeader.biCompression = 0 ; BmpHeader.biSizeImage = 0 ; BmpHeader.biXPelsPerMeter = 0; BmpHeader.biYPelsPerMeter = 0; BmpHeader.biClrUsed = 0; BmpHeader.biClrImportant = 0; if (fwrite((void *)&BmpHeader,1,sizeof(BmpHeader),BinFile)!=sizeof(BmpHeader)) Suc=false; // write Pallete for (i=0,p[3]=0;i<256;i++) { p[3]=0; p[0]=p[1]=p[2]=i; // blue,green,red; if (fwrite((void *)p,1,4,BinFile)!=4) { Suc=false; break; } } // write image data extend=(width+3)/4*4-width; if (extend==0) { for(pCur=pImg+(height-1)*width;pCur>=pImg;pCur-=width) { if (fwrite((void *)pCur,1,width,BinFile)!=(unsigned int)width) Suc=false; // 真实的数据 } } else { for(pCur=pImg+(height-1)*width;pCur>=pImg;pCur-=width) { if (fwrite((void *)pCur,1,width,BinFile)!=(unsigned int)width) Suc=false; // 真实的数据 for(i=0;i<extend;i++) // 扩充的数据 if (fwrite((void *)(pCur+width-1),1,1,BinFile)!=1) Suc=false; } } // return; fclose(BinFile); return Suc; }
BYTE *Read24BitBmpFile2Img(const char * filename,int *width,int *height) { FILE * BinFile; BITMAPFILEHEADER FileHeader; BITMAPINFOHEADER BmpHeader; BYTE *img; unsigned int size; int Suc=1,w,h;
// Open File *width=*height=0; if((BinFile=fopen(filename,"rb"))==NULL) return NULL; // Read Struct Info if (fread((void *)&FileHeader,1,sizeof(FileHeader),BinFile)!=sizeof(FileHeader)) Suc=-1; if (fread((void *)&BmpHeader,1,sizeof(BmpHeader),BinFile)!=sizeof(BmpHeader)) Suc=-1; if ( (Suc==-1) || (FileHeader.bfOffBits<sizeof(FileHeader)+sizeof(BmpHeader) ) ) { fclose(BinFile); return NULL; } // Read Image Data *width=w=BmpHeader.biWidth; *height=h=BmpHeader.biHeight; size=(*width)*(*height)*3; fseek(BinFile,FileHeader.bfOffBits,SEEK_SET); if ( (img=new BYTE[size])!=NULL) { for(int i=0;i<h;i++) { if(fread(img+(h-1-i)*w*3,sizeof(BYTE),w*3,BinFile)!=w*3) { fclose(BinFile); delete img; img=NULL; return NULL; } fseek(BinFile,(3*w+3)/4*4-3*w,SEEK_CUR); } } fclose(BinFile); return img; } bool Write24BitImg2BmpFile(BYTE *pImg,int width,int height,const char * filename) // 当宽度不是4的倍数时自动添加成4的倍数 { FILE *BinFile; BITMAPFILEHEADER FileHeader; BITMAPINFOHEADER BmpHeader; bool Suc=true; int i,extend; BYTE *pCur;
// Open File if((BinFile=fopen(filename,"w+b"))==NULL) { return false; } // Fill the FileHeader FileHeader.bfType= ((WORD) (‘M’ << | ‘B’); FileHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); FileHeader.bfSize=FileHeader.bfOffBits+width*height*3L ; FileHeader.bfReserved1=0; FileHeader.bfReserved2=0; if (fwrite((void *)&FileHeader,1,sizeof(BITMAPFILEHEADER),BinFile)!=sizeof(BITMAPFILEHEADER)) Suc=false; // Fill the ImgHeader BmpHeader.biSize = 40; BmpHeader.biWidth = width; BmpHeader.biHeight = height; BmpHeader.biPlanes = 1 ; BmpHeader.biBitCount = 24 ; BmpHeader.biCompression = 0 ; BmpHeader.biSizeImage = 0 ; BmpHeader.biXPelsPerMeter = 0; BmpHeader.biYPelsPerMeter = 0; BmpHeader.biClrUsed = 0; BmpHeader.biClrImportant = 0; if (fwrite((void *)&BmpHeader,1,sizeof(BITMAPINFOHEADER),BinFile)!=sizeof(BITMAPINFOHEADER)) Suc=false; // write image data extend=(3*width+3)/4*4-3*width; if (extend==0) { for(pCur=pImg+(height-1)*3*width;pCur>=pImg;pCur-=3*width) { if (fwrite((void *)pCur,1,width*3,BinFile)!=(unsigned int)(3*width)) Suc=false; // 真实的数据 } } else { for(pCur=pImg+(height-1)*3*width;pCur>=pImg;pCur-=3*width) { if (fwrite((void *)pCur,1,width*3,BinFile)!=(unsigned int)(3*width)) Suc=false; // 真实的数据 if (fwrite((void *)(pCur+3*(width-1)+0),1,extend,BinFile)!=1) Suc=false;// 扩充的数据 } } // return; fclose(BinFile); return Suc; }
上面几个函数修改一下,调用一下就可以了。
还是使用GDI+ 吧,很简单的 Graphics g(hdc);Image *pFile= Image::FromFile(L"test1.bmp");g.DrawImage(pFile,0,0);delete pFile;Image *pImage2= Image::FromFile(L"test2.bmp");g.DrawImage(pImage2,0,0);delete pImage2;
评论功能因故关闭!
请加入我们的QQ群一起参与讨论:群号59400482(500人超级群)
Copyright © 2007-2010 www.Chengxy.com All rights reserved
Powered by 王牌程序员
MFC是什么?楼主搞搞清楚,框架。如果没有写这种方法,楼主就不能用啊乖乖的用GDI,写2个CDC合成一下把。
怎么用CDC合成呀?我没做过图片处理,麻烦给代码或关键代码
TransparentBlt
要是实在没有代码就给个可行的编辑步骤,最好包括每部的关键函数
创建一个大的bmp先贴一个,在贴另一个
不懂。我的代码如下:C/C++ code
// 导入背景图片
FILE *fp=fopen("back.bmp", "rb");
if(fp == 0)
return 1;
fseek(fp, sizeof(BITMAPFILEHEADER), 0);
BITMAPINFOHEADER head;
fread(&head, sizeof(BITMAPINFOHEADER), 1, fp);
int bmpHeight = head.biHeight;
int bmpWidth = head.biWidth;
int biBitCount = head.biBitCount;
int lineByte = (bmpWidth*biBitCount/8+3)/4*4;
RGBQUAD *pColorTable;
if(biBitCount ==
{
pColorTable = new RGBQUAD[256];
fread(pColorTable, sizeof(RGBQUAD), 256, fp);
}
unsigned char *pBmpBuf = new unsigned char[lineByte*bmpHeight];
fread(pBmpBuf, 1, lineByte*bmpHeight, fp);
CDC *m_pMemDC;
m_pMemDC = new CDC();
CDC *pDC;
pDC = new CDC();
pDC->Attach(GetDC(0));
m_pMemDC->CreateCompatibleDC(pDC);
CBitmap *m_pOldBmp = NULL;
CBitmap *m_pMemBmp = new CBitmap(); //根据图片的大小创建一个兼容位图
m_pMemBmp->CreateCompatibleBitmap(pDC, bmpWidth, bmpHeight);
m_pOldBmp = m_pMemDC->SelectObject(m_pMemBmp);
// 把图像的数据绘制到兼容位图上
SetDIBits(m_pMemDC->GetSafeHdc(), (HBITMAP)m_pMemBmp->m_hObject,
0, bmpHeight, (LPVOID)pBmpBuf, (BITMAPINFO*)&head, DIB_RGB_COLORS);
// 导入新图片
FILE *lfp=fopen("new.bmp", "rb");
if(lfp == 0)
return 1;
fseek(lfp, sizeof(BITMAPFILEHEADER), 0);
BITMAPINFOHEADER lhead;
fread(&lhead, sizeof(BITMAPINFOHEADER), 1, lfp);
bmpHeight = lhead.biHeight;
bmpWidth = lhead.biWidth;
biBitCount = lhead.biBitCount;
lineByte = (bmpWidth*biBitCount/8+3)/4*4;
RGBQUAD *ColorTable;
if(biBitCount ==
{
ColorTable = new RGBQUAD[256];
fread(ColorTable, sizeof(RGBQUAD), 256, lfp);
}
unsigned char *BmpBuf = new unsigned char[lineByte*bmpHeight];
fread(BmpBuf, 1, lineByte*bmpHeight, lfp);
CDC *pMemDC;
pMemDC = new CDC();
CDC *DC;
DC = new CDC();
DC->Attach(GetDC(0));
pMemDC->CreateCompatibleDC(DC);
CBitmap *m_MemBmp = new CBitmap(); //根据图片的大小创建一个兼容位图
m_MemBmp->CreateCompatibleBitmap(DC, bmpWidth, bmpHeight);
SetDIBits(pMemDC->GetSafeHdc(), (HBITMAP)m_MemBmp->m_hObject,
0, bmpHeight, (LPVOID)BmpBuf, (BITMAPINFO*)&lhead, DIB_RGB_COLORS);
// 将新图片添加到背景图片??????????
pMemDC->BitBlt(0, 0, bmpWidth, bmpHeight, m_pMemDC, 0, 0, SRCCOPY);
知道怎么读写BMP文件吗(我说的是根据BMP格式,来解释文件的数据)?如果知道的话很容易做呀。C/C++ code
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
BYTE *Read8BitBmpFile2Img(const char * filename,int *width,int *height)
{
FILE *BinFile;
BITMAPFILEHEADER FileHeader;
BITMAPINFOHEADER BmpHeader;
BYTE *pImg;
unsigned int size;
int Suc=1,w,h;
// Open File
*width=*height=0;
if((BinFile=fopen(filename,"rb"))==NULL) return NULL;
// Read Struct Info
if (fread((void *)&FileHeader,1,sizeof(FileHeader),BinFile)!=sizeof(FileHeader)) Suc=-1;
if (fread((void *)&BmpHeader,1,sizeof(BmpHeader),BinFile)!=sizeof(BmpHeader)) Suc=-1;
if ( (Suc==-1) ||
(FileHeader.bfOffBits<sizeof(FileHeader)+sizeof(BmpHeader) )
)
{
fclose(BinFile);
return NULL;
}
// Read Image Data
*width=w=BmpHeader.biWidth;
*height=h=BmpHeader.biHeight;
size=w*h;
fseek(BinFile,FileHeader.bfOffBits,SEEK_SET);
if ( (pImg=new BYTE[size])!=NULL)
{
for(int i=0;i<h;i++)
{
if (fread(pImg+(h-1-i)*w,sizeof(BYTE),w,BinFile)!=w)
{
fclose(BinFile);
delete pImg;
pImg=NULL;
return NULL;
}
fseek(BinFile,(w+3)/4*4-w,SEEK_CUR);
}
}
fclose(BinFile);
return pImg;
}
bool Write8BitImg2BmpFile(BYTE *pImg,int width,int height,const char * filename)
// 当宽度不是4的倍数时自动添加成4的倍数
{ FILE * BinFile;
BITMAPFILEHEADER FileHeader;
BITMAPINFOHEADER BmpHeader;
int i,extend;
bool Suc=true;
BYTE p[4],*pCur;
// Open File
| ‘B’);
if((BinFile=fopen(filename,"w+b"))==NULL) { return false; }
// Fill the FileHeader
FileHeader.bfType= ((WORD) (‘M’ <<
FileHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+256*4L;
FileHeader.bfSize=FileHeader.bfOffBits+width*height ;
FileHeader.bfReserved1=0;
FileHeader.bfReserved2=0;
if (fwrite((void *)&FileHeader,1,sizeof(FileHeader),BinFile)!=sizeof(FileHeader)) Suc=false;
// Fill the ImgHeader
BmpHeader.biSize = 40;
BmpHeader.biWidth = width;
BmpHeader.biHeight = height;
BmpHeader.biPlanes = 1 ;
BmpHeader.biBitCount = 8 ;
BmpHeader.biCompression = 0 ;
BmpHeader.biSizeImage = 0 ;
BmpHeader.biXPelsPerMeter = 0;
BmpHeader.biYPelsPerMeter = 0;
BmpHeader.biClrUsed = 0;
BmpHeader.biClrImportant = 0;
if (fwrite((void *)&BmpHeader,1,sizeof(BmpHeader),BinFile)!=sizeof(BmpHeader)) Suc=false;
// write Pallete
for (i=0,p[3]=0;i<256;i++)
{
p[3]=0;
p[0]=p[1]=p[2]=i; // blue,green,red;
if (fwrite((void *)p,1,4,BinFile)!=4) { Suc=false; break; }
}
// write image data
extend=(width+3)/4*4-width;
if (extend==0)
{
for(pCur=pImg+(height-1)*width;pCur>=pImg;pCur-=width)
{
if (fwrite((void *)pCur,1,width,BinFile)!=(unsigned int)width) Suc=false; // 真实的数据
}
}
else
{
for(pCur=pImg+(height-1)*width;pCur>=pImg;pCur-=width)
{
if (fwrite((void *)pCur,1,width,BinFile)!=(unsigned int)width) Suc=false; // 真实的数据
for(i=0;i<extend;i++) // 扩充的数据
if (fwrite((void *)(pCur+width-1),1,1,BinFile)!=1) Suc=false;
}
}
// return;
fclose(BinFile);
return Suc;
}
BYTE *Read24BitBmpFile2Img(const char * filename,int *width,int *height)
{ FILE * BinFile;
BITMAPFILEHEADER FileHeader;
BITMAPINFOHEADER BmpHeader;
BYTE *img;
unsigned int size;
int Suc=1,w,h;
// Open File
*width=*height=0;
if((BinFile=fopen(filename,"rb"))==NULL) return NULL;
// Read Struct Info
if (fread((void *)&FileHeader,1,sizeof(FileHeader),BinFile)!=sizeof(FileHeader)) Suc=-1;
if (fread((void *)&BmpHeader,1,sizeof(BmpHeader),BinFile)!=sizeof(BmpHeader)) Suc=-1;
if ( (Suc==-1) ||
(FileHeader.bfOffBits<sizeof(FileHeader)+sizeof(BmpHeader) )
)
{
fclose(BinFile);
return NULL;
}
// Read Image Data
*width=w=BmpHeader.biWidth;
*height=h=BmpHeader.biHeight;
size=(*width)*(*height)*3;
fseek(BinFile,FileHeader.bfOffBits,SEEK_SET);
if ( (img=new BYTE[size])!=NULL)
{
for(int i=0;i<h;i++)
{
if(fread(img+(h-1-i)*w*3,sizeof(BYTE),w*3,BinFile)!=w*3)
{
fclose(BinFile);
delete img;
img=NULL;
return NULL;
}
fseek(BinFile,(3*w+3)/4*4-3*w,SEEK_CUR);
}
}
fclose(BinFile);
return img;
}
bool Write24BitImg2BmpFile(BYTE *pImg,int width,int height,const char * filename)
// 当宽度不是4的倍数时自动添加成4的倍数
{ FILE *BinFile;
BITMAPFILEHEADER FileHeader;
BITMAPINFOHEADER BmpHeader;
bool Suc=true;
int i,extend;
BYTE *pCur;
// Open File
| ‘B’);
if((BinFile=fopen(filename,"w+b"))==NULL) { return false; }
// Fill the FileHeader
FileHeader.bfType= ((WORD) (‘M’ <<
FileHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
FileHeader.bfSize=FileHeader.bfOffBits+width*height*3L ;
FileHeader.bfReserved1=0;
FileHeader.bfReserved2=0;
if (fwrite((void *)&FileHeader,1,sizeof(BITMAPFILEHEADER),BinFile)!=sizeof(BITMAPFILEHEADER)) Suc=false;
// Fill the ImgHeader
BmpHeader.biSize = 40;
BmpHeader.biWidth = width;
BmpHeader.biHeight = height;
BmpHeader.biPlanes = 1 ;
BmpHeader.biBitCount = 24 ;
BmpHeader.biCompression = 0 ;
BmpHeader.biSizeImage = 0 ;
BmpHeader.biXPelsPerMeter = 0;
BmpHeader.biYPelsPerMeter = 0;
BmpHeader.biClrUsed = 0;
BmpHeader.biClrImportant = 0;
if (fwrite((void *)&BmpHeader,1,sizeof(BITMAPINFOHEADER),BinFile)!=sizeof(BITMAPINFOHEADER)) Suc=false;
// write image data
extend=(3*width+3)/4*4-3*width;
if (extend==0)
{
for(pCur=pImg+(height-1)*3*width;pCur>=pImg;pCur-=3*width)
{
if (fwrite((void *)pCur,1,width*3,BinFile)!=(unsigned int)(3*width)) Suc=false; // 真实的数据
}
}
else
{
for(pCur=pImg+(height-1)*3*width;pCur>=pImg;pCur-=3*width)
{
if (fwrite((void *)pCur,1,width*3,BinFile)!=(unsigned int)(3*width)) Suc=false; // 真实的数据
if (fwrite((void *)(pCur+3*(width-1)+0),1,extend,BinFile)!=1) Suc=false;// 扩充的数据
}
}
// return;
fclose(BinFile);
return Suc;
}
上面几个函数修改一下,调用一下就可以了。
还是使用GDI+ 吧,很简单的 Graphics g(hdc);Image *pFile= Image::FromFile(L"test1.bmp");g.DrawImage(pFile,0,0);delete pFile;Image *pImage2= Image::FromFile(L"test2.bmp");g.DrawImage(pImage2,0,0);delete pImage2;