如何得到TIMAGE的BITMAP,PALLETE?

MinChen 2002-06-20 07:57:57
我用BCB在做一个图形处理的程序,要对图形进行灰度化,取边缘,匹配等工作。在使用TIMAGE时不能对TIMAGE中的图像的PALETTE进行操作,请问如何操作?对图形进行色彩直方图、颜色转换时用TIMAGE的PIXELS、SCANLINE进行操作时,效率太低,想得到TIMAGE的BITMAP数据,直接对这些数据进行操作,但总是不能正确得到BITMAP。各位高手帮个忙,解决以下两个问题:

1、得到TIMAGE中的Bitmap的调色板,并写回TIMAGE,发挥效用。
2、取得TIMAGE中的Bitmap的BITMAP结构(WINDOWS的基本结构),对之进行操作,并将效果正确显示。

如有源码更佳~~~~

谢谢。
...全文
47 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
CCLIS 2002-06-24
  • 打赏
  • 举报
回复
忘了说一声,在转换前,将24位的TEST。BMP转换成灰试的图片
CCLIS 2002-06-24
  • 打赏
  • 举报
回复
int *MemByte;

Image1->Picture->Bitmap->LoadFromFile("Test.bmp");

int nWid = Image1->Picture->Bitmap->Width;
int nHei = Image1->Picture->Bitmap->Height;
MemByte = new int[(nWid)*(nHei)];

for(int y = 0;y < nHei;y++)
{
Byte *ptr = (Byte *)Image1->Picture->Bitmap->ScanLine[y];
for(int x = 0;x < nWid;x++)
{
int nGray = ptr[x*3]*0.114 + ptr[x*3+1]*0.587 + ptr[x*3+2]*0.299;
if(nGray < 127)
nGray = 192;
else
nGray = 255;
ptr[x*3] = ptr[x*3+1] = ptr[x*3+2] = nGray;
MemByte[nWid*y+x] = nGray;
}
}

// do LUNGUO
int nSX,nSY;
bool found = false;
for(int x = 0; (x < nWid) && (!found); x++)
{
for(int y = 0; y < nHei; y++)
{
if(MemByte[nWid*y+x] < 255)
{
Image1->Picture->Bitmap->Canvas->Pixels[x][y] = (TColor)RGB(0,0,0);
found = true;
nSX = x;
nSY = y;
break;
}
}
}

int nCX,nCY;
bool End = false;

int Dir[8][2] = {
{0,-1},
{1,-1},
{1,0},
{1,1},
{0,1},
{-1,1},
{-1,0},
{-1,-1}};

int Dirx = 0;
nCX = nSX;
nCY = nSY;
while(!End)
{
int nNX,nNY;
int alldir = 0;

found = false;
while(!found)
{
nNX = nCX+Dir[Dirx][0];
nNY = nCY+Dir[Dirx][1];
alldir ++;

if(MemByte[nNY*nWid+nNX] < 255)
{
found = true;
nCX = nNX;
nCY = nNY;
if((nCX == nSX) && (nCY == nSY))
End = true;

Image1->Picture->Bitmap->Canvas->Pixels[nCX][nCY] = (TColor)RGB(255,0,0);

Dirx --;
if(Dirx < 0) Dirx = 7;
Dirx --;
if(Dirx < 0) Dirx = 7;
}
else
{
Dirx ++;
if(Dirx == 8) Dirx = 0;
}
}
}
delete MemByte;


你看看这段程序,大概对你有帮助。

ScanLine效率不低!

这一段在800*600的图片上找边缘,用时100ms以内。
Siney 2002-06-23
  • 打赏
  • 举报
回复
scanline的效率不低啊,我对1024x768的图象进行灰度,不到1s,这个效率应该可以忍受啊
书生 2002-06-23
  • 打赏
  • 举报
回复
Mark@_@
vikingmao 2002-06-21
  • 打赏
  • 举报
回复
scanline的效率低?不是吧,好像都是指针操作了
不过你要读取信息,好像help里边的windows sdk里边就有关于调色板的相关函数帮助了吧,delphi里边有,bcb也应该有的吧
jishiping 2002-06-20
  • 打赏
  • 举报
回复
mark

662

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