TFastDib和像素

时间:2014-02-13 22:33:14

标签: delphi

即时尝试使用像素,我使用TFastDib获得更好的效果。但是,我在计算起始图像点时遇到了麻烦。

让我解释一下:

我们有5x5像素的图像。

1像素,据我所知,应该在左上角,但我在左下角。

enter image description here

  FImg := TFastDib.Create;

  LoadJPGFile (FImg, CurrImgPath, false);

  Wave(FImg,5,5,15,15);

  FImg.Pixels24[19,19]:=tfPurple;
  FImg.Pixels[21,21]:=tfRed;

我该如何解决这个问题?我不可能从头开始计算像素。

1 个答案:

答案 0 :(得分:2)

你可以实现自己的TFastDIB,它建立在现有的TFastDIB上,但是像这样反转Y坐标系:

TYPE
  TUpsideDownFastDIB    = CLASS(TFastDIB)
                          PROTECTED
                            PROCEDURE   SetPixel(X,Y : Cardinal ; C : TColor);
                            FUNCTION    GetPixel(X,Y : Cardinal) : TColor;
                          PUBLIC
                            PROPERTY    Pixels[X,Y : Cardinal] : TColor Read GetColor Write SetColor;
                          END;

PROCEDURE TUpsideDownFastDIB.SetPixel(X,Y : Cardinal ; C : TColor);
  BEGIN
    INHERITED Pixels[X,Height-Y]:=C
  END;

FUNCTION TUpsideDownFastDIB.GetPixel(X,Y : Cardinal) : TColor;
  BEGIN
    Result:=INHERITED Pixels[X,Height-Y]
  END;

然后代替

FImg := TFastDib.Create;

你要用

FImg := TUpsideDownFastDIB.Create;

(并记得将FImg声明为TUpsideDownFastDIB)

您需要以与上述相同的方式为所有接受Y坐标的例程实现自定义函数,从而将坐标系颠倒,然后调用原始实现。我已经向您展示了如何为Pixels属性执行此操作 - 您必须自己为剩余的属性和函数执行此操作。

免责声明:我不知道TFastDIB,所以我不确定如何获得位图的高度。我假设它有一个属性“Height”,它返回底层位图的高度。如果这是一个不正确的假设,你将不得不在你实现的方法中使用Height替换正确的方法来获得底层位图的高度。