1

C# と Visual Studio 2010 を使用して、色付きの emf からグレースケールの emf を作成するにはどうすればよいですか? レコードを列挙して、何らかの方法で色の設定を変更する必要がありますか?

その結果、新しい emf イメージが必要になります。

4

1 に答える 1

0

これは、オープン ソースの emf 読み取り/書き込みユーティリティです。GDI+ を使用してベクター コンテンツを保持することはできないと思います。したがって、これが役立つことを願っていますが、考えられるすべてのEMFケースをリモートでテストしたわけではありません.

https://wmf.codeplex.com/

これは、wmf 形式と emf 形式の両方で機能します。Oxage.Wmf 戦略を他の投稿の戦略と組み合わせることができます。これは、作成時にペンまたはブラシの色を本質的に変更して、そのペンまたはブラシで描画されたものをすべてグレーにするものです。

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;

        }

    }
}

これは、青色の四角形を塗りつぶす次の非常に単純なケースでテストされているため、少なくとも単純なケースでは機能します。すべてのケースに対応できるわけではありませんが、そのような場合は、オープン ソースであるため、元のソースをニーズに合わせて拡張できる可能性があります。

    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");
    }
于 2013-07-20T19:48:48.727 に答える