好的,我刚刚解决了这个问题。如果有人需要:
Bitmap ^ConvertTo8bpp() {
Bitmap ^originalImage = gcnew Bitmap(pictureBox1->Image->Width, pictureBox1->Image->Height, PixelFormat::Format8bppIndexed);
originalImage = dynamic_cast<Bitmap^>(pictureBox1->Image);
Bitmap ^newImage = gcnew Bitmap(pictureBox1->Image->Width, pictureBox1->Image->Height, PixelFormat::Format8bppIndexed);
Rectangle rec = Rectangle(0, 0, newImage->Width, newImage->Height);
BitmapData^ originalData = originalImage->LockBits(rec, System::Drawing::Imaging::ImageLockMode::ReadWrite, PixelFormat::Format24bppRgb);
BitmapData^ newData = newImage->LockBits(rec, System::Drawing::Imaging::ImageLockMode::ReadWrite, PixelFormat::Format24bppRgb);
int originalStride = originalData->Stride;
System::IntPtr originalScan0 = originalData->Scan0;
int newStride = newData->Stride;
System::IntPtr newScan0 = newData->Scan0;
unsigned char* pOriginal = (unsigned char*)(void*)originalScan0;
unsigned char* pNew = (unsigned char*)(void*)newScan0;
int nOffset = originalStride - newImage->Width *3;
unsigned char red, green, blue;
for(int y=0; y<newImage->Height; ++y) {
for(int x=0; x<newImage->Width; ++x) {
blue = pOriginal[0];
green = pOriginal[1];
red = pOriginal[2];
unsigned char newPixel = System::Convert::ToByte((red+green+blue) / 3);
pNew[0] = newPixel;
pNew[1] = newPixel;
pNew[2] = newPixel;
pOriginal += 3;
pNew += 3;
}
pOriginal += nOffset;
pNew += nOffset;
}
originalImage->UnlockBits(originalData);
newImage->UnlockBits(newData);
return newImage;
}