zoukankan      html  css  js  c++  java
  • VC6.0图像处理1浏览图片


    点击打开链接源码下载:http://download.csdn.net/detail/renshengrumenglibing/3875522


    //显示函数参考了王占全老师的VC图像处理与工程案例,其余的只是参考了一下算法,均为自己编写

    一 添加如下public变量:

     public:
    BITMAPINFOHEADER bi;   //信息头
    RGBQUAD* quad;         //调色板
    BYTE* lpBuf;   //图像数据
    BITMAPINFO* pbi;       
    int flag;              //标志表示是否打开了bmp文件
    int numQuad;       //调色板数目
    BYTE* lpshowbuf;  //用于显示的图像数据
    int zoomfactor;      //缩放比率

    二 添加菜单以及处理函数

    void CBMPViewerDoc::OnFileOpen() 
    {
    // TODO: Add your command handler code here
    LPCTSTR lpszFilter="BMP Files(*.bmp)|*.bmp|任何文件|*.*||";
    CFileDialog dlg1(TRUE,lpszFilter,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,lpszFilter,NULL);
    CString filename;


    BITMAPFILEHEADER bf;


    //打开文件对话框
    if(dlg1.DoModal()==IDOK)
    {
    filename=dlg1.GetPathName();
    if(file.Open(filename,CFile::modeRead|CFile::shareDenyNone,NULL)==0)
    {
    //读取文件失败
    AfxMessageBox("无法打开文件!",MB_OK,0);
    return;
    }
    //读取文件头
    file.Read(&bf,sizeof(bf));
    //判断是否是BMP文件
    if(bf.bfType!=0x4d42)//'BM'
    {
    AfxMessageBox("非BMP文件!",MB_OK,0);
    return;
    }
    //判断文件是否损坏
    if(file.GetLength()!=bf.bfSize)
    {
    AfxMessageBox("文件已损坏,请检查!",MB_OK,0);
    return;
    }


    //读文件信息头
    file.Read(&bi,sizeof(bi));

    //计算调色板数目
    numQuad=0;
    if(bi.biBitCount<24)
    {
    numQuad=1<<bi.biBitCount;
    }

    //为图像信息pbi申请空间
    pbi=(BITMAPINFO*)HeapAlloc(GetProcessHeap(),0,sizeof(BITMAPINFOHEADER)+numQuad*sizeof(RGBQUAD));
    memcpy(pbi,&bi,sizeof(bi));
    quad=(RGBQUAD*)((BYTE*)pbi+sizeof(BITMAPINFOHEADER));

    //读取调色板
    if(numQuad!=0)
    {
    file.Read(quad,sizeof(RGBQUAD)*numQuad);
    }

    //为图像数据申请空间
    bi.biSizeImage=bf.bfSize-bf.bfOffBits;
    lpBuf=(BYTE*)HeapAlloc(GetProcessHeap(),0,bi.biSizeImage);
    //读取图像数据
    file.Read(lpBuf,bi.biSizeImage);

    //图像读取完毕,关闭文件,设置标志
    file.Close();
    flag=1;
    zoomfactor=1;
    lpshowbuf=NULL;
    PrepareShowdata(); //进行相关的运算,主要是算出SetDIBitsToDevice()所需要的各个参数
    UpdateAllViews(NULL,0,NULL);
    }
    }

    三添加 PrepareShowdata()函数

    BOOL CBMPViewerDoc::PrepareShowdata()
    {
    BYTE** image;
    BYTE** originimage;
    int i,j;
    int linewidth;


    if(lpshowbuf!=NULL)
    HeapFree(GetProcessHeap(),0,lpshowbuf);
    if(zoomfactor>=1)
    {//放大
    pbi->bmiHeader.biHeight=bi.biHeight*zoomfactor;
    pbi->bmiHeader.biWidth=bi.biWidth*zoomfactor;

    //每行四字节补齐,计算每行字节数:
    linewidth=(pbi->bmiHeader.biWidth*pbi->bmiHeader.biBitCount+31)/32*4;

    //计算显示图像所需内存大小
    pbi->bmiHeader.biSizeImage=linewidth*pbi->bmiHeader.biHeight;

    //申请内存
    lpshowbuf=(BYTE*)HeapAlloc(GetProcessHeap(),0,pbi->bmiHeader.biSizeImage);

    //生成对lpshowbuf的二维数组索引:
    image=new BYTE*[pbi->bmiHeader.biHeight];
    for(i=0;i<pbi->bmiHeader.biHeight;i++)
    image[i]=lpshowbuf+i*linewidth;

    originimage=new BYTE*[bi.biHeight];
    for(i=0;i<bi.biHeight;i++)
    originimage[i]=lpBuf+i*bi.biSizeImage/bi.biHeight;


    //赋值
    if(bi.biBitCount<24)
    {
    for(i=0;i<pbi->bmiHeader.biHeight;i++)
    for(j=0;j<linewidth;j++)
     image[i][j]=originimage[i/zoomfactor][j/zoomfactor];
    }
    else if(bi.biBitCount==24)
    {//24位真彩色
    for(i=0;i<pbi->bmiHeader.biHeight;i++)
    for(j=0;j<pbi->bmiHeader.biWidth;j++)
    {
    image[i][j*3]=originimage[i/zoomfactor][(j/zoomfactor)*3];
    image[i][j*3+1]=originimage[i/zoomfactor][(j/zoomfactor)*3+1];
    image[i][j*3+2]=originimage[i/zoomfactor][(j/zoomfactor)*3+2];
    }
    }
    else
    {//32位色
    for(i=0;i<pbi->bmiHeader.biHeight;i++)
    for(j=0;j<pbi->bmiHeader.biWidth;j++)
    {
    image[i][j*4]=originimage[i/zoomfactor][(j/zoomfactor)*4];
    image[i][j*4+1]=originimage[i/zoomfactor][(j/zoomfactor)*4+1];
    image[i][j*4+2]=originimage[i/zoomfactor][(j/zoomfactor)*4+2];
      image[i][j*4+3]=originimage[i/zoomfactor][(j/zoomfactor)*4+3];
    }
    }
    }
    else
    {//缩小
    pbi->bmiHeader.biHeight=bi.biHeight/(-zoomfactor);
    pbi->bmiHeader.biWidth=bi.biWidth/(-zoomfactor);

    //每行四字节补齐,计算每行字节数:
    linewidth=(pbi->bmiHeader.biWidth*pbi->bmiHeader.biBitCount+31)/32*4;

    //计算显示图像所需内存大小
    pbi->bmiHeader.biSizeImage=linewidth*pbi->bmiHeader.biHeight;

    //申请内存
    lpshowbuf=(BYTE*)HeapAlloc(GetProcessHeap(),0,pbi->bmiHeader.biSizeImage);

    //生成对lpshowbuf的二维数组索引:
    image=new BYTE*[pbi->bmiHeader.biHeight];
    for(i=0;i<pbi->bmiHeader.biHeight;i++)
    image[i]=lpshowbuf+i*linewidth;

    originimage=new BYTE*[bi.biHeight];
    for(i=0;i<bi.biHeight;i++)
    originimage[i]=lpBuf+i*bi.biSizeImage/bi.biHeight;


    //赋值
    if(bi.biBitCount<24)
    {
    for(i=0;i<pbi->bmiHeader.biHeight;i++)
    for(j=0;j<linewidth;j++)
     image[i][j]=originimage[i*(-zoomfactor)][j*(-zoomfactor)];
    }
    else if(bi.biBitCount==24)
    {//24位真彩色
    for(i=0;i<pbi->bmiHeader.biHeight;i++)
    for(j=0;j<pbi->bmiHeader.biWidth;j++)
    {
    image[i][j*3]=originimage[i*(-zoomfactor)][(j*(-zoomfactor))*3];
    image[i][j*3+1]=originimage[i*(-zoomfactor)][(j*(-zoomfactor))*3+1];
    image[i][j*3+2]=originimage[i*(-zoomfactor)][(j*(-zoomfactor))*3+2];
    }
    }
    else
    {//32位色
    for(i=0;i<pbi->bmiHeader.biHeight;i++)
    for(j=0;j<pbi->bmiHeader.biWidth;j++)
    {
    image[i][j*4]=originimage[i*(-zoomfactor)][(j*(-zoomfactor))*4];
    image[i][j*4+1]=originimage[i*(-zoomfactor)][(j*(-zoomfactor))*4+1];
    image[i][j*4+2]=originimage[i*(-zoomfactor)][(j*(-zoomfactor))*4+2];
    image[i][j*4+3]=originimage[i*(-zoomfactor)][(j*(-zoomfactor))*4+3];
    }
    }


    }
    return TRUE;
    }

    四 在View类中显示图片

    //在OnPaint()编写

    void CBMPViewerView::OnPaint() 
    {
    CPaintDC dc(this); // device context for painting

    // TODO: Add your message handler code here
    //得到文档指针
    CBMPViewerDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);


    //是否已打开某个BMP文件
    if(pDoc->flag==1)
    {
    //指定是显示的颜色
    SetDIBitsToDevice(dc.m_hDC,0,0,pDoc->pbi->bmiHeader.biWidth,
    pDoc->pbi->bmiHeader.biHeight,0,0,0,
    pDoc->pbi->bmiHeader.biHeight,pDoc->lpBuf, 
    pDoc->pbi,DIB_RGB_COLORS);   
    }
    // Do not call CView::OnPaint() for painting messages
    }

    //未完待续

  • 相关阅读:
    lines-HDU5124(区间处理 +离散化)
    Reorder the Books-HDU5500
    Bad Hair Day-POJ3250(简单的入栈出栈)
    Count the Colors-ZOJ1610(线段树区间求)
    Just a Hook-HDU1698(线段树求区间)
    Mayor's posters-POJ2528(线段树+离散化)
    A Simple Problem with Integers-POJ3468
    Strongly connected-HDU4635
    Caocao's Bridges-HDU4738(Tarjin+求桥)
    Warm up-HUD4612(树的直径+Tarjin缩点)
  • 原文地址:https://www.cnblogs.com/libing64/p/2878777.html
Copyright © 2011-2022 走看看