Вопрос

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

Проблема в том, что Alphablend Function не распознает tmetafile.handle как источник, поскольку она ожидает ручки Canvas.

Я создал 32 -битную растровую карту с прозрачностью, но рисование на нем заставит белый фон, таким образом, на холсте вы можете увидеть прямоугольник с альфа -смешанным. Как я могу нарисовать прозрачный Tmetafile на холсте на экране/принтере?

Tmetafile, безусловно, прозрачен, я протестировал его на простой веб-странице, используя IE с нестандартным цветом фона. Исходный код:

procedure TPainter.DrawAlpha(ACanvas: TCanvas; ARect: TRect; AGraphic: TMetafile; AAlpha: Byte);
var
  bmp: TBitmap;
  bf: BLENDFUNCTION;
begin
  bmp := TBitmap.Create;
  try
    bmp.PixelFormat := pf32bit;
    bmp.SetSize(ARect.Right - ARect.Left, ARect.Bottom - ARect.Top);
    bmp.Transparent := True;
    bmp.Canvas.Brush.Color := clNone;
    bmp.Canvas.Brush.Style := bsClear;
    bmp.Canvas.FillRect(Rect(0, 0, ARect.Right - ARect.Left, ARect.Bottom - ARect.Top));
    bmp.Canvas.StretchDraw(Rect(0, 0, ARect.Right - ARect.Left, ARect.Bottom - ARect.Top), AGraphic);

    bf.BlendOp := AC_SRC_OVER;
    bf.BlendFlags := 0;
    bf.SourceConstantAlpha := 230;
    bf.AlphaFormat := 0;

    AlphaBlend(
      ACanvas.Handle,
      ARect.Left,
      ARect.Top,
      ARect.Right - ARect.Left,
      ARect.Bottom - ARect.Top,
      bmp.Canvas.Handle,
      0,
      0,
      ARect.Right - ARect.Left,
      ARect.Bottom - ARect.Top,
      bf
    );
  finally
    bmp.Free;
  end;
end;
Это было полезно?

Решение

Если вы проверете официальную документацию MSDN, вы получите это утверждение:http://msdn.microsoft.com/en-us/library/dd183351(vs.85).aspx

Происходит ошибка (и функция возвращает false), если контекст исходного устройства идентифицирует усиленный контекст устройства метафильного.

Мое первое предположение было то, что, даже если MSDN говорит только о контексте исходного устройства, ваш код никогда не будет работать с Alphablend, который предназначен для работы между двумя растровыми картами.

Но после второго расследования существует выделенный тип записи Temralphableend в перечислении Meta -файла Tyles. Так что это должно работать, как и ожидалось.

Что вы используете для отображения метафил? Нам нужен код, который вы используете для отображения метафил здесь.

Мой совет - сохранить ваш метафил в файл EMF, а затем использовать Emfexplorer для проверки его контекста.

Мы разработали блок с открытым исходным кодом, названный Syngdiplus, для рисования мета-файла с использованием GDI+, следовательно, с анти-алиатами, в Pure Delphi. Но мы еще не реализовали тип записи TemralPhableend. Если бы вы нашли интересным, чтобы в вашем приложении было бы интересно, я мог бы взглянуть на его реализацию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top