如何用图像来显示一个灰度值矩阵?

Jansonlee 2002-03-30 09:18:27
各位大虾:
已经取出了一幅灰度图像的灰度值(100*100矩阵,255),如何将其重新显示为一幅灰度图像?谢了!
...全文
1847 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hchile 2002-04-03
  • 打赏
  • 举报
回复
int gray[100][100];//灰度矩阵
设为
byte gray[100][100];//灰度矩阵
不更好吗?
hdaq 2002-04-03
  • 打赏
  • 举报
回复
jansonlee(刽子手)
Sorry 更正一下上次的代码:

newbmp->Palette = Image1->Picture->Bitmap->Palette;
改为:
newbmp->Palette = CopyPalette(Image1->Picture->Bitmap->Palette);
Cbfan 2002-04-02
  • 打赏
  • 举报
回复
唔?怎么没反应??
Cbfan 2002-04-02
  • 打赏
  • 举报
回复
是呀。VCL默认都是16色的。
hdaq 2002-04-02
  • 打赏
  • 举报
回复
cbfan
BCB中封装的TICON好像不太好用,这你从BCB自带的Image Editor就可以看出来,实际上ExtractIcon提取图标已经把图标中的256Icon提出来了,只不过是在存盘时以16色保存的,所以自己用AP编了,具体参考APi关于Icon的函数了,我也没用过,有什么再进展告诉你
kingcaiyao 2002-04-01
  • 打赏
  • 举报
回复
其实,你可以制作一幅位图,位图的数据结构也很简单,一个BITMAPINFOHEADER,BITMAPFILEHEADER。你用三个字节来表示一个点,那么根着下来你直接写数据就可以了。在C++ BUILDER中你可以用TFileStream来写。
Cbfan 2002-04-01
  • 打赏
  • 举报
回复
借宝地一用,嘿嘿,不好意思~~~

请问hdaq(一生何求),看来你对图形很有研究,能不能帮我看看,会给分的。

从.exe文件中用ExtractIcon提取图标,为什么只能提取16色的????(内附源码)
http://www.csdn.net/expert/topic/532/532964.xml?temp=.8520471
Jansonlee 2002-04-01
  • 打赏
  • 举报
回复
一生何求、冰冰凉:
先谢过了。抱歉偶没有说清楚,待处理的是8位黑白图像。 灰度值矩阵中存储的只是单一的0-255的灰度(从一幅黑白图像中读取,并无R,G,B分量)。
我以前用ScanLine取出一整列的点,然后:
Byte *ptr;
ptr=static_cast<Byte*>(bitmap1->ScanLine[j]);
* ptr[i]=gray[i][j];
(省去若干循环语句)
但就在*语句出现问题,gray数组中存储的是整型(0-255),但ptr中是以二进制数存储的,无法进行转换。
二位有无他法?谢过!
hdaq 2002-04-01
  • 打赏
  • 举报
回复
jansonlee(刽子手)
如果您要把一个矩阵赋值给8位灰度图,那么首先你要先把那个8位灰度图的调色板(Palette)搞定,最简单的方法就是你先要有一个8位的灰度图的调色板。如下
放一个TImage,设计时或运行时在Image1中调入一幅8位灰度图,(调入8位灰度图既得其调色板,否则则要自己创建8位灰度的Palette)。8位的代码如下

Byte *NewScanLine;//行扫描
int gray[100][100];//灰度矩阵
for(int i = 0 ; i<100;i++)
{
for(int j = 0 ;j<100;j++) gray[i][j] = i+ j;//模拟值
}

Graphics::TBitmap *newbmp=new Graphics::TBitmap();
newbmp->Width = 100;
newbmp->Height = 100;
newbmp->PixelFormat = pf8bit;//8位位图
newbmp->Palette = Image1->Picture->Bitmap->Palette;//一定要保证Image1调入的是8位灰度图,则Image1中的Palette为8位灰度调色板

for(int i=0;i<100;i++) //height
{
NewScanLine = static_cast<Byte*>(newbmp->ScanLine[i]);
for(int j=0;j<100;j++)//width
{
NewScanLine[j] = (Byte)gray[i][j];
//此处写成NewScanLine[j] = gray[i][j];也是一样的效果
}
}
Image1->Picture->Bitmap->Assign(newbmp);
Image1->Refresh();
delete newbmp;

以上程序在我的计算机上运行正常,灰度图非常连续。
顺便提一下,Windows处理8位(以下)的位图均使用调色板映射颜色,所以一定要注意要先定义好位图的调色板。而对于16位或24位或32位的图象,就不是用调色板映射颜色了。如果你没有8位的灰度图,用BCB自带的绘图搞一个就是了。
当然你也可以用自己用API创建Palette了。不过我觉的比较麻烦一点,我也很少用.自由偷懒了^-^。
iec 2002-03-31
  • 打赏
  • 举报
