IPicture::Render參數中的座標關係

IPicture::Render 很難使用,它的一堆座標參數更是讓人迷惑不解,即使經常使用也難免出錯。 MSDN在解釋這個方法的使用時並沒有解釋清楚。MSDN的解釋如下。

HRESULT Render(
  HDC hdc, //Handle of device context on which to render the image
  long x,  //Horizontal position of image in hdc
  long y,  //Vertical position of image in hdc
  long cx, //Horizontal dimension of destination rectangle
  long cy, //Vertical dimension of destination rectangle
  OLE_XPOS_HIMETRIC xSrc,
           //Horizontal offset in source picture
  OLE_YPOS_HIMETRIC ySrc,
           //Vertical offset in source picture
  OLE_XSIZE_HIMETRIC cxSrc,
           //Amount to copy horizontally in source picture
  OLE_YSIZE_HIMETRIC cySrc,
           //Amount to copy vertically in source picture
  LPCRECT prcWBounds
           //Pointer to position of destination for a metafile hdc
);

這個方法的十個參數當中,第一個和最後一個參數沒得說,最關鍵的是從第二個到第九個,分成兩組,分別爲:

第一組:x, y, cx,cy

這一組參數描述的是在指定設備上的一個矩形區域(cx - width, cy - height),將在這個區域裏輸出圖像。

第二組:xSrc, ySrc, cxSrc, cySrc

這一組參數描述的是從圖像數據中裁剪的一個矩形區域,將把這個矩形區域中的內容輸出到上一組參數定義的設備區域上。

現在假設有圖像I(x,y)要在設備D(x,y)上輸出,輸出時只有平移和縮放,沒有旋轉,則一般情況下有如下的變換:

[IPicture-Render.png]

上面公式的第一個矩陣是從圖像到設備的平移縮放矩陣,縮放比爲rx, ry,平移量爲sx, sy。第二個矩陣是圖像的上下翻轉矩陣,這是一個特殊的座標變換矩陣,它十分關鍵,因爲在一般的Windows位圖中垂直方向上的座標是上下翻轉的,所以需要把y座標再翻轉過來才能正確地顯示在輸出設備上,其中Ih是圖像I(x,y)的高度。

從這個公式得到如下關係式:

Dx = Ix rx+ sx
Dy = Ih ry– Iy ry+ sy
Dw = Iw rx
Dh = – Ih ry

Ix = (Dx– sx) / rx
Iy = (Ih ry– Dy + sy)/ ry
Iw = Dw / r­x
Ih = – Dh / ry 

使用這組關係式,再根據需要從設備座標計算出圖像座標,或者從圖像座標計算出設備座標,就可以正確地在設備指定位置輸出指定的圖像內容了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章