我正在创建一些.wmf文件,但其中一些似乎已损坏,无法在任何元文件查看器中显示.经过一些反复试验,我发现问题是由它们的尺寸引起的.如果我按比例缩放相同的图形以减小尺寸,则会显示.
现在,我想知道绘图的大小是否存在限制,或者问题是否是其他问题.我知道这些文件有16位数据结构,所以我猜每个维度的限制是2 ^ 16个单位,(如果签名则为2 ^ 15).但在我的测试中它大约是25,000.所以我不能依赖这个值,因为限制可以是任何东西(宽度*高度可能,或者图纸的分辨率可能会影响它).我找不到关于描述这个的.wmf文件的可靠资源.
以下是显示问题的示例代码:
procedure DrawWMF(const Rect: TRect; const Scale: Double; FileName: string);
var
Metafile: TMetafile;
Canvas: TMetafileCanvas;
W, H: Integer;
begin
W := Round(Rect.Width * Scale);
H := Round(Rect.Height * Scale);
Metafile := TMetafile.Create;
Metafile.SetSize(W, H);
Canvas := TMetafileCanvas.Create(Metafile, 0);
Canvas.LineTo(W, H);
Canvas.Free;
Metafile.SaveToFile(FileName);
Metafile.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
const
Dim = 40000;
begin
DrawWMF(Rect(0, 0, Dim, Dim), 1.0, 'Original.wmf');
DrawWMF(Rect(0, 0, Dim, Dim), 0.5, 'Scaled.wmf');
try
Image1.Picture.LoadFromFile('Original.wmf');
except
Image1.Picture.Assign(nil);
end;
try
Image2.Picture.LoadFromFile('Scaled.wmf');
except …Run Code Online (Sandbox Code Playgroud) Windows Presentation Foundation可以读取/写入WMF/EMF文件,而无需使用WinForms Interop或Win32.
如果没有,原因是什么?
如何获取可在 MS Office(Word 和 PowerPoint)中用作矢量图形的 emf 或 wmf 文件形式的 matplotlib 绘图?
我尝试使用 Inkscape 和 LibreOffice Draw 导出为 svg 并转换为 emf,但这两个选项似乎都会导致图像质量损失,从而导致光栅图像。
我也尝试过导出为 pdf 并转换为 emf/wmf,但也存在同样的问题。
我正在尝试在C#表单上绘制图像(在PictureBoxes中,以及使用Graphics.DrawImage()),并且正在寻找一种平滑绘制它们的方法.图像必须是支持透明度的格式,因此PNG,GIF,SVG和WMF.C#不支持开箱即用的SVG文件,我还没有找到一个好的第三方库(我找到了SvgNet,但无法弄明白).
我需要绘制一个WMF文件,C#可以通过Image.FromFile()函数来完成,但它没有消除锯齿.我想知道是否有办法解决这个问题?
如果我在System.Drawing.Image中有一个wmf或emf图像,有没有办法用c#保存图元文件数据而不将其渲染为位图?调用Image.Save会将其呈现为位图,我希望保留原始数据,使其仍然是有效的.wmf或.emf格式文件.
我正在开发一个 C++ 应用程序,它应该使用 USB 相机来捕获高分辨率照片。它应该与 Windows 10 中的相机应用程序具有相同的行为。我正在尝试使用 DirectShow 来执行此操作。现在我只能拍摄延迟的高分辨率照片或及时拍摄但分辨率较低的照片。另外,我对 MS 文档感到非常困惑,很多东西都已被弃用,并且没有提到什么可以替代它们。我将描述我绝望的步骤,等待有人能够向我展示一条道路。
让我们从头开始...
对 Window 中的视频捕获一无所知,我首先搜索合适的库。经过一番谷歌搜索后,我发现 Windows 中有四个用于捕获视频的主要库。
我们来观察一下:
Video for Windows
不幸的是,该库被标记为已弃用,但它似乎仍然有效。我写了“不幸的是”,因为我认为这是唯一易于使用的。查看来自摄像机的视频只需要几行代码。我唯一想念的是“TakePhoto”功能。您可以使用 VFW 将视频或单个帧捕获为 avi 文件。或者我错过了什么?
DirectShow
这是一个复杂得多的库。您需要数百行代码才能查看视频预览。但您可以在 MS Docs 上获取此代码。好的,现在我有了视频预览,我只需要拍照。人们会认为这应该只是一个函数调用。但功能在哪里呢?我没有找到。
您可以简单地使用GetCurrentImagefrom IVMRWindowlessControl,但这仅需要低分辨率预览中的一帧。如果您设置较高的预览分辨率,视频会不流畅。
我可以实现的最佳方法来自一篇名为“从静态图像 Pin 捕获图像”的文章,此处提供https://learn.microsoft.com/en-us/windows/desktop/directshow/capturing-an-image-from- a-静态图像-pin。当我找到这个网站时,我以为我赢了,我的任务几乎完成了。但事实并非如此。
本文给您的第一个建议是不要使用它:“从设备获取静态图像的推荐方法是使用 Windows Image Acquisition (WIA) API。有关详细信息,请参阅平台中的“Windows Image Acquisition” SDK 文档。但是,您也可以使用 DirectShow 来捕获图像。” 我尝试探索 WIA。但这在 Vista 上就不起作用了。我继续研究这篇文章。
一切似乎都很清楚,但您需要实现继承ISampleGrabberCB标记为已弃用的类https://learn.microsoft.com/en-us/windows/desktop/directshow/isamplegrabbercb。为什么????哪里可以找到替代方案?
我在这里找到了一个可接受的解决方案https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/2ab5c212-5824-419d-b5d9-7f5db82f57cd/qedith-missing-in-current-windows-sdk-v70?论坛=windowsdirectshowdevelopment。您需要添加来自older SDK 的头文件。(顺便说一句,这是一个近十年前的建议。)在我使用此标头编译应用程序后,我能够读取高分辨率图片,但我需要等待几秒钟,这是不可接受的。我知道问题不在相机中,因为它在相机应用程序中工作。此外,图像是通过函数SampleCB而不是函数获得的BufferCB …
在我的程序中,我需要"回放"或"解析"窗口元文件(WMF和EMF).我已经通过MSDN和Google挖掘了,我最接近的是图形.EnumerateMetafile方法.我可以让它工作,因为我的EnumerateMetafileProc回调被调用,然后我可以调用PlayRecord.缺少的是如何从该回调中获取有用的数据.
我查看的示例:http://msdn.microsoft.com/en-us/library/ms142060.aspx
回调有一个recordType参数,它是一个ENUM.这看起来很有用,除了它们似乎无法将数据转换为任何有用的类型.
我的目标是回放WMF/EMF的创建,这样我就可以对具有类似(DrawLine,DrawPoint,DrawArc)等方法的专用图形类进行函数调用.从某种意义上说,我正在以完全不同的格式(转换)重新创建WMF/EMF绘图.
非常感谢任何帮助.
如何将一个WMF文件转换为具有自定义输出分辨率的PNG / BMP / JPG格式?
示例:获取WMF文件并输出2000x2000 px的PNG文件。
提前致谢。
我正在尝试通过WUSA.exe添加WMF以在Windows 7上使用powershell 3.0.这将重命名计算机,因为我找不到正确的NETDOM.Exe安装程序,并且WMI命令不起作用.
WUSA静默安装程序给出了2359302错误.
这是什么意思?
.Net 4.0已经安装.
这样做时,为什么线路等不会被消除锯齿?
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以获得抗锯齿功能? …