2012-06-06 436 views
2

我有一個需要截圖(TBitmap)的例程,我需要將陰影添加到最終的TBitmap /圖像,我有這個代碼(它曾經工作但是...)牛逼吧,陰影效果根本沒有得出:將陰影添加到TBitmap

// --------------------------------------------------------------------- // 
procedure TakeScreenshot(); 
var 
    lCapRect : TRect; 
    DestBitmap : TBitmap; 
begin 
    // Take the screenshot & assign it to DestBitmap 
    // ... 

    // Add the drop shadow to DestBitmap 
    DestBitmap.Width := DestBitmap.Width + 6; 
    DestBitmap.Height := DestBitmap.Height + 6; 

    PaintShadow(DestBitmap.Canvas, lCapRect); 
end; 
// --------------------------------------------------------------------- // 
procedure PaintShadow(ACanvas : TCanvas; ARect : TRect); 
var 
    AColor   : TColor; 
    i, iMax  : Integer; 
    h1, h2, v1, v2 : Integer; 
begin 
    AColor := ACanvas.Brush.Color; 
    iMax := 6; 
    h1  := ARect.Left; 
    h2  := ARect.Right; 
    v1  := ARect.Top; 
    v2  := ARect.Bottom; 

    with ACanvas do 
    begin 
     for i := iMax downto 0 do 
     begin 
      ACanvas.Pen.Mode := pmMask; 
      Pen.Color  := DarkenColorBy(AColor, ((iMax - i) * 4 + 10)); 

      MoveTo(h1 + 4{i}, v2 + i); 
      LineTo(h2 + i + 1, v2 + i); 
     end; // for 

     for i := iMax downto 0 do 
     begin 
      ACanvas.Pen.Mode := pmMask; 
      Pen.Color  := DarkenColorBy(AColor, ((iMax - i) * 4 + 10)); 

      MoveTo(h2 + i, v1 + 4{i}); 
      LineTo(h2 + i, v2 + i); 
     end; // for 
    end; // with 
end; 
// --------------------------------------------------------------------- // 
function Max(const A, B: Integer): Integer; 
begin 
    if (A > B) then 
    Result := A 
    else 
    Result := B; 
end; 
// --------------------------------------------------------------------- // 
function DarkenColorBy(BaseColor : TColor; Amount : Integer) : TColor; 
begin 
    Result := RGB(Max(GetRValue(ColorToRGB(BaseColor)) - Amount, 0), 
      Max(GetGValue(ColorToRGB(BaseColor)) - Amount, 0), 
      Max(GetBValue(ColorToRGB(BaseColor)) - Amount, 0)); 
end; 

我的問題是:我怎樣才能解決這個(或任何人都知道一個簡單的方法來添加陰影效果到TBitmap)?

最終圖像保存爲bmp/jpg,並未在TImage中顯示,所以我確實需要爲圖像本身添加陰影。

PS。我用Delphi 7專業版,我的應用程序僅限於Windows XP或更高

編輯

lCapRect取決於設置(我是否拍攝活動監視器,窗口或全部桌面顯示器),但是我們要說它是這樣計算:

lCapRect.Right := Screen.DesktopLeft + Screen.DesktopWidth; 
lCapRect.Bottom := Screen.DesktopTop + Screen.DesktopHeight; 
lCapRect.Left := Screen.DesktopLeft; 
lCapRect.Top := Screen.DesktopTop; 

確實包含截圖位圖(+ 6個像素加到底部&右側,以騰出空間陰影效果),它只是在陰影繪圖不發生

+0

什麼是你傳遞的「lCapRect」? –

+0

我會推薦GDI +(http://www.bilsen.com/gdiplus/index.shtml),它具有創建帶有alpha值的畫筆的功能,但不幸的是它只有D2009,而且只有 –

+0

@AlanClark:謝謝,我是恐怕我需要這個德爾福7 :( – TheDude

回答

3

你沒有顯示出你是如何計算的lCapRect。對於未抽出的位圖關於你PaintShadow程序,它具有比位圖,例如要小一些:

lCapRect := DestBitmap.Canvas.ClipRect; 

// Add the drop shadow to DestBitmap 
DestBitmap.Width := DestBitmap.Width + 6; 
DestBitmap.Height := DestBitmap.Height + 6; 

PaintShadow(DestBitmap.Canvas, lCapRect); 
+0

我編輯我的帖子關於lCapRect。我添加了6像素的底部/右側爲騰出空間的陰影效果 – TheDude

+1

@Gdhami - 不要獨立計算lCapRect,你已經有一個位圖你有沒有試過答案中的代碼? –

+0

你是對的,我沒有注意到Canvas.ClipRect分配,投影有點難看,但這是一個不同的故事,至少現在繪圖發生,謝謝! – TheDude