Delphi 在Lazarus中将图像转换为灰度的问题
我已经写了一个Delphi 在Lazarus中将图像转换为灰度的问题,delphi,image-processing,pascal,freepascal,lazarus,Delphi,Image Processing,Pascal,Freepascal,Lazarus,我已经写了一个过程称为灰度,它假设有一个输入的TImage组件,将它包含的图像转换为灰度,然后在同一TImage组件中打印。问题是它会打印黑色图像。下面是我的代码,请注意,我创建了一个名为img2:TPicture的局部变量,其目的是充当过程输入和输出之间的中间阶段 procedure gray(var img1: TImage); var i,j: Integer; y: integer; color: TColor; img2: TPicture; begin i :=
过程
称为灰度
,它假设有一个输入的TImage组件,将它包含的图像转换为灰度,然后在同一TImage组件中打印。问题是它会打印黑色图像。下面是我的代码,请注意,我创建了一个名为img2:TPicture
的局部变量,其目的是充当过程输入和输出之间的中间阶段
procedure gray(var img1: TImage);
var
i,j: Integer;
y: integer;
color: TColor;
img2: TPicture;
begin
i := 0; j := 0;
img2 := TPicture.create;
img2.Bitmap.Width:= img1.width;
img2.Bitmap.Height:= img1.height;
for i := 0 to img1.width do begin
for j := 0 to img1.height do begin
y:= trunc((255 * luminance(img1,i,j)));
color := RGBToColor(byte(y), byte(y), byte(y));
img2.Bitmap.Canvas.DrawPixel(i,j, TColorToFPColor(color));
end;
img1.Picture.Assign(img2);
end;
end;
看看这段代码,其中有两个嵌套循环
for i := 0 to img1.width do begin
for j := 0 to img1.height do begin
y:= trunc((255 * luminance(img1,i,j)));
color := RGBToColor(byte(y), byte(y), byte(y));
img2.Bitmap.Canvas.DrawPixel(i,j, TColorToFPColor(color));
end;
img1.Picture.Assign(img2);
end;
在内环之后,您将img2
分配给img1。图片
,您将在访问外环后继续阅读。因此,img1
在外循环进入第二次迭代时变为空(最左边的像素列除外)
更改代码如下:
for i := 0 to img1.width do begin
for j := 0 to img1.height do begin
y:= trunc((255 * luminance(img1,i,j)));
color := RGBToColor(byte(y), byte(y), byte(y));
img2.Bitmap.Canvas.DrawPixel(i,j, TColorToFPColor(color));
end;
end;
img1.Picture.Assign(img2);
将t图片
命名为img2
,尤其是当img1
指的是TImage
时,也会产生误导
此外,为了使代码更高效,需要考虑几个要点。最重要的是借助扫描线一次扫描一行位图图像
使用调试器,您是否检查过每个像素的颜色不总是0?如果您使用的是支持AlphaChannel但未设置AlphaChannel的位图格式,您的输出正是您所期望的。我不熟悉Lazarus的默认设置,但如果您的图片使用支持AlphaChannel的格式,则需要在每个像素上设置AlphaChannel。fpiette:颜色始终不是0@MiqueasGamero-您是否检查了AlphaChannel-对于任何RGB值,AlphaChannel为0表示未绘制任何内容。。。在我看来就像你在这里看到的。嗯,我会尽快检查AlphaChannel,我会在这里更新。非常感谢。你说得对!我不得不重写我的代码,但我没有意识到你所指出的。谢谢大家!@你们声称的DelphiCoder:AFAIK,Lazarus/FreePascal中并没有扫描线,你们可以很容易地自己查看来验证
TBitmap
从TRasterImage
继承(通过其他类),后者声明属性扫描线[行:整数]:指针读取GetScanLine;平台代码>很有趣,谢谢!几年前,当我试图使一些代码与Delphi和Lazarus兼容时,我找不到它。@DelphiCoder作为Graphics
单元包含在大多数程序中,并声明了一个变量:bmp:TBitmap
您只需键入bmp.Sc
即可获得Scanline
的建议。没什么可找的,不过没关系。干杯;)