2008-12-11 48 views
6

Làm cách nào để viết văn bản trong suốt trên hình ảnh (Jpg, Bmp) hoặc văn bản trong suốt (màu giống như hình nền) nhưng với bóng, thứ tôi muốn làm để làm mờ hình ảnh .Viết văn bản trong suốt trên ảnh

Tôi muốn thực hiện điều đó bằng cách sử dụng Delphi win32.

Trả lời

3

Tôi cho rằng những gì bạn đang cố gắng thực hiện phức tạp hơn một chút so với việc viết văn bản đơn giản với nền trong suốt; tức là bạn đang cố gắng để có được một số hình thức văn bản pha trộn alpha được viết trên hình ảnh.
Phương pháp đơn giản nhất là sử dụng các thói quen GDI +. Chúng được đóng gói cho delphi và có sẵn để tải xuống từ http://www.progdigy.com/. Có rất nhiều ví dụ ở đó nên có thể sử dụng làm ví dụ.

+0

Progdigy.com đã ngừng hoạt động? Tôi không thể truy cập nó. – Ampere

+0

Dường như có một số bất đồng giữa nhà phát triển 'GDI plus' cho Delphi và Embarcadero, tôi không biết liệu nó có bị kéo theo phản ứng này hay không. Bạn có thể thử tìm kiếm một số lựa chọn thay thế như [GDI plus] của Erik Van Bilsen (http://www.bilsen.com/gdiplus/index.shtml). – Petesh

2

tôi chưa thử nghiệm nhưng nó sẽ cung cấp cho bạn một số ý tưởng đi đâu. phím là kiểu cọ vẽ.

một cái gì đó như thế này:

img.Canvas.Brush.Style:=bsClear; 
img.Canvas.Font.Color:=clBlack; 
img.Canvas.TextOut(0, 0, 'hi there'); 
+0

X-Ray, đó là sẽ viết các văn bản với màu đen, tôi muốn văn bản được bán transpare nt hoặc trong suốt với bóng –

+0

Màu phông chữ được sử dụng, không phải màu bút –

+0

> Màu phông chữ được sử dụng, không phải màu bút cảm ơn chỉnh sửa, jim. –

3

Cái bóng rất dễ dàng:

// Bold shows up better when over an image 
image1.Canvas.Font.Style := [fsBold]; 
// Write the shadow first 
image1.Canvas.Brush.Style:=bsClear; 
image1.Canvas.Font.Color := clGrayText; 
image1.Canvas.TextOut(1, 1, 'hi there'); 
// Then put the text on top (slightly offset) 
image1.Canvas.Brush.Style:=bsClear; 
image1.Canvas.Font.Color :=clBlack; 
image1.Canvas.TextOut(0, 0, 'hi there'); 

Đây là văn bản với nền trong suốt. Hay bạn muốn bản thân văn bản minh bạch? Đó là một chút phức tạp hơn. Bạn sẽ cần phải vẽ nó bằng tay. Một cách dễ dàng để làm điều đó thay vì sẽ lấy mẫu trung bình của màu của khu vực bạn đang viết trên hình ảnh. Sau đó, thiết lập màu phông chữ của bạn là một chút nhẹ hơn và bóng tối của bạn là một chút tối hơn. Sau đó, nó là loại pha trộn.

+0

Jim, tôi muốn văn bản trong suốt có bóng hoặc văn bản bán trong suốt nền không trong suốt –

+0

Vâng tôi không chắc chắn. Pha trộn Alpha phức tạp hơn một chút. –

+0

Mã đẹp, đơn giản nhưng thực hiện công việc. +1 –

1

Bạn có thể sử dụng các thói quen bitblt để hợp nhất hình ảnh vào canvas chung, sau đó lưu lại hình ảnh.

+1

skamradt, Bất kỳ mã mẫu nào? –

6

Một tùy chọn là sử dụng chức năng AlphaBlend trong đơn vị Windows.pas. Một cái gì đó như thế này sẽ tạo ra văn bản bán trong suốt (với một bóng thả - xây dựng ứng phó Jim McKeeth của) overlayed trên một hình ảnh:


uses Windows, Graphics; 
. 
. 
. 
var 
    BackgroundImage: Graphics.TBitmap; { need to call out specifically for Graphics.TBitmap 
             because the Windows unit also has a TBitmap 
             declaration } 
    TextImage: Graphics.TBitmap; 
    BlendFunc: BLENDFUNCTION; 
begin 
    BlendFunc.BlendOp := AC_SRC_OVER; 
    BlendFunc.BlendFlags := 0; 
    BlendFunc.SourceConstantAlpha := $C0; { a hex value from $00-$FF (0-255). 
              Represents the percent of opaqueness: 
              $00 is completely transparent, 
              $FF is completely opaque. 
              $C0 is 75% opaque } 
    BlendFunc.AlphaFormat := AC_SRC_ALPHA; 

    { BackgroundImage is for holding the image you want to overlay text onto } 
    BackgroundImage := Graphics.TBitmap.Create; 
    try 
     BackgroundImage.LoadFromFile('yourimagehere.bmp'); 

     { Create another TBitmap to hold the text you want to overlay } 
     TextImage := Graphics.TBitmap.Create; 
     try 
     { Set this bitmap to have the same dimensions as the 
      background image you want the text to appear on. } 
     TextImage.Height := BackgroundImage.Height; 
     TextImage.Width := BackgroundImage.Width; 

     { In my limited experience with AlphaBlend, Black is always 100% 
      transparent. So, paint TextImage completely Black. Play around 
      with this to see the effect it has on the final outcome. } 
     TextImage.Canvas.Brush.Color := clBlack; 
     TextImage.Canvas.FloodFill(0, 0, clNone, fsBorder); 

     TextImage.Canvas.Font.Style := [fsBold]; 

     { Write the shadow first } 
     TextImage.Canvas.Brush.Style := bsClear; 
     TextImage.Canvas.Font.Color := clDkGray; 
     TextImage.Canvas.TextOut(11, 11, 'Test'); 

     { Then put the text on top (slightly offset) } 
     TextImage.Canvas.Brush.Style := bsClear; 
     TextImage.Canvas.Font.Color := clMaroon; 
     TextImage.Canvas.TextOut(10, 10, 'Test'); 

     { Use the AlphaBlend function to overlay the bitmap holding the text 
      on top of the bitmap holding the original image. } 
     Windows.AlphaBlend(BackgroundImage.Canvas.Handle, 0, 0, 
          TextImage.Width, TextImage.Height, 
          TextImage.Canvas.Handle, 0, 0, TextImage.Width, 
          TextImage.Height, BlendFunc); 

     { Assign the now updated BackgroundImage to a TImage control for display } 
     Image1.Picture.Bitmap.Assign(BackgroundImage); 
     finally 
     TextImage.Free; 
     end; 
    finally 
     BackgroundImage.Free; 
    end; 
    end; 
2

Chức năng này được dựa trên ý tưởng Dave elsberry của.

Có gì khác nhau:

  • trận hoà chỉ có bóng một cách minh bạch
  • Nó sử dụng ít gần 2 lần RAM
  • thông số

procedure DrawShadowText(aCanvas: TCanvas; CONST Text: string; CONST X, Y, Opacity: Integer; TextColor, ShadowColor: TColor);  
{ Opacity a value from 0-255: 
    $00 is completely transparent, 
    $FF is completely opaque. 
    $C0 is 75% opaque } 
CONST ShadowSize= 1; 
VAR 
    TempBMP: TBitmap; 
    BlendFunc: BLENDFUNCTION; 
    H, W: Integer; 
begin 
BlendFunc.BlendOp := AC_SRC_OVER; 
BlendFunc.BlendFlags := 0; 
BlendFunc.SourceConstantAlpha := Opacity; 
BlendFunc.AlphaFormat := AC_SRC_ALPHA; 

{ Create another TBitmap to hold the text you want to overlay } 
TempBMP := Graphics.TBitmap.Create; 
TRY 
    TempBMP.Canvas.Font.Style := [fsBold]; 
    TempBMP.Canvas.Brush.Style := bsClear; 

    W:= TempBMP.Canvas.TextWidth(Text); 
    H:= TempBMP.Canvas.TextHeight(Text); 

    TempBMP.SetSize(W+ShadowSize, H+ShadowSize); 

    { In AlphaBlend, Black is always 100% transparent. So, paint TempBMP completely Black. } 
    TempBMP.Canvas.Brush.Color := clBlack; 
    TempBMP.Canvas.FloodFill(0, 0, clNone, fsBorder); 

    { Write the shadow first } 
    TempBMP.Canvas.Font.Color := ShadowColor; 
    TempBMP.Canvas.TextOut(ShadowSize, ShadowSize, Text);  { Diagonal left shadow } 
    TempBMP.Canvas.TextOut(ShadowSize, 0,   Text);  { Left shadow } 

    { Draw the text with transparency: 
    TempBMP.Canvas.Brush.Style := bsClear; 
    TempBMP.Canvas.Font.Color := TextColor; 
    TempBMP.Canvas.TextOut(0, 0, Text); } 

    { Use the AlphaBlend function to overlay the bitmap holding the text on top of the bitmap holding the original image. } 
    Windows.AlphaBlend(aCanvas.Handle, 
         x, y, TempBMP.Width, TempBMP.Height, 
         TempBMP.Canvas.Handle, 0, 0, TempBMP.Width, TempBMP.Height, 
         BlendFunc); 

    { Draw the text at 100% opacity } 
    aCanvas.Font.Style := [fsBold]; 
    aCanvas.Brush.Style := bsClear; 
    aCanvas.Font.Color := TextColor; 
    aCanvas.TextOut(x, y-1, Text); 
FINALLY 
    FreeAndNil(TempBMP); 
END; 
end; 



procedure TfrmTest.UseIt; 
VAR BackgroundImage: tbitmap; 
begin 
BackgroundImage := Graphics.TBitmap.Create; 
try 
    BackgroundImage.LoadFromFile('c:\test.bmp'); 
    DrawShadowText (BackgroundImage.Canvas, 'This is some demo text', 20, 40, 140, clRed, clSilver); 
    Image1.Picture.Bitmap.Assign(BackgroundImage); 
FINALLY 
    BackgroundImage.Free; 
end; 
end; 
Các vấn đề liên quan