怎么把两个bmp合成一个bmp?
admin 发表于 2010-10-06 | 来源:互联网 | 阅读:

背景bmp是back.bmp,在指定(30,,20)添加高为50宽为40的new.bmp。这个怎么实现?用MFC,而不是GDI

已经有10 个评论
  1. rongxin 说:

    MFC是什么?楼主搞搞清楚,框架。如果没有写这种方法,楼主就不能用啊乖乖的用GDI,写2个CDC合成一下把。

  2. sbamd 说:

    怎么用CDC合成呀?我没做过图片处理,麻烦给代码或关键代码

  3. my159 说:

    TransparentBlt

  4. cxjasx 说:

    要是实在没有代码就给个可行的编辑步骤,最好包括每部的关键函数

  5. 红烧生鱼片 说:

    创建一个大的bmp先贴一个,在贴另一个

  6. 96789123 说:
  7. 好色的皮卡丘 说:

    不懂。我的代码如下: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 == 8)
    {
    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 == 8)
    {
    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);

  8. lee 说:

    知道怎么读写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’ << 8) | ‘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’ << 8) | ‘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;
    }

  9. 萌芽邪恶 说:

    上面几个函数修改一下,调用一下就可以了。

  10. 萌芽邪恶 说:

    还是使用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人超级群)


返回首页 | 关于我们 | 联系我们 | 广告合作 | 网站地图 | 友情链接 | 版权声明