对一张任意的图像,如何得到它的灰度图像?  用C语言如何实现?

解决方案 »

  1.   

    http://www.cnblogs.com/itants/archive/2010/08/02/1790336.html
      

  2.   


    我图像代码几乎不会,有没有完整代码?包括读出图像到byte? 这样更容易上手非常感谢!
      

  3.   

    彩色转灰度在RGB空间转换就是: (R,G,B)=》(Gray,Gray,Gray)
    其中Gray=0.299R+0.587G+0.114B;"对一张任意的图像,如何得到它的灰度图像?用C语言如何实现?"
    首先要取得RGB像素;(分析图像格式)
    然后用上述公式转换为灰度。
      

  4.   


    CDC *pDC = GetDC();
    HBITMAP   hbmp=(HBITMAP)LoadImage(NULL, m_csFilePath,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE); 
    CBitmap   cbmp; 
    cbmp.Attach(hbmp); 
    BITMAP   bmp; 
    cbmp.GetBitmap(&bmp); 
    cbmp.Detach(); 
    UINT   *   pData   =   new   UINT[bmp.bmWidth   *   bmp.bmHeight]; 
    BITMAPINFO   bmpInfo; 
    bmpInfo.bmiHeader.biSize   =   sizeof(BITMAPINFOHEADER); 
    bmpInfo.bmiHeader.biWidth   =   bmp.bmWidth; 
    bmpInfo.bmiHeader.biHeight   =   -bmp.bmHeight; 
    bmpInfo.bmiHeader.biPlanes   =   1; 
    bmpInfo.bmiHeader.biCompression   =   BI_RGB; 
    bmpInfo.bmiHeader.biBitCount   =   32;  GetDIBits(pDC-> m_hDC,hbmp,0,bmp.bmHeight,pData,&bmpInfo,DIB_RGB_COLORS); 
    UINT   color,   r,   g,   b; 
    for(int i = 0;i < bmp.bmWidth*bmp.bmHeight;i++) 

    color   =   pData[i]; 
    b   =   (color   <<   8   >>   24)*0.114; 
    g   =   (color   <<   16   >>   24)*0.587; 
    r   =   (color   <<   24   >>   24)*0.229; 
            pData[i]   =   RGB(r,   g,   b); 

    SetDIBits(pDC-> m_hDC,   hbmp,0,   bmp.bmHeight,   pData,&bmpInfo,   DIB_RGB_COLORS); 
      

  5.   

    上面设置好后可以把BMP图片保存起来void CCatchScreenDlg::SaveBitmapToFile(HBITMAP hBmp, LPCWSTR lpfilename)
    {
    HDC hdc;   //设备描述表   
    int ibits;     
    WORD wbitcount;     //当前显示分辨率下每个像素所占字节数    //位图中每个像素所占字节数,定义调色板大小,位图中像素字节大小,位图文件大小   ,写入文件字节数   
    DWORD dwpalettesize=0, dwbmbitssize, dwdibsize, dwwritten;    BITMAP bitmap;   //位图属性结构   
    BITMAPFILEHEADER bmfhdr;   //位图文件头结构   
    BITMAPINFOHEADER bi;   //位图信息头结构   
    LPBITMAPINFOHEADER lpbi;   //指向位图信息头结构    //定义文件,分配内存句柄,调色板句柄   
    HANDLE fh, hdib, hpal, holdpal=NULL;    //计算位图文件每个像素所占字节数   
    hdc = CreateDC(L"DISPLAY", NULL, NULL, NULL);   
    ibits = GetDeviceCaps(hdc, BITSPIXEL) * GetDeviceCaps(hdc, PLANES);   
    DeleteDC(hdc);    if (ibits <=  1)   
    wbitcount =  1;   
    else if (ibits <= 4)   
    wbitcount = 4;   
    else if (ibits <= 8)   
    wbitcount = 8;   
    else if (ibits <= 16)   
    wbitcount = 16;   
    else if (ibits <= 24)   
    wbitcount = 24;   
    else     
    wbitcount  =  32;    //计算调色板大小   
    if (wbitcount <= 8)   
    dwpalettesize = (1 << wbitcount) * sizeof(RGBQUAD);    //设置位图信息头结构   
    GetObject(hBmp, sizeof(BITMAP), (LPSTR)&bitmap);   
    bi.biSize   =   sizeof(BITMAPINFOHEADER);   
    bi.biWidth   =   bitmap.bmWidth;   
    bi.biHeight   =   bitmap.bmHeight;   
    bi.biPlanes   =   1;   
    bi.biBitCount   =   wbitcount;   
    bi.biCompression   =   BI_RGB;   
    bi.biSizeImage   =   0;   
    bi.biXPelsPerMeter   =   0;   
    bi.biYPelsPerMeter   =   0;   
    bi.biClrUsed   =   0;   
    bi.biClrImportant   =   0;    dwbmbitssize   =   ((bitmap.bmWidth   *   wbitcount+31)/32)*   4   *   bitmap.bmHeight   ;   
    //为位图内容分配内存   
    hdib   =   GlobalAlloc(GHND,dwbmbitssize   +   dwpalettesize   +     sizeof(BITMAPINFOHEADER));   
    lpbi   =   (LPBITMAPINFOHEADER)GlobalLock(hdib);   
    *lpbi   =   bi;    //   处理调色板     
    hpal   =   GetStockObject(DEFAULT_PALETTE);   
    if   (hpal)   
    {   
    hdc   =   ::GetDC(NULL);   
    holdpal   =   SelectPalette(hdc,   (HPALETTE)hpal,   false);   
    RealizePalette(hdc);   
    }    //   获取该调色板下新的像素值   
    GetDIBits(hdc,   hBmp,   0,   (UINT)   bitmap.bmHeight,(LPSTR)lpbi   +     
    sizeof(BITMAPINFOHEADER)+dwpalettesize,(BITMAPINFO*)lpbi,   DIB_RGB_COLORS);    //恢复调色板     
    if   (holdpal)   
    {   
    SelectPalette(hdc,   (HPALETTE)holdpal,   true);   
    RealizePalette(hdc);   
    ::ReleaseDC(NULL,   hdc);   
    }    //创建位图文件     
    fh   =   CreateFile(lpfilename,   GENERIC_WRITE,   0,   NULL,   
    CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL|   
    FILE_FLAG_SEQUENTIAL_SCAN,   NULL);   
    if   (fh   ==   INVALID_HANDLE_VALUE)   
    return;    //   设置位图文件头   
    bmfhdr.bfType   =   0x4d42;   //   "bm"   
    dwdibsize   =   sizeof(BITMAPFILEHEADER)   +   sizeof(BITMAPINFOHEADER)+     
    dwpalettesize   +   dwbmbitssize;     
    bmfhdr.bfSize   =   dwdibsize;   
    bmfhdr.bfReserved1   =   0;   
    bmfhdr.bfReserved2   =   0;   
    bmfhdr.bfOffBits   =   (DWORD)sizeof(BITMAPFILEHEADER)   +     
    (DWORD)sizeof(BITMAPINFOHEADER)+   dwpalettesize;    //   写入位图文件头   
    WriteFile(fh,   (LPSTR)&bmfhdr,   sizeof(BITMAPFILEHEADER),   &dwwritten,   NULL);    //   写入位图文件其余内容   
    WriteFile(fh,   (LPSTR)lpbi,   dwdibsize,   &dwwritten,   NULL);   
    //清除     
    GlobalUnlock(hdib);   
    GlobalFree(hdib);   
    CloseHandle(fh);   }   第一个参数就是要保存的BMP句柄,就是5楼最后SetDIBits中的那个hbmp,第二个参数就是保存图片的位置
      

  6.   

    Gray=0.299R+0.587G+0.114B;
    取RGB后再套用这个公式
      

  7.   

    如果不限制代码规模的话可以使用cximage或者opencv图像库,有现成的代码进行转换