即时尝试使用像素,我使用TFastDib获得更好的效果。但是,我在计算起始图像点时遇到了麻烦。
让我解释一下:
我们有5x5像素的图像。
1像素,据我所知,应该在左上角,但我在左下角。
FImg := TFastDib.Create;
LoadJPGFile (FImg, CurrImgPath, false);
Wave(FImg,5,5,15,15);
FImg.Pixels24[19,19]:=tfPurple;
FImg.Pixels[21,21]:=tfRed;
我该如何解决这个问题?我不可能从头开始计算像素。
答案 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替换正确的方法来获得底层位图的高度。