Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 在Lazarus中将图像转换为灰度的问题_Delphi_Image Processing_Pascal_Freepascal_Lazarus - Fatal编程技术网

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
的建议。没什么可找的,不过没关系。干杯;)