关于fpImage及附属单元的使用浅谈
众所周知,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.
注意一些毒瘤的性质:
-
这里的颜色不是0到255,而是0到65535……
-
存储时先列后行,从0开始。
-
由于
img
的Colors
是属性,所以不能直接用img.Colors[1,1].Red
之类的代码,需要存入变量。
同时,我们可以用不同的reader
和writer
,实现图像的类型转换。并且,可以像操作一个数组一样操作图像,十分方便。
应用
图片变黑白:
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时不透明。