C# と Visual Studio 2010 を使用して、色付きの emf からグレースケールの emf を作成するにはどうすればよいですか? レコードを列挙して、何らかの方法で色の設定を変更する必要がありますか?
その結果、新しい emf イメージが必要になります。
これは、オープン ソースの emf 読み取り/書き込みユーティリティです。GDI+ を使用してベクター コンテンツを保持することはできないと思います。したがって、これが役立つことを願っていますが、考えられるすべてのEMFケースをリモートでテストしたわけではありません.
これは、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");
}