众所周知,fp是有自带的图像处理单元的,即:

  • fpImage
  • fpReaderJPEG/PNG/BMP/GIF/…
  • fpWriterJPEG/PNG/BMP/GIF/…

利用这些,已经可以做到一些基础的图像处理了。

图像的新建、读取、保存

不废话,看代码(此处使用PNG为例,其余的一样):

uses
	fpImage,fpReadPNG,fpWritePNG;
var
	img:TFPCustomImage;
	reader:TFPCustomImageReader;
	writer:TFPCustomImageWriter;
	t:TFPColor;
begin
	img:=TFPMemoryImage.Create(0,0);
	reader:=TFPReaderPNG.Create;
	writer:=TFPWriterPNG.Create;
	img.LoadFromFile('1.png',reader);
	t.Red:=23333; t.Green:=6666; t.Blue:=10000;
	img.Colors[1,2]:=t;
	img.SaveToFile('1.png',writer);
	img.Free; reader.Free; writer.Free;
end.

注意一些毒瘤的性质:

  1. 这里的颜色不是0到255,而是0到65535……

  2. 存储时先列后行,从0开始。

  3. 由于imgColors是属性,所以不能直接用img.Colors[1,1].Red之类的代码,需要存入变量。

同时,我们可以用不同的readerwriter,实现图像的类型转换。并且,可以像操作一个数组一样操作图像,十分方便。

应用

图片变黑白:

uses
	fpImage,fpReadJPEG,fpWriteJPEG;
var
	s:string;
	rd:TFPCustomImageReader;
	wt:TFPCustomImageWriter;
	img:TFPCustomImage;
	tmp:TFPColor;
	i,j,t:longint;
begin
	readln(s);
	rd:=TFPReaderJPEG.Create();
	img:=TFPMemoryImage.Create(0,0);
	img.LoadFromFile(s,rd);
	writeln(img.Height,' ',img.Width);
	for i:=0 to img.Width-1 do
		for j:=0 to img.Height-1 do begin
			tmp:=img.Colors[i,j];
			t:=(tmp.Red+tmp.Green+tmp.Blue)div 3;
			tmp.Red:=t; tmp.Green:=t; tmp.Blue:=t;
			img.Colors[i,j]:=tmp;
		end;
	wt:=TFPWriterJPEG.Create;
	img.SaveToFile('out.jpg',wt);
end.

实际上就是把RGB加起来除3。

图片去底:

uses
	fpImage,fpReadPNG,fpWritePNG;
var
	img:TFPCustomImage;
	reader:TFPCustomImageReader;
	writer:TFPCustomImageWriter;
	px:TFPColor;
	i,j:longint;
begin
	img:=TFPMemoryImage.Create(0,0);
	reader:=TFPReaderPNG.Create;
	writer:=TFPWriterPNG.Create;
	img.LoadFromFile('1.png',reader);
	for i:=0 to img.Width-1 do
		for j:=0 to img.Height-1 do begin
			px:=img.Colors[i,j];
			with px do begin
				if (red=65535)and(green=65535)and(blue=65535) then
					alpha:=0;
			end;
			img.Colors[i,j]:=px;
		end;
	TFPWriterPNG(writer).UseAlpha:=true;
	img.SaveToFile('2.png',writer);
end.

判断一个像素是不是白色,是的话把它变成透明的。(也可以以其它颜色作为背景色,或者设置一个颜色区间之类的)

如果需要图片支持透明,我们只需要将writer中的UseAlpha设置为true即可。同时alpha为0时全透明,为65535时不透明。