Написание прозрачного текста на изображении

Как я могу написать полупрозрачный текст на изображении (Jpg,Bmp) или прозрачный текст (цвет как то же фоновое изображение), но с тенью, что-то я хочу сделать, чтобы водяные знаки изображения.

Я хочу выполнить это с помощью Delphi win32.

6 ответов


Я предполагаю, что вы пытаетесь выполнить немного сложнее, чем просто писать текст с прозрачным фоном; т. е. вы пытаетесь получить какую-то форму Альфа-смешанного текста, написанного на изображении.
Самый простой метод - использовать процедуры GDI+. Они инкапсулированы для delphi и доступны для загрузки изhttp://www.progdigy.com/. Есть много примеров, которые должны быть использованы в качестве примера.


один из вариантов-использовать функцию AlphaBlend в Windows.pas unit. Что-то вроде этого произведет полупрозрачный текст (с тенью - построением на ответе Джима Маккита), наложенный на изображение:

  
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 -$FF (0-255).
                                          Represents the percent of opaqueness:
                                           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;

тень легко:

// 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');

Это текст с прозрачным фоном. Или вы хотите, чтобы сам текст был Сими-прозрачным? Это немного сложнее. Вам нужно будет нарисовать его вручную. Простой способ сделать это было бы для образца средний цвет области, которую вы пишете на изображении. Затем установите цвет шрифта, чтобы быть немного светлее и ваша тень, чтобы быть немного темнее. Потом она как бы сливается.


Я не тестировал его, но это даст вам некоторое представление, куда идти. ключ стиль кисти.

что-то вроде этого:

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

эта функция основана на идее Дэйв Elsberry по.

что изменилось:

  • рисует только тень прозрачно
  • он использует почти в 2 раза меньше ОЗУ
  • параметры

procedure DrawShadowText(aCanvas: TCanvas; CONST Text: string; CONST X, Y, Opacity: Integer; TextColor, ShadowColor: TColor);    
{ Opacity a value from 0-255:
      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;

можно использовать передача битового блока процедуры для слияния изображения с общим холстом, затем сохраните изображение снова.