读取BMP图像!! ( 积分: 50 )

  • 主题发起人 主题发起人 soulhuman
  • 开始时间 开始时间
S

soulhuman

Unregistered / Unconfirmed
GUEST, unregistred user!
我要将由红绿蓝3种颜色组成的BMP图(128*128)的每个像素的颜色读出来,并将结果转换成16进制
注:每个象素的颜色可以是单颜色也可以是混合颜色。
每个象素占用2个字节,即16bit,0-4bit表示blue,5-10bit表示green,11-15bit表示red.
请问各位该怎么做??
急等!!

请将程序发到lovejuventus2000@yahoo.com.cn谢谢了各位
 
我要将由红绿蓝3种颜色组成的BMP图(128*128)的每个像素的颜色读出来,并将结果转换成16进制
注:每个象素的颜色可以是单颜色也可以是混合颜色。
每个象素占用2个字节,即16bit,0-4bit表示blue,5-10bit表示green,11-15bit表示red.
请问各位该怎么做??
急等!!

请将程序发到lovejuventus2000@yahoo.com.cn谢谢了各位
 
直接用RGB来存取

var
kl:longint;
bit:Tbitmap;
r,g,b:byte;
i,j:integer
begin
for i:=0 to bit.Width+1 do
for j:=0 to bit.height+1 do
begin
kl:=ColorToRGB(bit.Canvas.Pixels[i,j]);
r:=byte(kl);
g:=byte(kl shr 8);
b:=byte(kl shr 8);
end;
end;
 
请问存储在r,g,b,中的值作何用??
能直接将它们组成我说的16bit的2进制吗???然后再转成16进制?
 
.....r,g,b就是那个像素点的红绿蓝色值啊

我对这块也不熟。。。代码是从以前抄的
不过,kl里存的应该就是2进制的RGB值,从左到右,每8位存一种颜色值

至于怎么把8位换成4位,然后转成16进制。。。抱歉这个我不知道怎么做,看看别人的答案吧
 
哦 谢谢楼上大哥了
谁能帮帮我啊
 
var
C:TColor;
R,G,B:Byte;
x,y:integer;
r1,g1,b1,str1,str2:string;

begin
memo1.Text:='';
for x:=1 to image1.Height do
begin
str2:='';
for y:=1 to image1.Width do
begin
C:=Image1.Canvas.Pixels[x,y];
R:=GetRValue(C);
G:=GetGValue(C);
B:=GetBValue(C);
r1:=inttohex(r,1);
g1:=inttohex(g,1);
b1:=inttohex(b,1);
str1:=rightbstr(r1,2)+rightbstr(g1,2)+rightbstr(b1,2);
str2:=str2+str1+' ';
end;
memo1.Lines.Add(str2);
end;
end;
我用这种方法,但好像有丢失数据
谁能帮帮忙
 
Pixels[x,y]太慢了,用ScanLine吧
如果要分离RGB,简单的位移而已,不是很复杂吧

另外,楼主,如果真想学点东西,有了足够的提示,建议自己动手做吧,即使错了你也学到了东西,直接要代码,那你永远也学不会
 
本来用8位2进制数据存颜色。。。也就是说是24位真彩的图象,16777216种颜色
你却要改成4位。。。。也就是说改成了只有4096种颜色。。。。不损失数据才怪
 
我分别得到rgb的值,然后将3个8位的2进制+到一起
再进行移位得到一个完整的16位的2进制
C:=Image1.Canvas.Pixels[x,y];
R:=GetRValue(C); //byte
G:=GetGValue(C);
B:=GetBValue(C);

R1:=inttobin(R);
G1:=inttobin(G);
B1:=inttobin(B);
str1:=R1+G1+B1;

str2:=rightstr(str1,16);

str3:=str3+str2+' ';

但结果不正确,请问哪里的毛病
 
加到一起?? 不对吧。。。。。2进制的又不是字符串。。

比如1+1=10,而不是11啊

str2:=rightstr(str1,16);

str3:=str3+str2+' ';
这2句没看懂你要做什么。。。
 
我不是加的意思
是合并成一个长的串,不对么
 
你这句话str1:=R1+G1+B1的结果好象不是合并成一个长的串,而是2进制数字向加吧。。
 
那怎样将2个2进制串合并啊

你QQ多少 hs-kill 我加你,这样太麻烦
 
我的QQ 17948876

不过我也不会2进制串合并啊,只不过觉得你那样+起来不对。。。

如果是我,我就先转成字符串,合并完以后再转成2进制数据
 
接受答案了.
 

Similar threads

D
回复
0
查看
850
DelphiTeacher的专栏
D
D
回复
0
查看
694
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
659
import
I
后退
顶部