想做个读取矢量图wmf的最简单小程序,如何作手啊?

flyskytoday 2017-11-28 10:58:45
用C#做个读取矢量图wmf的小程序,越简单越好,不要gdi+,
只要能读取,显示,并且有放大缩小功能即可
请大家帮忙,谢谢
...全文
418 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2017-11-29
  • 打赏
  • 举报
回复
不知是什么原因,我这里无法执行你的代码(VS2010)在 Metafile(文件) 处出现异常
所以只能给另一种显示方法
namespace testWmf
{
public partial class Form2 : Form
{
private Metafile metafile1;
private Graphics.EnumerateMetafileProc metafileDelegate;
private Point destPoint;
private int initX = 0;
private int initY = 0;

public Form2()
{
InitializeComponent();
//metafile1 = new Metafile(@"641单元601室.wmf");//emf,emf+都可以

//metafileDelegate = new Graphics.EnumerateMetafileProc(MetafileCallback);
//destPoint = new Point(initX, initY);

}
//生成矢量图
protected override void OnLoad(EventArgs e)
{
string filePath = @"face.emf";
Bitmap bmp = new Bitmap(220, 220);
Graphics gs = Graphics.FromImage(bmp);
Metafile mf = new Metafile(filePath, gs.GetHdc());
Graphics g = Graphics.FromImage(mf);
g.SmoothingMode = SmoothingMode.AntiAlias;

g.FillEllipse(Brushes.Gray, 0, 0, 100, 100);
g.DrawEllipse(Pens.Black, 0, 0, 100, 100);
g.DrawArc(new Pen(Color.Red, 10), 20, 20, 60, 60, 30, 120);

g.Save();
g.Dispose();
mf.Dispose();
}
//绘图
protected override void OnPaint(PaintEventArgs e)
{
var g = e.Graphics;
var im = Bitmap.FromFile(@"face.emf");
g.DrawImage(im, 10, 10, im.Width * k, im.Height * k);
//e.Graphics.EnumerateMetafile(metafile1, destPoint, metafileDelegate);
}
//废弃
private bool MetafileCallback(EmfPlusRecordType recordType, int flags, int dataSize, IntPtr data, PlayRecordCallback callbackData)
{
byte[] dataArray = null;
if (data != IntPtr.Zero)
{
dataArray = new byte[dataSize];
Marshal.Copy(data, dataArray, 0, dataSize);
}

metafile1.PlayRecord(recordType, flags, dataSize, dataArray);
return true;
}
float k = 1;
//缩小
private void button2_Click(object sender, EventArgs e)
{
k+=0.1f;
Invalidate();
}
//放大
private void button1_Click(object sender, EventArgs e)
{
k -= 0.1f;
if (k < 1) k = 1;
Invalidate();
}
}
}
flyskytoday 2017-11-29
  • 打赏
  • 举报
回复
引用 8 楼 xuzuning 的回复:
是吗?我怎么不可以?把的例图发上来看看
这个就是上面代码,很简单,现在问题是如何放大缩小,,可难了
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.Drawing.Imaging;
using System.Runtime.InteropServices;

namespace testWmf
{
    public partial class Form2 : Form
    {
        private Metafile metafile1;
        private Graphics.EnumerateMetafileProc metafileDelegate;
        private Point destPoint;
        private int initX = 0;
        private int initY = 0;

        public Form2()
        {
            InitializeComponent();
            metafile1 = new Metafile(@"F:\tmp\testDog\testWmf\641单元601室.wmf");//emf,emf+都可以

            metafileDelegate = new Graphics.EnumerateMetafileProc(MetafileCallback);
            destPoint = new Point(initX, initY);

        }

        private void Form2_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.EnumerateMetafile(metafile1, destPoint, metafileDelegate);
        }

        private bool MetafileCallback( EmfPlusRecordType recordType, int flags, int dataSize, IntPtr data, PlayRecordCallback callbackData)
        {
            byte[] dataArray = null;
            if (data != IntPtr.Zero)
            {
                dataArray = new byte[dataSize];
                Marshal.Copy(data, dataArray, 0, dataSize);
            }

            metafile1.PlayRecord(recordType, flags, dataSize, dataArray);
            return true;
        }
    }
}
xuzuning 2017-11-28
  • 打赏
  • 举报
回复
贴出来看看
flyskytoday 2017-11-28
  • 打赏
  • 举报
回复
看了一个C#操作wmf矢量图的,很简单的,关键就是自己没做过,放大缩小如何来弄....哎
xiaoyu5425 2017-11-28
  • 打赏
  • 举报
回复
AE二次开发
xuzuning 2017-11-28
  • 打赏
  • 举报
回复
基本简介
图元文件。图元文件的扩展名包括.wmf和.emf两种。
它们是属于矢量类图形,是由简单的线条和封闭线条(图形)组成的矢量图,其主要特点是文件非常小,可以任意缩放而不影响图像质量。
Wmf是Windows Metafile 的缩写,简称图元文件,它是微软公司定义的一种Windows​平台下的图形文件格式。

wmf格式文件的特点如下:
1. wmf格式文件是Microsoft Windows操作平台所支持的一种图形格式文件,目前,其它操作系统尚不支持这种格式,如Unix、Linux等。
  它们是属于矢量类图形,是由简单的线条和封闭线条(图形)组成的矢量图,其主要特点是文件非常小,可以任意缩放而不影响图像质量。
