Question

Je voudrais dessiner un TMetafile transparent sur une toile, utilisé pour filigrane d'impression.

Le problème est fonction AlphaBlend ne reconnaîtra pas TMetaFile.Handle en tant que source qu'il attend poignée de toile.

Je créé une image bitmap 32bit avec transparence, mais le dessin sur elle forcera fond blanc ainsi sur la toile, vous pouvez voir un rectangle alpha mélangé. Comment puis-je peindre un TMetafile transparent sur l'écran / imprimante Canvas?

TMetafile est sûrement transparent, je l'ai testé sur simple page web en utilisant IE avec la couleur d'arrière-plan non standard. Le code source:

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;
Était-ce utile?

La solution

Si vous cochez la documentation officielle MSDN, vous obtiendrez cette déclaration: http://msdn.microsoft.com/en-us/ bibliothèque / dd183351 (VS.85) .aspx

  

Une erreur se produit (et la fonction retourne FALSE) si le contexte identifie de dispositif source d'un contexte de périphérique de métafichier amélioré.

Ma première hypothèse était que, même si le MSDN ne parle que le contexte du périphérique source, votre code ne fonctionnera jamais avec AlphaBlend, qui est destiné à fonctionner entre deux bitmaps.

Mais, après la deuxième enquête, il y a un type d'enregistrement TEMRAlphaBlend dédié dans les tyles d'énumération Meta File. Donc, il devrait fonctionner comme prévu.

Qu'est-ce que vous utilisez pour afficher votre métafichier? Nous aurons besoin du code que vous utilisez pour afficher le métafichier ici.

Mon conseil est d'enregistrer votre métafichier dans un fichier fem, puis utilisez emfexplorer pour inspecter son contexte.

Nous avons mis au point une unité open source, nommée SynGdiPlus, pour dessiner un fichier méta en utilisant GDI +, donc anti-aliasing, dans le plus pur Delphi. Mais nous ne sommes pas encore en œuvre le type d'enregistrement de TEMRAlphaBlend. Si vous trouveriez intéressant d'avoir de l'anticrénelage dans votre application, je pourrais jeter un coup d'oeil dans sa mise en œuvre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top