彩色图转换成黑白的算法解决方法

彩色图转换成黑白的算法
有哪位知道如何转换呢?谢谢了!

希望调用格式如下:

//pBitmap   是已经获得的图片
BOOL   ConvertToBW(Bitmap   *pBitmap)
{      

}      

看了很多代码都不懂。再次谢谢!

------解决方案--------------------
显示灰度图象:将RGB颜色,三个值取平均,再显示看看(有个灰度计算公式的,忘记了。)

要是图象文件转换,研究下:bw file formats


name
bw - black and white image file format and utilities

format
a bw file contains sequences of pixels. each pixel is
stored as one unsigned char, and thus ranges in intensity
from 0 (black) to 255 (white). the first pixel in a bw file
is the lower left corner of the image. the pixels proceed
from left-to-right across each scanline, with scanlines
being written from the bottom to the top of the image.

by convention, bw images are usually square, and thus their
dimensions can be determined by the file size. if this is
not the case, often only the file width need be known by a
program reading the file. history has left us with two
"standard " sizes, 512x512 and the "hires " 1024x1024. a com-
mon practice for other file sizes is to include the file
width in the filename.

at some time in the future bw files will probably get self-
typing headers so that parameters such as their size can be
automatically determined by programs.

utilities
bw-fb display a .bw format image on a framebuffer.
fb-bw produce a .bw file from a framebuffer image.
bw-pix convert a .bw file to a color .pix file.
pix-bw convert a color .pix file to a .bw file.
bwstat gives statistics concerning a .bw file.
bwhist displays a histogram on a framebuffer.
bwmod a filter to shift and scale pixel intensities.
bwdiff yields the difference between two .bw files.
bwrect extracts an arbitrary rectangle from a .bw file.
bwcrop maps any quadrilateral in a .bw file into any rectan-
gle.
bwrot rotates, reverses, or inverts a .bw file.
bwscale scales a .bw file larger or smaller.
bwfilter a variety of 3x3 kernel filters for .bw images.
bw3-pix merges three .bw files into one .pix file.
pix-bw3 separates .pix file rgb colors into three .bw files.

files
file.bw

see also
brlcad(1), pix(5), and above named programs.

------解决方案--------------------
是转成灰度图像吧
void CPalmDoc::OnGray()
{
// TODO: Add your command handler code here

int i,j;
unsigned char *lpSrc,*lpDst;//一个指向源、目的像素的移动指针

//对源图像进行操作
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)m_hDIB);
int cxDIB = (int) ::DIBWidth(lpDIB);
int cyDIB = (int) ::DIBHeight(lpDIB);
LPSTR lpDIBBits=::FindDIBBits (lpDIB); //找到源图像中图像数据区起始位置
long lLineBytesSrc = WIDTHBYTES(cxDIB * 8 * 3);// 计算源24位真彩图像每行的字节数

int numColors=(int) ::DIBNumColors((char *)lpDIB);
if (numColors!=0) //如果numColors是0,则表示目前图像为24位真彩图
{
::GlobalUnlock((HGLOBAL) m_hDIB);
return;
}

//新创建一个8位(256级灰度)的DIB句柄
HDIB grayhDIB=NewDIB(cxDIB, cyDIB,8);
LPSTR glpDIB=(LPSTR)::GlobalLock((HGLOBAL)grayhDIB);
LPSTR glpDIBBits=::FindDIBBits (glpDIB);
long lLineBytesDst = WIDTHBYTES(cxDIB * 8);// 计算目标8位灰度图像每行的字节数
// 每行
for(i = 0; i < cyDIB; i++)
{
//每列
for(j = 0; j < cxDIB; j++)
{
// 指向DIB第i行,第j个象素的指针(这里的行为从上到下的)
lpSrc = (unsigned char*)lpDIBBits + lLineBytesSrc * (cyDIB - 1 - i) + j*3;
lpDst = (unsigned char*)glpDIBBits + lLineBytesDst * (cyDIB - 1 - i) + j;
*lpDst=(*lpSrc)/3+(*(lpSrc+1))/3+(*(lpSrc+2))/3;