要对像素进行处理,怎么取得一个bmp的第i行j列的像素

解决方案 »

  1.   

    int GetDIBits(
      HDC hdc,           // handle to device context
      HBITMAP hbmp,      // handle to bitmap
      UINT uStartScan,   // first scan line to set in destination bitmap
      UINT cScanLines,   // number of scan lines to copy
      LPVOID lpvBits,    // address of array for bitmap bits
      LPBITMAPINFO lpbi, // address of structure with bitmap data
      UINT uUsage        // RGB or palette index
    );
      

  2.   

    那么怎么取得这一像素的R,G,B值256色图和24位图
      

  3.   

    *   int x - 象素在X轴的坐标
     *   int y - 象素在Y轴的坐标
     *
     * \返回值:
     *   int - 返回象素在图象数据块中的真实地址
     *
     * \说明:
     *   该函数得到坐标为(x,y)的象素点的真实地址。由于DIB结构中对图象数据排列的
     *   方式为从下到上,从左到右的,所以需要进行转换。
     *
     ************************************************************************
     */
    LONG CDib::GetPixelOffset(int  x, int y)
    {
    CSize sizeSaveDim;
    sizeSaveDim = GetDibSaveDim(); LONG lOffset = (LONG) (sizeSaveDim.cy - y - 1) * sizeSaveDim.cx +
    x  / (8 / m_lpBMIH->biBitCount);
    return lOffset;
    }
    CSize CDib::GetDibSaveDim()
    {
    CSize sizeSaveDim;
    sizeSaveDim.cx = ( m_lpBMIH->biWidth * m_lpBMIH->biBitCount + 31)/32 * 4;
    sizeSaveDim.cy = m_lpBMIH->biHeight; 
    return sizeSaveDim;}
    其中 m_lpBMIH; 是 DIB信息头指针
      

  4.   

    if(灰度图像)
         LineBytes=(DIBWidth+3)&~3;
         (i,j)的象素值为*(lpPixels+(DIBHeight-1-j)*LineBytes+i)
    if(真彩色图像)
         LineBytes=(DIBWidth*3+3)&~3;
        (i,j)的象素值为
                 b:*(lpPixels+(DIBHeight-1-j)*LineBytes+i)
                 g:*(lpPixels+(DIBHeight-1-j)*LineBytes+i+1)
                 r:*(lpPixels+(DIBHeight-1-j)*LineBytes+i+2)