我有一个生成元文件(EMF)的应用程序.它使用参考设备(也就是屏幕)来渲染这些元文件,因此元文件的DPI会根据运行代码的机器而改变.
假设我的代码打算创建一个8.5英寸x 11英寸的图元文件.使用我的开发工作站作为参考,我最终获得了一个EMF
好的,所以rclFrame告诉我EMF的大小应该是
对吧.使用这些信息,我们也可以确定我的显示器的物理DPI,如果我的数学是正确的:
凡是播放此图元文件 - 一个EMF到PDF转换,在"摘要"页上的Windows资源管理器等的EMF时,单击鼠标右键 - 似乎截断计算的DPI值,显示87的,而不是87.9231(甚至88会很好).
当播放元文件时,这会导致页面的物理大小为8.48 x 10.98 in(使用87 dpi)而不是8.5 in x 11 in(使用88 dpi).
感谢您的任何见解.
我需要在MetaFileCanvas上透明地绘制PNG.当我绘制到位图(我在屏幕上显示时使用)时这很好用,但是对于打印我需要一个MetaFile.我怎样才能做到这一点?
这是一些演示此问题的代码.将附加的PNG放在某处并更新代码中的路径.
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 …Run Code Online (Sandbox Code Playgroud) 将图像绘制到屏幕分辨率之外的坐标时,我们遇到TMetaFileCanvas输出问题.向量操作似乎没有问题,但图像操作只是"被忽略".如果我们将相同的图像绘制到屏幕边界内的坐标,则没有问题.
例如.此SSCCE将生成4个输出文件.位图变体没有问题,将按预期输出左上角inscreen.bmp的红色方块和右下角的红色方块outsidescreen.bmp.在inscreen.emf元文件作为工作在左上角绘制的红色正方形的预期.outsidescreen.emf不起作用,只画线.
program Project6;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
System.Types,
Windows,
Vcl.Graphics;
const
SIZECONST = 3000; // should be larger than your screen resolution
OFFSET = 1500;
function GetMyMetafile(const aHDC: HDC): TMetafile;
var
metcnv: TMetafileCanvas;
begin
Result := TMetafile.Create;
Result.SetSize(500, 500);
metcnv := TMetafileCanvas.Create(Result, aHDC);
metcnv.Brush.Color := clRed;
metcnv.FillRect(Rect(0, 0, 500, 500));
metcnv.Free;
end;
procedure OutputToMetaFile(const aFilename: string; const aStartOffset,
aEndOffset, aMaxSize: Integer; aGraphic: TGraphic; aHDC: HDC);
var
metafile: TMetafile;
metcnv: …Run Code Online (Sandbox Code Playgroud) 我正在使用这篇文章将我的rdlc直接打印到打印机,但是当我试图Metafile通过传递stream它来创建对象时给了我错误.(GDI +中发生一般错误)
码:
using System;
using System.IO;
using System.Data;
using System.Text;
using System.Drawing.Imaging;
using System.Drawing.Printing;
using System.Collections.Generic;
using System.Windows.Forms;
using Microsoft.Reporting.WinForms;
public class Demo : IDisposable
{
private int m_currentPageIndex;
private IList<Stream> m_streams;
// Routine to provide to the report renderer, in order to
// save an image for each page of the report.
private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek)
{
DataSet ds = new DataSet(); …Run Code Online (Sandbox Code Playgroud) 我希望我的Qt应用程序能够以兼容的方式将简单的矢量图形保存到剪贴板.在Windows上,我希望能够将图形粘贴到Microsoft Word或Powerpoint中.在Linux上我希望与Open Office兼容.
你会推荐哪种格式?Qt能否以简单的方式生成EMF?SVG是一种选择吗?
更新:
我目前的计划是添加一段原生win32代码,以便在Windows上将图形渲染为emf.这段代码在linux上不可用.
这样做时,为什么线路等不会被消除锯齿?
using (var myGraphics = Graphics.FromImage(bitmap))
{
myGraphics.CompositingQuality = CompositingQuality.HighQuality;
myGraphics.SmoothingMode = SmoothingMode.HighQuality;
myGraphics.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
myGraphics.Clear(backgroundColor);
myGraphics.EnumerateMetafile(m_metafile, new Point(0, 0), m_metafileDelegate);
}
Run Code Online (Sandbox Code Playgroud)
委托函数如下所示:
private bool MetafileCallback(EmfPlusRecordType recordType, int flags, int dataSize, IntPtr data, PlayRecordCallback callbackData)
{
byte[] dataArray = null;
if (data != IntPtr.Zero)
{
// Copy the unmanaged record to a managed byte buffer
// that can be used by PlayRecord.
dataArray = new byte[dataSize];
Marshal.Copy(data, dataArray, 0, dataSize);
}
m_metafile.PlayRecord(recordType, flags, dataSize, dataArray);
return true;
}
Run Code Online (Sandbox Code Playgroud)
我是否需要覆盖特定类型的PlayRecord以获得抗锯齿功能? …
我知道标题可能听起来不精确,但那是因为我不确定我的错误来自哪里......
首先,这是我的文件夹组织:
开始时,文件"MemoryCard"标题为"MemoryCards"(注意结尾处的"s").我用Unity的内置文本编辑器"Monodevelop"编辑我的文件,在编辑我的文件时,我决定通过Monodevelop重命名它......这似乎是一个坏主意,因为现在有一条警告信息:
"存在元数据文件(.meta),但找不到其资产'Assets/Scripts/MemoryCards.cs'.在Unity之外移动或删除文件时,请确保移动或删除相应的.meta文件用它."
我首先删除了.cs文件并创建了一个新文件,但错误仍然存在......
我的问题是我不知道应该查找哪个元文件,因为元文件"MemoryCards.cs.meta"已被删除并在创建新脚本时由其相应的.meta文件替换...
我猜有一些特定的文件引用所有元文件,如树左右......但我没有在互联网上找到任何文档.
我希望你们中的任何人都能帮助我:)
先感谢您,
阿克塞尔
所以我将图元文件(准确地说是EMF)转换为jpeg或gif(只要它与浏览器兼容并不重要),当我进行转换时,所有透明像素都变黑.我不知道如何在GDI +中执行此操作,但这是我用来保存文件的方法:
Dim Img As System.Drawing.Imaging.Metafile = New System.Drawing.Imaging.Metafile(stream)
Img.Save(Server.MapPath("/FileName.gif"), System.Drawing.Imaging.ImageFormat.Gif)
Run Code Online (Sandbox Code Playgroud) 我的印象是经典的Win16图元文件没有嵌入的大小或分辨率信息(除非有METAFILEPICT标题或类似信息) - GetWinMetaFileBits()使用参考DC有什么用?