它们是属于矢量类图形,是由简单的线条和封闭线条(图形)组成的矢量图,其主要特点是文件非常小,可以任意缩放而不影响图像质量。
2. 与bmp格式不同,wmf格式文件是设备无关的,即它的输出特性不依赖于具体的输出设备。
3. 其图象完全由Win32 API所拥有的GDI函数来完成。
4. wmf格式文件所占的磁盘空间比其它任何格式的图形文件都要小得多。
5. 在建立图元文件时,不能实现即画即得,而是将GDI调用记录在图元文件中,之后,在GDI环境中重新执行,才可显示图象。
6. 显示图元文件的速度要比显示其它格式的图象文件慢,但是它形成图元文件的速度要远大于其它格式。
不知道你 不要gdi+ 的依据是什么?
xuzuning 2017-11-28
  • 打赏
  • 举报
回复
是吗?我怎么不可以?把的例图发上来看看
flyskytoday 2017-11-28
  • 打赏
  • 举报
回复
引用 6 楼 xuzuning 的回复:
您示例的代码能运行吗?
可以正常运行
xuzuning 2017-11-28
  • 打赏
  • 举报
回复
您示例的代码能运行吗?
flyskytoday 2017-11-28
  • 打赏
  • 举报
回复
引用 4 楼 xuzuning 的回复:
贴出来看看
https://msdn.microsoft.com/zh-cn/library/vs/alm/system.drawing.imaging.metafile.playrecord(v=vs.80)
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;

// for Marshal.Copy
using System.Runtime.InteropServices; 

public class Form1 : Form
{
    private Metafile metafile1;
    private Graphics.EnumerateMetafileProc metafileDelegate;
    private Point destPoint;
    public Form1()
    {
        metafile1 = new Metafile(@"C:\Test.wmf");
        metafileDelegate = new Graphics.EnumerateMetafileProc(MetafileCallback);
        destPoint = new Point(20, 10);
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        e.Graphics.EnumerateMetafile(metafile1, destPoint, metafileDelegate);
    }
    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);
        }

        metafile1.PlayRecord(recordType, flags, dataSize, dataArray);

        return true;
    }

    static void Main()
    {
        Application.Run(new Form1());
    }
}
代码下载链接: https://pan.quark.cn/s/a22871fb98ec 在当前高度竞争的商业环境中,个体经营者与小型仓储管理者正承受着市场压力和不断攀升的运营开支。为了有效应对这些挑战,他们迫切需要一套能够提升工作效率和经营成效的管理工具。基于此需求,一款免费的正版单机版进销存管理软件应时而生,为个体经营者和小型仓储单位提供了一站式的解决方案。 进销存管理软件是企业进行商品流通管理的关键系统,其功能涵盖了商品采购、销售及库存管理这三大核心业务流程。正版免费进销存软件的推出,不仅减轻了企业的财务负担,同时也增强了管理的便捷性和数据记录的精确度。 进货管理构成了整个进销存框架的基础。免费进销存软件配备了详尽的进货管理模块,能够完整记录每次采购的详细信息,包括供应商资料、采购量、单价和总费用等,这对于分析采购成本和控制预算具有重要作用。用户可以利用软件迅速创建采购订单,并对货物的到货状态进行监控。此外,软件还提供采购数据分析工具,协助管理者洞察市场趋势,从而制定更为科学合理的采购计划。 销售管理是进销存软件的重点功能。通过运用此类软件,用户可以精确记录每一笔销售活动,涵盖客户资料、商品规格、销售价格和折扣信息。软件能够自动生成销售凭证,简化交易过程,显著提升工作效率。再者,销售统计分析功能使管理者能够全面了解销售状况,准确识别畅销及滞销产品,进而优化销售策略,增加销售量和盈利。 库存管理对于保障业务连续性和控制成本至关重要。正版免费进销存管理软件能够实时更新库存信息,并对库存水平低于安全线的商品发出警示,有效预防缺货问题。同时,用户可以随时查询库存详情,并执行定期的库存盘点,减少不必要的库存积压,加速资金周转。软件内置的库存调拨和报废处理功能,使库存管...
内容概要:本文系统性地介绍了基于灰狼优化算法(GWO)优化BP神经网络的风电功率预测方法,并提供了完整的Matlab代码实现。该方法通过GWO算法全局寻优能力强的特点,优化BP神经网络的初始权重与阈值,有效缓解了传统BP网络易陷入局部最优、收敛速度慢等问题,从而显著提升风电功率预测的精度与模型稳定性。文中详尽阐述了数据预处理、适应度函数设计、GWO-BP模型构建流程及预测结果评估等关键技术环节,同时列举了多个智能优化算法与机器学习相结合的科研方向,涵盖电力系统优化、新能源预测、路径规划、信号处理等多个前沿领域,展现了广阔的应用前景与研究价值。; 适合人群:具备Matlab编程基础与机器学习基础知识,从事新能源发电预测、智能优化算法研究或电力系统分析的高校研究生、科研人员及工程技术开发者。; 使用场景及目标:①应用于风电场功率预测系统,支持电网调度决策与能源管理优化;②为GWO优化神经网络的建模范式提供可复现的技术参考,适用于其他时序预测任务的研究与拓展;③帮助科研人员深入理解智能算法与神经网络融合的设计思路与实现路径。; 阅读建议:建议读者结合提供的Matlab代码与网盘资料,按照文档结构循序渐进学习,重点关注GWO-BP的优化机制与参数调优策略,动手调试并尝试迁移至光伏预测、负荷预测等相似场景,同时借鉴文中提出的创新方向以启发后续科研工作。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