I need to draw PNG transparently on MetaFileCanvas. This works fine when I draw a bitmap (which I use when displaying on the screen), but I need a MetaFile for printing. How can I achieve this?
Here is some code that demonstrates the problem. Put the attached PNG somewhere and update the paths in the code.
procedure TForm1.Test; var vPNG : TPNGImage; vBMP : TBitmap; vMeta : TMetafile; vMetaCanvas : TMetafileCanvas; LDC : HDC; begin vPNG := TPNGImage.Create; try vPNG.LoadFromFile('c:\temp\pic\pic.png'); //1. Draw to bitmap. Draw stuff behind PNG to demonstrate transparency vBMP := TBitmap.Create; try vBMP.SetSize(vPNG.Width + 20,vPNG.Height + 20); vBMP.Canvas.Pen.Color := clLime; vBMP.Canvas.Pen.Width := 5; vBMP.Canvas.MoveTo(0,0); vBMP.Canvas.LineTo(vBMP.Width,vBMP.Height); vBMP.Canvas.MoveTo(vBMP.Width,0); vBMP.Canvas.LineTo(0,vBMP.Height); vBMP.Canvas.Draw(10,10,vPNG); //This is drawn correctly and transparently Canvas.Draw(10,10,vBMP); //Draw to demo form finally vBMP.Free; end; //2. Draw to metafile vMeta := TMetaFile.Create; try LDC := GetDC(0); vMetaCanvas := TMetafileCanvas.Create(vMeta,LDC); try vMetaCanvas.Pen.Color := clLime; vMetaCanvas.Pen.Width := 5; vMetaCanvas.MoveTo(0,0); vMetaCanvas.LineTo(vPNG.Width+20,vPNG.Height+20); vMetaCanvas.MoveTo(vPNG.Width+20,0); vMetaCanvas.LineTo(0,vPNG.Height+20); vMetaCanvas.Draw(10,10,vPNG); //Not correct. Can't see the green line finally vMetaCanvas.Free; end; //Demonstrate that resizing works fine: Canvas.Draw(10,130,vMeta); vMeta.MMWidth := vMeta.MMWidth * 2; Canvas.Draw(150,130,vMeta); vMeta.MMHeight := vMeta.MMHeight * 2; Canvas.Draw(400,130,vMeta); finally vMeta.Free; ReleaseDC(0,LDC); end; finally vPNG.Free; end; end;

Svein bringsli
source share