如何转换啊?把一个指定的图片框 转换成黑白的 就是通过获得一个图片框的句柄并且让他变成黑白保存到另外一个图片框或者保存到指定文件都可以!并且有需要还可以把黑白转成彩色!我想通过函数来转换而不是直接在程序里面转换 也就是把转换图片色彩的函数写到模块里!
高分

解决方案 »

  1.   

    VCKBase上有一个演示代码,可以下载来看看。
    http://www.vckbase.com/code/viewcode.asp?id=1686
      

  2.   

    在dll里写个函数就行了你说的这种操作对于学过数字图像处理的很容易.主要操作就是求3个数的平均数.
      

  3.   

    对了 你要灰度图还是黑白2色图啊?灰度的话就
    fcolor = 0.299R+0.587G+0.114B 
    rgb=(fcolor,fcolor,fcolor)如果是2色黑白图的话就可以取一个阀值来做,可以直接用127来分想转换回去的话,可以直接把原来的保存起来
    原本以为会的 突然发现不会。 尴尬
      

  4.   

    楼主是要灰度图吧.RGB改成YUV格式, 然后根据亮度调灰度,去掉颜色即可.
      

  5.   

    // 另存为位图文件
    BOOL SaveToBmpFile( HBITMAP hBitmap, CString strFileName, int nFileType)
    {
    HDC            hDC;        // 设备描述表
    HDC            hMemDC;            // 内存设备环境
    HBRUSH         hBrush, hBrushOld; // 画刷句柄
    HBITMAP        hBmpOld;    // 位图句柄
    int            iBits;      // 当前显示分辨率下每个像素所占字节数
    WORD           wBitCount;  // 位图中每个像素所占字节数
    DWORD          dwPaletteSize = 0,// 定义调色板大小
                   dwBmBitsSize,     // 位图中像素字节大小
                   dwDIBSize,  // 位图文件大小
                   dwWritten;  // 写入文件字节数
    BITMAP         Bitmap;     // 位图属性结构
    BITMAPFILEHEADER   bmfh;   // 位图文件头结构
    BITMAPINFOHEADER   bmih;   // 位图信息头结构
    LPBITMAPINFOHEADER lpbi;   // 指向位图信息头结构
    HANDLE         fh,         // 文件句柄
                   hDib,       // 分配内存句柄
                   hPal,       // 调色板句柄
                   hOldPal = NULL; // 调色板句柄

    // 计算位图文件每个像素所占字节数
    hDC = CreateDC("DISPLAY", NULL, NULL, NULL);
    iBits = GetDeviceCaps(hDC, BITSPIXEL) // Number of adjacent color bits for each pixel.
          * GetDeviceCaps(hDC, PLANES);   // Number of color planes.
    DeleteDC( hDC );
    switch(nFileType)
    {
    case 1: iBits = 1; break; // 单色位图(*.bmp;*.dib)
    case 2: iBits = 4; break; // 16 色位图(*.bmp;*.dib)
    case 3: iBits = 8; break; // 256 色位图(*.bmp;*.dib)
    }
    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;

    // 计算调色板大小
    if (wBitCount <= 8)
    dwPaletteSize = (1 << wBitCount) * sizeof(RGBQUAD);

    // 设置位图信息头结构
    GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
    bmih.biSize          = sizeof(BITMAPINFOHEADER);
    bmih.biWidth         = Bitmap.bmWidth;
    bmih.biHeight        = Bitmap.bmHeight;
    bmih.biPlanes        = 1;
    bmih.biBitCount      = wBitCount;
    bmih.biCompression   = BI_RGB;
    bmih.biSizeImage     = 0;
    bmih.biXPelsPerMeter = 0;
    bmih.biYPelsPerMeter = 0;
    bmih.biClrUsed       = 0;
    bmih.biClrImportant  = 0;

    dwBmBitsSize = ((Bitmap.bmWidth * wBitCount+31)/32)
                * 4 *Bitmap.bmHeight;

    //////////////////////////////////////////////////////////
    // 加
    // 创建一显示内存(内存设备环境)
    hDC = ::GetDC(NULL);
    hMemDC = ::CreateCompatibleDC( hDC ); // 或( NULL )

    // 将位图调入该内存中
    hBmpOld = (HBITMAP)SelectObject(hMemDC, hBitmap);

    // 初始化为白色背景 ////////////////////////////
    // 将白色画刷选入内存设备环境
    hBrush = (HBRUSH)GetStockObject( WHITE_BRUSH );
    hBrushOld = (HBRUSH)SelectObject( hMemDC, hBrush );
    // 将设备环境的背景刷为白色
    PatBlt( hMemDC, 0, 0, Bitmap.bmWidth, Bitmap.bmHeight, PATCOPY ); // 用自定义字体输出全部字符文本
    SetTextColor( hMemDC, RGB(0,0,0) );
    SetBkColor( hMemDC, RGB(255,255,255) );

    // 输出GB2312字符图形
    TextOut(hMemDC, 0, 100, "你好", strlen("你好")); // 还可以加入文字
    // 加
    //////////////////////////////////////////////////////////

    // 为位图内容分配内存
    hDib = GlobalAlloc(GHND, dwBmBitsSize +
    dwPaletteSize + sizeof(BITMAPINFOHEADER));
    lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
    *lpbi = bmih;

    // 处理调色板
    hPal = GetStockObject(DEFAULT_PALETTE);
    if (hPal) {
    hDC  = GetDC(NULL);
    hOldPal = SelectPalette(hDC, (HPALETTE)hPal, FALSE);
    RealizePalette(hDC);
    }
    // 获取该调色板下新的像素值
    GetDIBits(hDC, hBitmap, 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(strFileName, GENERIC_WRITE,
    0, NULL, CREATE_ALWAYS,
    FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
    if (fh == INVALID_HANDLE_VALUE) return FALSE;

    // 设置位图文件头
    dwDIBSize = sizeof(BITMAPFILEHEADER)
    + sizeof(BITMAPINFOHEADER)
    + dwPaletteSize + dwBmBitsSize;
    bmfh.bfType = 0x4D42; // "BM": 0x42 = 'B', 0x4d = 'M'
    bmfh.bfSize = dwDIBSize;
    bmfh.bfReserved1 = 0;
    bmfh.bfReserved2 = 0;
    bmfh.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)
    + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;

    // 写入位图文件头
    WriteFile(fh, (LPSTR)&bmfh, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
    // 写入位图文件其余内容
    WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);

    // 清除
    GlobalUnlock(hDib);
    GlobalFree(hDib);
    CloseHandle(fh);

    SelectObject( hMemDC, hBrushOld );
    SelectObject( hMemDC, hBmpOld ); // 恢复原位图
    DeleteDC( hMemDC );              // 删除内存设备环境
    DeleteDC( hDC );
    return 0;
    }
      

  6.   

    给你一个类,使用这个类的静态函数就可以产生。譬如常规图片是CBitmap m_pBmNormal;
    只需CBitmap* m_pGray = CGrapyBitmap::DoGray((HBITMAP)m_BmNormal->m_hObject);这样,一个图片两个效果。
    绘制彩色图片时使用m_pBmNormal,灰色时m_pGray。