2014-02-13 17 views
1

即時通訊嘗試使用像素,即時通訊使用TFastDib獲得更好的效果。但是,我在計算開始圖像點時遇到了麻煩。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

它的不尋常的,我不能習慣它...它像一個從底部讀線 – ShadowFrost

+2

這是一個普遍的情況下,原來在左下角。另請參閱['設備無關的位圖]](http://msdn.microsoft.com/zh-cn/library/windows/desktop/dd183562(v = vs.85).aspx)。 –

回答

2

您可以實現自己的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的使用,以獲取底層位圖的高度。