首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将emf图像灰度化

如何将emf图像灰度化
EN

Stack Overflow用户
提问于 2013-07-21 02:30:07
回答 1查看 809关注 0票数 1

使用C#和Visual Studio2010,如何从彩色电动势中生成灰度电动势?我是否应该枚举记录并以某种方式更改颜色设置?

因此,我想要有一个新的emf图像。

EN

回答 1

Stack Overflow用户

发布于 2013-07-21 03:48:49

这是一个开源的emf读/写实用程序。我不认为使用GDI+可以在保留矢量内容的情况下做到这一点。所以希望这能帮助你,但我还没有远程测试所有可能的emf案例。

https://wmf.codeplex.com/

这对wmf和emf格式都有效。我们可以将Oxage.Wmf策略与其他帖子中的策略相结合,该策略本质上是在创建钢笔或画笔时对其重新着色,以便用该钢笔或画笔绘制的任何内容都应该是灰色的。

代码语言:javascript
复制
using Oxage.Wmf;
using Oxage.Wmf.Records;
using Oxage.Wmf.Objects;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MetafileTest
{
    public class GrayMap
    {
        public void GrayFile(string sourceFile, string destFile){

            WmfDocument wmf = new WmfDocument();
            wmf.Load(sourceFile);

            foreach (var record in wmf.Records)
            {
                if (record is WmfCreateBrushIndirectRecord)
                {
                    var brush = record as WmfCreateBrushIndirectRecord;
                    brush.Color = Gray(brush.Color);
                }
                else if (record is WmfCreatePenIndirectRecord)
                {
                    var pen = record as WmfCreatePenIndirectRecord;
                    pen.Color = Gray(pen.Color);
                }
                else if (record is WmfCreatePalette) {
                    var pal = record as WmfCreatePalette;
                    foreach (PaletteEntry entry in pal.Palette.PaletteEntries) {
                        Color test = Color.FromArgb(entry.Red, entry.Green, entry.Blue);
                        Color grayTest = Gray(test);
                        entry.Red = grayTest.R;
                        entry.Green = grayTest.G;
                        entry.Blue = grayTest.B;
                    }
                }
            }
            wmf.Save(destFile);

        }

        public Color Gray(Color original) { 
            int r = (int)(original.R*0.2989);
            int g = (int)(original.G*0.5870);
            int b = (int)(original.B*0.1140);
            Color result = Color.FromArgb(r, g, b);
            return result;

        }

    }
}

这是通过下面的填充蓝色矩形的超级简单的案例来测试的,所以至少对于简单的案例来说,这是可行的。它可能无法处理所有情况,但在这种情况下,您可能可以扩展原始源代码以满足您的需求,因为它是开源的。

代码语言:javascript
复制
    private void button1_Click(object sender, EventArgs e)
    {
        var wmf = new WmfDocument();
        wmf.Width = 1000;
        wmf.Height = 1000;
        wmf.Format.Unit = 288;
        wmf.AddPolyFillMode(PolyFillMode.WINDING);
        wmf.AddCreateBrushIndirect(Color.Blue, BrushStyle.BS_SOLID);
        wmf.AddSelectObject(0);
        wmf.AddCreatePenIndirect(Color.Black, PenStyle.PS_SOLID, 1);
        wmf.AddSelectObject(1);
        wmf.AddRectangle(100, 100, 800, 800);
        wmf.AddDeleteObject(0);
        wmf.AddDeleteObject(1);
        wmf.Save("D:\\test.emf");
    }

    private void button2_Click(object sender, EventArgs e)
    {
        GrayMap map = new GrayMap();
        map.GrayFile("D:\\test.emf", "D:\\test2.emf");
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17765362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档