(求助)如何用CB来做图像处理。
由于需要做视频传输,需要增强图像,传输已经做好了,用套接字,传灰度图像,每秒25侦。现在不知道如何增强图像。
虽然CANVAS的pixel可以访问每个像素,但是速度太慢,因为灰度图像时512*512,用for循环那得需要512*512次吧?
想用scanline,但是按照help的例子,显示一幅图像的时候只能显示一半。谁有好的思路望赐教。
为什么CB的资料这么少啊,虽然软件不错可是比起VC的资料来太少了,我是个初学者。
[解决办法]
CB自带的例子是如果把pBitmap显示出来,和把像素放到ptr里;
//注释掉那部分就不会有问题了void __fastcall TForm1::Button1Click(TObject *Sender){ Graphics::TBitmap *pBitmap = new Graphics::TBitmap(); //This example shows drawing directly to the Bitmap Byte *ptr; try { pBitmap->LoadFromFile("C:\\bb.bmp"); /* for (int y = 0; y < pBitmap->Height; y++) { ptr = (Byte *)pBitmap->ScanLine[y]; for (int x = 0; x < pBitmap->Width; x++) ptr[x] = (Byte)y; } */ Canvas->Draw(10,10,pBitmap); } catch (...) { ShowMessage("Could not load or alter bitmap"); } delete pBitmap;}
[解决办法]
无需多说,上代码解决问题.
// 位图图像转灰度void __fastcall CrnBitmap2GrayScale(Graphics::TBitmap *bmp){ BYTE btGray; bmp->PixelFormat = pf24bit; for(int y=0; y<bmp->Height; y++) { BYTE *pLine = (BYTE *)bmp->ScanLine[y]; for(int x=0; x<bmp->Width; x++) { // 平均值灰度 // btGray = (pLine[0] + pLine[1] + pLine[2]) / 3; // 最大值 // btGray = Max(pLine[2], Max(pLine[0], pLine[1])); // YUV值 btGray = 0.30 * pLine[0] + 0.59 * pLine[1] + 0.11 * pLine[2]; // 63 63 72 75 6E 2E 63 6F 6D pLine[0] = btGray; pLine[1] = btGray; pLine[2] = btGray; pLine += 3; } }}
[解决办法]