回复
这样的:
如果取BMP的RED GREEN BLUE三中颜色的灰度图象值:如下
int pixelRed[100][100];
int pixelGreen[100][100];
int pixelBlue[100][100
Graphics::TBitmap* bmp1;
Graphics::TBitmap* bmp;
bmp1 = new Graphics::TBitmap;
bmp = new Graphics::TBitmap;
bmp->LoadFromFile("..\\name.bmp");
for(int i=0;i<bmp->Width;i++)
{
for(int j=0;j<bmp->Height;j++)
{
pixelRed[i][j]=(bmp->Canvas->Pixels[i][j])&0xff;
pixelGreen[i][j]=(bmp->Canvas->Pixels[i][j])&0xff00;
pixelGreen[i][j]=pixelBlue[i][j]>>8;
pixelBlue[i][j]=(bmp->Canvas->Pixels[i][j])&0xff0000;
pixelBlue[i][j]=pixelBlue[i][j]>>16;}
}
如果写灰度值到image :
for(int i=0;i<bmp->Width;i++)
{
for(int j=0;j<bmp->Height;j++)
{

bmp1->Canvas->Pixels[i][j]= RGB(pixelRed[i][j],pixelGreen[i][j],pixelBlue[i][j]);
}

}
Image1->Canvas->Draw(0, 0, bmp1);
Refresh();
iec 2002-03-31
  • 打赏
  • 举报
回复
这样的:
如果取BMP的RED GREEN BLUE三中颜色的灰度图象值:如下
int pixelRed[100][100];
int pixelGreen[100][100];
int pixelBlue[100][100
Graphics::TBitmap* bmp1;
Graphics::TBitmap* bmp;
bmp1 = new Graphics::TBitmap;
bmp = new Graphics::TBitmap;
bmp->LoadFromFile("..\\name.bmp");
for(int i=0;i<bmp->Width;i++)
{
for(int j=0;j<bmp->Height;j++)
{
pixelRed[i][j]=(bmp->Canvas->Pixels[i][j])&0xff;
pixelGreen[i][j]=(bmp->Canvas->Pixels[i][j])&0xff00;
pixelGreen[i][j]=pixelBlue[i][j]>>8;
pixelBlue[i][j]=(bmp->Canvas->Pixels[i][j])&0xff0000;
pixelBlue[i][j]=pixelBlue[i][j]>>16;}
}
如果写灰度值到image :
for(int i=0;i<bmp->Width;i++)
{
for(int j=0;j<bmp->Height;j++)
{

bmp1->Canvas->Pixels[i][j]= RGB(pixelRed[i][j],pixelGreen[i][j],pixelBlue[i][j]);
}

}
Image1->Canvas->Draw(0, 0, bmp1);
Refresh();
Jansonlee 2002-03-31
  • 打赏
  • 举报
回复
一生何求:
是否存在数据类型不匹配的问题?在gray数组中存储的是整型(0-255),但在ScanLine中存储的是二进制数据吧。编译没问题,但运行时出错。
hdaq 2002-03-31
  • 打赏
  • 举报
回复
jansonlee(刽子手)
ScanLine 的作用是一次把一整行的像素点扫描下来,对于24位图象它是按R、G、B一个一个按字节存储的,所以你可以在定义gray数组为整型,但一定要保证其范围(0-255),也可以把gray数组定义为Byte类型,我的机器运行非常正常,要不你把gray换成Byte型,再试一试。并把你的错误写出来。
iec(冰冰凉)说的也是一个可行的方法,但一个一个像素赋值将影响运行速度。
hdaq 2002-03-30
  • 打赏
  • 举报
回复
放一个TImage控件Image1
假设你的矩阵是 int gray[100][100];
则:
Byte* ScanLine;
Image1->Picture->Bitmap->Width = 100;
Image1->Picture->Bitmap->Height = 100;
Image1->Picture->Bitmap->PixelFormat = pf24bit;
for(int i = 0; i<Image1->Picture->Bitmap->Height ; i++)
{
ScanLine = static_cast<Byte*>(Image1->Picture->Bitmap->ScanLine[i]);
for(int j = 0 ; j<Image1->Picture->Bitmap->Width; j++)
{
ScanLine[j*3 + 0] = gray[i][j];
ScanLine[j*3 + 1] = gray[i][j];
ScanLine[j*3 + 2] = gray[i][j];
}
}
Image1->Refresh();
Jansonlee 2002-03-30
  • 打赏
  • 举报
回复
期待回答,可以再加分

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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