如何使用Format8bppRgb从PictureBox获取图像? 因为这个函数返回Format24bppRgb:
Bitmap ^getBitmap8() {
Bitmap ^tmpBmp = gcnew Bitmap(pictureBox1->Image->Width, pictureBox1->Image->Height, System::Drawing::Imaging::PixelFormat::Format8bppIndexed);
tmpBmp = dynamic_cast<Bitmap^>(pictureBox1->Image); <- this one change PixelFormat from 8 to 24bpp
Rectangle rec = Rectangle(0,0,tmpBmp->Width, tmpBmp->Height);
tmpBmp->Clone(rec, System::Drawing::Imaging::PixelFormat::Format8bppIndexed); <- this one doesn't work
return tmpBmp;
}
帮助,我需要使用Format 8bppRGB将Bitmap返回到Bmp以使用aFormge过滤器。
答案 0 :(得分:0)
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;
}