24bitbmp问题 ( 积分: 50 )

  • 主题发起人 主题发起人 funxu
  • 开始时间 开始时间
F

funxu

Unregistered / Unconfirmed
GUEST, unregistred user!
今天刚刚自己搞定24bitbmp和16bitbmp的未压缩读取却发现24bitbmp图像画出来的红色变成了绿色,大概思路是先读文件头之后在数据区域按照图像宽循环读取r,g,b各一字节,读出后用tcolor(rgb(r,g,b))在image上画点,并且也涵盖了补足的部分,图像中并不是所有的红色都变成了绿色,只有大背景颜色不对,其他的部分还说得过去,谁能帮我分析一下
 
今天刚刚自己搞定24bitbmp和16bitbmp的未压缩读取却发现24bitbmp图像画出来的红色变成了绿色,大概思路是先读文件头之后在数据区域按照图像宽循环读取r,g,b各一字节,读出后用tcolor(rgb(r,g,b))在image上画点,并且也涵盖了补足的部分,图像中并不是所有的红色都变成了绿色,只有大背景颜色不对,其他的部分还说得过去,谁能帮我分析一下
 
系统颜色是多少的,是否24Bit的!
 
代码贴上来!
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
procedure bmp24nocom(f:integer);
var
i,x,y:integer;
r,g,b:byte;
begin
//bmp文件偏移量是54,但是此处不能正确识别
for y:=form1.image1.Height downto 1 do//循环画点
begin
application.ProcessMessages;
for x:=1 to form1.image1.Width do
begin
fileread(f,r,1);//偏移量
fileread(f,g,1);//偏移量
fileread(f,b,1);//偏移量
form1.image1.Canvas.Pixels[x,y]:=tcolor(rgb(r,g,b));
end;
for i:=0 to (form1.image1.Width mod 4)-1 do
begin
fileread(f,r,1);//补足填充
end;
end;

end;

procedure TForm1.Button1Click(Sender: TObject);
var
BF:BitmapFileHeader;
BI:BitmapInfoHeader;
RG:RgbQuad;//16,24,32位位图不使用彩色表
PA:PaletTeentry;//调色板
r,g,b:byte;
coln:array[0..3] of byte;
i,f,x,y:integer;
bmptype:string;
comtrue,colorexist:boolean;
begin
Image1.Picture:=nil;
f:=fileopen('d:/1.bmp',fmopenread);
//end;
fileseek(f,0,0);
r:=sizeof(BitmapFileHeader);
fileread(f,bf,r);
r:=sizeof(BitmapInfoHeader);
fileread(f,bi,r);
r:=sizeof(PaletTeentry);
fileread(f,pa,r);
setlength(bmptype,2);
image1.Width:=bi.biWidth;
image1.Height:=bi.biHeight;
bmp24nocom(f);
fileclose(f);
showmessage('读取完毕');
end;

end.
 
把代码贴上来,却被人当咸鱼晾起来了,郁闷中
 
呵呵,帮你看了看,你没发现用上面代码生成的图片比原图片大吗?原图片大小=文件头+(文件长*宽)*3,而你生成的图片大小=文件头+(文件长*宽)* 4。

问题出在这
fileread(f,r,1);//偏移量
fileread(f,g,1);//偏移量
fileread(f,b,1);//偏移量
form1.image1.Canvas.Pixels[x,y]:=tcolor(rgb(r,g,b));

你都给3个颜色赋值了,为什么要多加一句form1.image1.Canvas.Pixels[x,y]:=tcolor(rgb(r,g,b));
 
我的bmp大小不能用文件头+(文件长*宽)*3,因为文件宽不是标准的,图像的宽不是4的倍数,所以里面有补足的点,应该是文件头+(文件高*(宽+补足点))*3
另外我对画点不太在行,读出点后我想画在image上,但是发现画上后确实有部分颜色缺失form1.image1.Canvas.Pixels[x,y]:=tcolor(rgb(r,g,b));不知道对不对
 
for i:=0 to (form1.image1.Width mod 4)-1 do不对
应该是
for i:=0 to (4-form1.image1.Width mod 4) mod 4 do

此外,坐标好象是从0开始的
 
按照cst_zf通知的方法改过了,从零开始读到宽度-1
for i:=0 to ((4-form1.image1.Width mod 4) mod 4)-1 do 也改过了
但是读出的图像还是偏色
 
RGB24 色的位图文件里,颜色排列顺序是 B->G->R;

fileread(f,b,1);//偏移量
fileread(f,g,1);//偏移量
fileread(f,r,1);//偏移量
form1.image1.Canvas.Pixels[x,y]:=tcolor(rgb(r,g,b));
 
后退
顶部