标签: metafile

指定GDI设备上下文的DPI

我有一个生成元文件(EMF)的应用程序.它使用参考设备(也就是屏幕)来渲染这些元文件,因此元文件的DPI会根据运行代码的机器而改变.

假设我的代码打算创建一个8.5英寸x 11英寸的图元文件.使用我的开发工作站作为参考,我最终获得了一个EMF

  • 一个{0,0,21590,27940}的rclFrame(图元文件的维度,以千分之一毫米为单位)
  • {1440,900}的szlDevice(参考设备的尺寸,以像素为单位)
  • a {416,260}的szlMillimeters(参考设备的尺寸,单位mm)

好的,所以rclFrame告诉我EMF的大小应该是

  • 21590/2540 =宽8.5
  • 27940/2540 = 11英寸高

对吧.使用这些信息,我们也可以确定我的显示器的物理DPI,如果我的数学是正确的:

  • (1440*25.4)/ 416 = 87.9231水平dpi
  • (900*25.4)/ 260 = 87.9231垂直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).

  • 是否可以更改参考设备的DPI,以便存储在用于计算DPI的图元文件中的信息出现一个很好的整数?
  • 我可以创建自己的设备上下文并指定其DPI吗?或者我真的必须使用打印机来做到这一点?

感谢您的任何见解.

gdi rounding-error metafile

12
推荐指数
2
解决办法
7141
查看次数

如何显示Windows图元文件?

我需要使用WPF 显示Windows图元文件(EMF),我该怎么办?

编辑:

我要保持基于图像矢量.

.net c# wpf metafile .emf

9
推荐指数
2
解决办法
8034
查看次数

如何在TMetaFileCanvas上透明地绘制PNG

我需要在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)

delphi png metafile

8
推荐指数
1
解决办法
2353
查看次数

将图形复制到屏幕尺寸之外的TMetaFileCanvas

将图像绘制到屏幕分辨率之外的坐标时,我们遇到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)

delphi metafile

8
推荐指数
1
解决办法
971
查看次数

无预览打印本地报告 - 超出流大小或GDI + C#中发生一般错误

我正在使用这篇文章将我的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)

c# printing rdlc stream metafile

8
推荐指数
1
解决办法
506
查看次数

Qt的矢量图形剪贴板格式

我希望我的Qt应用程序能够以兼容的方式将简单的矢量图形保存到剪贴板.在Windows上,我希望能够将图形粘贴到Microsoft Word或Powerpoint中.在Linux上我希望与Open Office兼容.

你会推荐哪种格式?Qt能否以简单的方式生成EMF?SVG是一种选择吗?

更新:

我目前的计划是添加一段原生win32代码,以便在Windows上将图形渲染为emf.这段代码在linux上不可用.

qt svg ms-office metafile .emf

7
推荐指数
1
解决办法
2991
查看次数

如何在C#/ WPF/WinForms中将WMF渲染到BitMap时启用消除锯齿功能?

这样做时,为什么线路等不会被消除锯齿?

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以获得抗锯齿功能? …

c# system.drawing wmf metafile .emf

5
推荐指数
1
解决办法
1042
查看次数

Unity metafiles错误

我知道标题可能听起来不精确,但那是因为我不确定我的错误来自哪里......

首先,这是我的文件夹组织:

  • 资产
    • 场景
    • 脚本
      • MemoryCard.cs
      • SceneController.cs
    • 精灵

开始时,文件"MemoryCard"标题为"MemoryCards"(注意结尾处的"s").我用Unity的内置文本编辑器"Monodevelop"编辑我的文件,在编辑我的文件时,我决定通过Monodevelop重命名它......这似乎是一个坏主意,因为现在有一条警告信息:

"存在元数据文件(.meta),但找不到其资产'Assets/Scripts/MemoryCards.cs'.在Unity之外移动或删除文件时,请确保移动或删除相应的.meta文件用它."

我首先删除了.cs文件并创建了一个新文件,但错误仍然存​​在......

我的问题是我不知道应该查找哪个元文件,因为元文件"MemoryCards.cs.meta"已被删除并在创建新脚本时由其相应的.meta文件替换...

我猜有一些特定的文件引用所有元文件,如树左右......但我没有在互联网上找到任何文档.

我希望你们中的任何人都能帮助我:)

先感谢您,

阿克塞尔

metafile unity-game-engine

5
推荐指数
1
解决办法
2660
查看次数

从图元文件到JPEG/GIF结果的GDI +图像转换在黑色背景中

所以我将图元文件(准确地说是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)

.net vb.net gdi+ metafile image-conversion

2
推荐指数
1
解决办法
3466
查看次数

GetWinMetaFileBits()的参考DC参数到底用于什么?

我的印象是经典的Win16图元文件没有嵌入的大小或分辨率信息(除非有METAFILEPICT标题或类似信息) - GetWinMetaFileBits()使用参考DC有什么用?

graphics winapi gdi resolution metafile

2
推荐指数
1
解决办法
272
查看次数