问题标签 [metafile]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - EMF 文件的 DPI
EMF 文件是否有可以设置的 DPI?我有一个允许以多种格式(包括 EMF)保存图像的应用程序。我允许用户指定图像的分辨率/DPI。但是,我找不到在 C# 中为 MetaFile 执行此操作的方法。这是可能的还是 EMF 没有 DPI,因为它是矢量图形格式?
c# - 反序列化元文件
我有一个适用于Enhanced Metafiles的应用程序。
我能够创建它们,将它们作为 .emf 保存到磁盘并再次加载它们没问题。
我通过使用 gdi32.dll 方法和DLLImport 属性来做到这一点。
但是,为了启用版本容错序列化,我想将元文件与其他数据一起保存在对象中。
这实质上意味着我需要将元文件数据序列化为字节数组,然后再次反序列化以重建元文件。
我遇到的问题是反序列化数据似乎以某种方式损坏,因为我用来重建元文件的方法引发了“参数无效异常”。
至少像素格式和分辨率已经改变。
代码使用如下。
应用程序创建一个元文件图像并将其传递给下面的方法。
此时,dataArray 被插入到对象中并使用 BinaryFormatter 进行序列化。
然后使用 BinaryFormatter 和从对象中检索的 dataArray 再次反序列化保存的文件。
然后使用以下方法使用 dataArray 重建原始 Metafile。
然后将重建的元文件作为 .emf(模型)保存到磁盘,此时 Presenter 可以访问它以进行显示。
问题是保存到磁盘失败。如果在序列化之前使用相同的方法保存原始元文件,则一切正常。所以在序列化/反序列化期间数据发生了一些事情。
事实上,如果我在调试器中检查 Metafile 属性,我可以看到 ImageFlags、PropertyID、分辨率和像素格式发生了变化。
原始 Format32bppRgb 更改为 Format32bppArgb
原始分辨率 81 更改为 96
我已经通过谷歌和 SO 进行了搜索,这帮助我走到了这一步,但我现在卡住了。
有没有人有足够的元文件/序列化经验来帮助..?
编辑:如果我直接序列化/反序列化字节数组(不嵌入另一个对象),我会遇到同样的问题。
vb.net - VB 代码到 Delphi 的转换(它将从 EMF 文件中提取图像)
在网上搜索时,我在 VB 中获得了几行代码,用于从 EMF 文件中提取图像。
我试图将其转换为 Delphi 但不起作用。
帮助我将此代码转换为delphi。
delphi - 在 Delphi 中的 TCanvas 上绘制透明的 TMetaFile
我想在 Canvas 上绘制一个透明的 TMetaFile,用于打印水印。
问题是 AlphaBlend 函数不会将 TMetaFile.Handle 识别为源,因为它期望画布句柄。
我创建了一个具有透明度的 32 位位图,但在其上绘制会强制使用白色背景,因此在 Canvas 上您可以看到一个 alpha 混合矩形。如何在屏幕/打印机画布上绘制透明的 TMetaFile?
TMetaFile 肯定是透明的,我已经在使用非标准背景颜色的 IE 的简单网页上对其进行了测试。源代码:
image - 如何区分原始 .BMP/.EMF 图片文件与处理后的 .BMP/.EMF 文件?
总结:
计算直截了当地指出:一张 3289 X 4570 X 32bpp 的 .BMP 图片大约需要 53MB。相同大小但24bpp的图片大约需要43MB,16bpp的图片大约需要28MB。在我的情况下,必须将 ChemDraw 处理的图片文件从 24bpp 转换为 16bpp。
进一步比较两个文件的十六进制数据,可以更详细地了解 ChemDraw 处理的图片和原始图片之间的差异。具体来说,ChemDraw 存储“EMF_STRETCHDIBITS”而不是“EMF_STRETCHBLT”。需要补充的是,在将像素复制到 TMetaFile/TMetaFileCanvas 时,可以通过调用 StretchDIBits 来完成“EMF_STRETCHDIBITS”。还应注意,“EMF_STRETCHDIBITS”的像素应与“EMF_STRETCHBLT”的像素相同。
不幸的是,直到现在我还没有弄清楚 ChemDraw 究竟是如何处理和存储粘贴的图片的。也就是说,我没有发现为什么 ChemDraw 存储的像素与我通过编程可以获得的不同。
PS:我稍后会就这个问题投票赞成答案,因为我目前没有足够的声誉。感谢所有好心评论的人!
===</p>
你好,
非常感谢您的时间!
假设我有一张名为“sample_original.bmp”的图片。文件大小为 3289 X 4570、43MB。然后我执行以下操作将其转换为 .EMF 文件(增强型 Windows 元文件):
方法 1,通过制作一个小的内部 Delphi 程序: (1) 加载 .BMP 图像文件。(2) 获取TMetaFile(TMetaFileCanvas) 的Canvas (3) 调用Canvas.Draw 复制图像。(4) 保存为.EMF文件,命名为“sample_original_bmp2emf_method1.emf”
方法二:(1)在mspaint程序中打开.BMP图片文件,选择“全选”,选择“复制”。(2) 打开一个名为 ChemDraw 的外部程序,新建文件,然后选择“粘贴”。(3) 然后我选择将其保存为与 XML 兼容的 .cdxml 格式,命名为“sample_original_bmp2emf_method2.cdxml”。(4) 图片的内容(可能改变或退化?)现在保存在sample_original_bmp2emf_method2.cdxml 文件中。格式是 Base64 编码的 zlib 压缩格式。(5)我可以对XML字符串进行Base64解码,zlib-解压,保存到图片文件“sample_original_bmp2emf_method2.emf”中。
sample_original_bmp2emf_method2.emf 的文件大小比 sample_original_bmp2emf_method1.emf 小 15 MB,但宽度和高度保持不变。此外,如果我在 mspaint 程序中打开“sample_original_bmp2emf_method2.emf”并将其保存回 .bmp 文件格式,则会弹出一条警告说透明信息正在丢失。
您能否帮助评论如何区分“sample_original_bmp2emf_method1.emf”和“sample_original_bmp2emf_method2.emf”?图片变小是因为它的质量下降了吗?换句话说,这个外部程序可能会对我的原始图片进行哪些更改?
最良好的祝愿,
上面提到的文件可以在以下网址下载:
http://www.rapidspread.com/file.jsp?id=2ighvzoci8
PS:我相信 Andreas Rejbrand 已经很友好地做出了回答,然后我给出了我的评论。但我现在看不到那些。它应该是系统的正常行为吗?o_o
c# - 如何通过拖放在 Winform 中将元文件转换为图像
我在 C# 中使用框架 .NET 3.5 开发了一个 Winform 应用程序。我想允许用户从 Word 2007 中拖放图片。基本上,用户打开 docx,选择一张图片并将它们拖放到我的 PictureBox 中。
我已经用我的桌面和 Internet 页面上的图片文件完成了相同的过程,但我无法解决我的 Metafile 问题。我做了很少的研究,但我没有找到任何解决我的问题的解决方案。
这是我在 Drag&Drop 事件中所做的:
我可以使用以下代码获取流: (Stream)e.Data.GetData(DataFormats.MetafilePict) 但我不知道如何将其转换为 Metafile 或更好的 Image 对象。
如果您有任何想法或解决方案,我很乐意阅读。
谢谢,
c# - 为什么我的元文件“丢失”位图?
最近我在用元文件绘制东西时发现了一个错误。现在我不确定我是否做错了什么,或者元文件本身的绘制中是否存在错误:
在通过 PlayEnhMetafile 在另一个元文件本身上绘制的元文件上绘制图像时,我会在很远的下方或右侧丢失图像。我想这与屏幕坐标有关(我运行双屏 1280*1024,所以 2560*1024),因为图像开始消失的底部通道约为 500。
这是我为更具体地向您展示问题而创建的一些示例代码。(您可以使用此代码替换新创建的 Windows C# 项目的 Form1.cs 并在其上放置一个按钮)
如您所见,使用 PlayEnhMetaFile 函数会导致我丢失三个图像之一。有任何想法吗?
winapi - 无需像素舍入即可将增强型图元文件转换为 Windows 图元文件的正确方法
当我将增强型元文件(通过 C# 中的 GDI+ 构建)转换为旧式 Windows 元文件时,结果非常粗糙,显然是因为坐标被四舍五入到最近的屏幕像素。如果我通过任何一个转换,我会看到这个
GetWinMetaFileBits(emfh, bits_l, bits, MM_ANISOTROPIC, GetDC(0));
或使用 GDI+ 的 Metafile::EmfToWmfBits。罪魁祸首可能是正在使用的屏幕 DC。 这篇文章建议使用打印机 DC,它适用于我,但如果用户没有安装打印机,显然将无法使用。有没有更好的办法?为此,我考虑过创建一个高分辨率的内存 DC,但我找不到合适的文档,而且我也担心使用的 RAM。
winapi - GetWinMetaFileBits() 的参考 DC 参数究竟是做什么用的?
我的印象是经典的 Win16 元文件没有嵌入的大小或分辨率信息(除非有METAFILEPICT
标题或类似信息) -GetWinMetaFileBits()
参考 DC 有什么用?
windows - 有没有一种有效的方法将 a3d 场景转换为 2d 增强元文件
我正在使用 Delphi2010 和 OpenGL 开发 CAD 应用程序。目前,我正在开发一个将当前视图导出到图像文件的模块。
这对于光栅格式非常简单(将场景渲染到所需尺寸的屏幕外缓冲区,将缓冲区写入磁盘),但我也希望能够将我的场景的轴对齐 2d 视图导出为矢量格式,最好是 Winows EMF .
我正在考虑在软件中计算我的转换和投影,或者滥用 glFeedback 功能。由于我必须实现自己的 z 缓冲,这种方法似乎相当费力,更不用说在没有硬件加速的情况下渲染复杂场景时可能面临的性能问题。
由于我的 Google-fu 没有导致结果,我想问一下你们中是否有人遇到过这个问题(将 Opengl-3d-scene 转换为 2d-Vectorimage),或者是否有任何已知的 3rd-party 库可以实现这。