在Delphi中如何使用颜色

lzc 2000-11-19 05:35:00
我想做一个图形内存影像文件(即用BC中getimage生成的格式)和bmp文件互转程序。本来想利用TImage的图形点阵属性(Image1.Canvas.Pixels)直接转换而不用理会bmp的内部格式,结果生成的bmp图象轮廓是对的,颜色却不对,不知为何?注:影像文件是640x480的16位颜色格式,Windows用640*480的增强色(16位)
主要代码如下:
var
f: File of word;
x,y,ix,iy,color: word;
begin
AssignFile(f,'demo.img');
Reset(f);
Read(f,x,ix,y,ix); // ix=0;
Image1.Picture.Graphic.Width:=x;
Image1.Picture.Graphic.Height:=y;
for iy:=y-1 DownTo 0 do
begin
for ix:=0 to x-1 do
begin
Read(f,color);
Image1.Canvas.Pixels[ix,iy]:=color;
end;
end;
CloseFile(f);
Image1.Picture.SaveToFile('demo.bmp')
end;
...全文
266 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzc 2000-11-26
  • 打赏
  • 举报
回复
可能关键在这里“使用RGB宏查出对应当前DC的颜色值”,具体如何对应?请给简单的代码让我测试一下
数字蛋糕 2000-11-26
  • 打赏
  • 举报
回复
16位的图像照说有可能是索引方式(因为RGB一般是24位),如果是这样的话,则应该在使用GetImage时把当时的调色板记录下来,具体请参看DOS下的GetPallete函数(好像是这个吧,太久没用了)。将调色板记录好后,利用读出的文件数据查出对应颜色的RGB值,然后使用RGB宏查出对应当前DC的颜色值,再将这个值赋给Pixels属性。

如果GetImage使用的是RGB的不等长结构,建议先搞清楚它的RGB各个位的分配情况(有时候G通道会比RB占用的位数多,因为人眼对绿色比较敏感),然后将其分别读出来。按照比例换算到一个字节的长度后使用Windows API的RGB宏来写进TBitmap中再存盘,这样就能获得正确的结论。

这个问题不算难,但是比较烦,比较烦......
lzc 2000-11-26
  • 打赏
  • 举报
回复
很难吗?
lzc 2000-11-25
  • 打赏
  • 举报
回复
有谁能帮助我?
lzc 2000-11-22
  • 打赏
  • 举报
回复
如何正确设置调色板?在DOS和WINDOWS下都是640*480*65536色,默认调色板不一样吗?
数字蛋糕 2000-11-19
  • 打赏
  • 举报
回复
对于16位的图像,有可能是采用调色板和索引的方式。如果调色板没有设置正确的话,自然会出现上述的问题。
不过(我只用过DOS下BC的getimage),不知道GetImage的格式。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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