主题:[原创]作图模式显示16色BMP图像
看到本版区有几篇关于显示BMP文件的文章,我也来凑凑热闹,说说几句。
一是把整个图像调进内存。如果是用TP7,能用的内存是有限的,想把比较大的图像,例如640*480整幅调进内存没法简单实现。二是没校正调色板,那么就只能用缺省的颜色来显示。没有校正调色板的图像显示是无意义的。
下面程序是显示16色无压缩的BMP图像。关于如何将压缩的BMP文件转换成无压缩文件,请参阅我那篇256色BMP文件显示文章的回复。不追求显示速度,其实16色BMP文件的显示可以很简单。(^_^)
(*
16 colors non_compressed BMP file display demo.
Programmed by j.t.Chang.
*)
uses graph;
var
gd, gm : integer;
fn : string;
f : file;
Width , Height : integer;
t : array[1..2] of byte;
pal : array[0..47] of byte;
procedure Loadpalette;
var
t1,t2 : word;
k : byte;
t : array[0..3] of byte;
begin
seek(f,54);
for k := 0 to 15 do
begin
blockread(f,t,4);
pal[3*k+2] := t[0] shr 2;
pal[3*k+1] := t[1] shr 2;
pal[3*k] := t[2] shr 2;
end;
for k:=0 to 15 do
begin
asm mov ah,10h
mov al,0
mov bh,k
mov bl,k
int 10h
end;
end;
t1:=OFS(pal);
t2:=SEG(pal);
asm mov ax,1012h
mov bx,0
mov cx,16
mov dx,t1
mov es,t2
int 10h
end;
end;
procedure DrawBmp;
var x, y,i : integer;
c : array[1..1] of byte;
begin
seek(f,118);
i := (Width+7) div 8;
i := i * 4;
for y := Height - 1 downto 0 do
begin
for x:=0 to i-1 do
begin
blockread(f,c,1);
if 2*x < Width then putpixel(2*x,y,c[1] shr 4);
if 2*x+1 < Width then putpixel(2*x+1,y,c[1] and $F);
end;
end;
end;
Begin
write('Enter 16 colors Bmp filename : ');
readln(fn);
assign(f,fn);
reset(f,1);
seek(f,18);
blockread(f,t,2);
Width := 1; Height := 1;
Width := Width*t[2]*256 + t[1];
blockread(f,t,2);
blockread(f,t,2);
Height := Height*t[2]*256 + t[1];
gd := Detect;
initgraph(gd,gm,' ');
if graphresult <> grOk then
begin
close(f);
halt;
end;
Loadpalette;
DrawBmp;
close(f);
readln;
closeGraph;
End.
==============================
相关链接:
[url=http://www.programfan.com/club/showbbs.asp?id=14262]TP7下显示256色的BMP文件[/url]
BMP格式的DOS转换工具在[url]http://jtchang.ys168.com[/url]网络硬盘TP7\Bmpdemo.zip里提供一个Alchemy.exe
使用方法:
转换成16色bmp文件的命令行为:
alchemy -c16 -w 源文件 目标文件
转换成256色bmp文件的命令行为:
alchemy -c256 -w 源文件 目标文件
包里有我从网上广告图片转换出来的两个bmp文件,一个是16色,另一个是256色。
一是把整个图像调进内存。如果是用TP7,能用的内存是有限的,想把比较大的图像,例如640*480整幅调进内存没法简单实现。二是没校正调色板,那么就只能用缺省的颜色来显示。没有校正调色板的图像显示是无意义的。
下面程序是显示16色无压缩的BMP图像。关于如何将压缩的BMP文件转换成无压缩文件,请参阅我那篇256色BMP文件显示文章的回复。不追求显示速度,其实16色BMP文件的显示可以很简单。(^_^)
(*
16 colors non_compressed BMP file display demo.
Programmed by j.t.Chang.
*)
uses graph;
var
gd, gm : integer;
fn : string;
f : file;
Width , Height : integer;
t : array[1..2] of byte;
pal : array[0..47] of byte;
procedure Loadpalette;
var
t1,t2 : word;
k : byte;
t : array[0..3] of byte;
begin
seek(f,54);
for k := 0 to 15 do
begin
blockread(f,t,4);
pal[3*k+2] := t[0] shr 2;
pal[3*k+1] := t[1] shr 2;
pal[3*k] := t[2] shr 2;
end;
for k:=0 to 15 do
begin
asm mov ah,10h
mov al,0
mov bh,k
mov bl,k
int 10h
end;
end;
t1:=OFS(pal);
t2:=SEG(pal);
asm mov ax,1012h
mov bx,0
mov cx,16
mov dx,t1
mov es,t2
int 10h
end;
end;
procedure DrawBmp;
var x, y,i : integer;
c : array[1..1] of byte;
begin
seek(f,118);
i := (Width+7) div 8;
i := i * 4;
for y := Height - 1 downto 0 do
begin
for x:=0 to i-1 do
begin
blockread(f,c,1);
if 2*x < Width then putpixel(2*x,y,c[1] shr 4);
if 2*x+1 < Width then putpixel(2*x+1,y,c[1] and $F);
end;
end;
end;
Begin
write('Enter 16 colors Bmp filename : ');
readln(fn);
assign(f,fn);
reset(f,1);
seek(f,18);
blockread(f,t,2);
Width := 1; Height := 1;
Width := Width*t[2]*256 + t[1];
blockread(f,t,2);
blockread(f,t,2);
Height := Height*t[2]*256 + t[1];
gd := Detect;
initgraph(gd,gm,' ');
if graphresult <> grOk then
begin
close(f);
halt;
end;
Loadpalette;
DrawBmp;
close(f);
readln;
closeGraph;
End.
==============================
相关链接:
[url=http://www.programfan.com/club/showbbs.asp?id=14262]TP7下显示256色的BMP文件[/url]
BMP格式的DOS转换工具在[url]http://jtchang.ys168.com[/url]网络硬盘TP7\Bmpdemo.zip里提供一个Alchemy.exe
使用方法:
转换成16色bmp文件的命令行为:
alchemy -c16 -w 源文件 目标文件
转换成256色bmp文件的命令行为:
alchemy -c256 -w 源文件 目标文件
包里有我从网上广告图片转换出来的两个bmp文件,一个是16色,另一个是256色。