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

Можно подумать о создании ViewModel Singleton

    private static ViewModel _createInstance = null;

    public static ViewModel CreateInstance
    {

        get
        {
            if (null == _createInstance)
            {
                _createInstance = new ViewModel();
            }

            return _createInstance;
        }
    }//END CreateInstance

и получить к нему доступ с помощью функции createInstance, например:

    ViewModel.CreateInstance.TheImageYouWantToAccess
6
задан Mohammed Nasman 11 December 2008 в 19:10
поделиться

5 ответов

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

3
ответ дан 8 December 2019 в 13:50
поделиться

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

  
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;
6
ответ дан 8 December 2019 в 13:50
поделиться

Тень легка:

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

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

3
ответ дан 8 December 2019 в 13:50
поделиться

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

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

img.Canvas.Brush.Style:=bsClear;
img.Canvas.Font.Color:=clBlack;
img.Canvas.TextOut(0, 0, 'hi there');
2
ответ дан 8 December 2019 в 13:50
поделиться

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

1
ответ дан 8 December 2019 в 13:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: