我在其他的模块中用c fwrite读取了一个bmp的二进制的流。现在mfc的现实图像的函数写成
   show_pic(char * pic_data,int pic_len)
{
   //请问这里该如何显示图片?
}

解决方案 »

  1.   


    #define SHOW_NORMAL 1
    #define SHOW_CENTER 2
    #define SHOW_STRETCH 3
    #define SHOW_ISOSTRETCH 4int  ShowDib (HDC hdc, BITMAPFILEHEADER * pbmfh, int cxClient, int cyClient, int wShow)
    {
    if(NULL==pbmfh)
    return 0;
    return ShowDib(hdc,(BITMAPINFO*)(pbmfh+1),(BYTE*)pbmfh+(pbmfh->bfOffBits),cxClient,cyClient,wShow);
    }
    int ShowDib (HDC hdc, BITMAPINFO * pbmi, BYTE * pBits, int cxClient, int cyClient, int wShow)
    {
    if(NULL==hdc || NULL==pbmi || NULL==pBits || wShow<SHOW_NORMAL || wShow>SHOW_ISOSTRETCH)
    return 0;
    int cxDib, cyDib ;
    int BltMode, ret ;
    if (pbmi->bmiHeader.biSize == sizeof (BITMAPCOREHEADER))
    {
    cxDib = ((BITMAPCOREHEADER *) pbmi)->bcWidth ;
    cyDib = ((BITMAPCOREHEADER *) pbmi)->bcHeight ;
    }
    else
    {
    cxDib =      pbmi->bmiHeader.biWidth ;
    cyDib = abs (pbmi->bmiHeader.biHeight) ;
    }
    switch (wShow)
    {
    case SHOW_NORMAL:
    return SetDIBitsToDevice (hdc, 0, 0, cxDib, cyDib, 0, 0, 
    0, cyDib, pBits, pbmi, DIB_RGB_COLORS) ;

    case SHOW_CENTER:
    return SetDIBitsToDevice (hdc, (cxClient - cxDib) / 2,(cyClient - cyDib) / 2, 
    cxDib, cyDib, 0, 0, 0, cyDib, pBits, pbmi, DIB_RGB_COLORS) ;

    case SHOW_STRETCH:
    BltMode=SetStretchBltMode (hdc, COLORONCOLOR) ;
    ret=StretchDIBits (hdc, 0, 0, cxClient, cyClient, 
    0, 0, cxDib, cyDib,
    pBits, pbmi, DIB_RGB_COLORS, SRCCOPY) ;
    SetStretchBltMode (hdc, BltMode) ;
    return ret;

    case SHOW_ISOSTRETCH:
    BltMode=SetStretchBltMode (hdc, COLORONCOLOR) ;
    if(cxDib*cyClient > cyDib*cxClient)//图更宽
    ret=StretchDIBits (hdc,0,
    (cyClient-(int)((float)cyDib/(float)cxDib*(float)cxClient))/2,
    cxClient, (int)((float)cyDib/(float)cxDib*(float)cxClient) , 
    0, 0, cxDib, cyDib, pBits, pbmi, DIB_RGB_COLORS, SRCCOPY) ;
    else
    ret=StretchDIBits (hdc,
    (cxClient-(int)((float)cxDib/(float)cyDib*(float)cyClient))/2, 0,
    (int)((float)cxDib/(float)cyDib*(float)cyClient), cyClient,
    0, 0, cxDib, cyDib, pBits, pbmi, DIB_RGB_COLORS, SRCCOPY) ;
    SetStretchBltMode (hdc, BltMode) ;
    return ret;
    }
    return 0 ;
    }
    例:
    ShowDib (hdc, (BITMAPFILEHEADER * )pic_data, cxClient, cyClient, SHOW_CENTER);
      

  2.   

    把BMP的头去掉,后面就是RGB数据了
    然后该怎么显示就怎么显示咯
      

  3.   

    给你一段bmp读写程序  建议你还是先把bmp的数据存储格式了解下  百度上就有
    #include "Windows.h"
    #include "stdio.h"
    #include "string.h"
    #include "malloc.h"unsigned char *pBmpBuf;//读入图像数据的指针
    int bmpWidth;//图像的宽
    int bmpHeight;//图像的高
    RGBQUAD *pColorTable;//颜色表指针
    int biBitCount;//图像类型,每像素位数bool readBmp(char *bmpName)
    {
        //二进制读方式打开指定的图像文件
        FILE *fp=fopen(bmpName,"rb");
        if(fp==0) return 0;
        
        
        //跳过位图文件头结构BITMAPFILEHEADER
        fseek(fp, sizeof(BITMAPFILEHEADER),0);
        //定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中
        BITMAPINFOHEADER head;  
        fread(&head, sizeof(BITMAPINFOHEADER), 1,fp); 
        //获取图像宽、高、每像素所占位数等信息
        bmpWidth = head.biWidth;
        bmpHeight = head.biHeight;
        biBitCount = head.biBitCount;
        //定义变量,计算图像每行像素所占的字节数(必须是4的倍数)
        int lineByte=(bmpWidth * biBitCount/8+3)/4*4;
        //灰度图像有颜色表,且颜色表表项为256
        if(biBitCount==8){
            //申请颜色表所需要的空间,读颜色表进内存
            pColorTable=new RGBQUAD[256];
            fread(pColorTable,sizeof(RGBQUAD),256,fp);
        }
        //申请位图数据所需要的空间,读位图数据进内存
        pBmpBuf=new unsigned char[lineByte * bmpHeight];
        fread(pBmpBuf,1,lineByte * bmpHeight,fp);
        //关闭文件
        fclose(fp);
        return 1;
    }bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height, 
                 int biBitCount, RGBQUAD *pColorTable)
    {
        //如果位图数据指针为0,则没有数据传入,函数返回
        if(!imgBuf)
            return 0;
        //颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0
        int colorTablesize=0;
        if(biBitCount==8)
            colorTablesize=1024;
        //待存储图像数据每行字节数为4的倍数
        int lineByte=(width * biBitCount/8+3)/4*4;
        //以二进制写的方式打开文件
        FILE *fp=fopen(bmpName,"wb");
        if(fp==0) return 0;
        //申请位图文件头结构变量,填写文件头信息
        BITMAPFILEHEADER fileHead;
        fileHead.bfType = 0x4D42;//bmp类型
        //bfSize是图像文件4个组成部分之和
        fileHead.bfSize= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
            + colorTablesize + lineByte*height;
        fileHead.bfReserved1 = 0;
        fileHead.bfReserved2 = 0;
        //bfOffBits是图像文件前3个部分所需空间之和
        fileHead.bfOffBits=54+colorTablesize;
        //写文件头进文件
        fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp);
        //申请位图信息头结构变量,填写信息头信息
        BITMAPINFOHEADER head; 
        head.biBitCount=biBitCount;
        head.biClrImportant=0;
        head.biClrUsed=0;
        head.biCompression=0;
        head.biHeight=height;
        head.biPlanes=1;
        head.biSize=40;
        head.biSizeImage=lineByte*height;
        head.biWidth=width;
        head.biXPelsPerMeter=0;
        head.biYPelsPerMeter=0;
        //写位图信息头进内存
        fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp);
        //如果灰度图像,有颜色表,写入文件 
        if(biBitCount==8)
            fwrite(pColorTable, sizeof(RGBQUAD),256, fp);
        //写位图数据进文件
        fwrite(imgBuf, height*lineByte, 1, fp);
        //关闭文件
        fclose(fp);
        return 1;
    }void main()
    {
        char inFileName[90],outFileName[90];
    printf("请输入原始位图文件的文件名:");
        scanf("%s",inFileName);
        printf("请输入加密程序产生的新位图文件的文件名:");
        scanf("%s",outFileName);
    //读入指定BMP文件进内存
        readBmp(inFileName);
        //输出图像的信息
        printf("width=%d,height=%d, biBitCount=%d\n",bmpWidth,bmpHeight, biBitCount);
        //将图像数据存盘
        saveBmp(outFileName, pBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable);
        //清除缓冲区,pBmpBuf和pColorTable是全局变量,在文件读入时申请的空间
        delete []pBmpBuf;
        if(biBitCount==8)
            delete []pColorTable;
    }
      

  4.   

    上面的是8位的bmp图像读取