Windowsメタファイルの処理
Windowsメタファイル形式は、ベクトルグラフィックスとラスターグラフィックスの両方を含むことができるイメージファイル形式です。 この形式は、グラフィックスデータをメモリまたはディスク上のファイルに格納するために使用されます。 メタファイルは、画面にイメージを表示するために実行する必要があるWindowsグラフィックスデバイスインターフェイス(GDI)に関数呼び出しのリストを格納します。 システムは、これらのコマンドを表示コンテキストで解釈して実行します。
以前は、WindowsメタファイルはMicrosoft Wordでサポートされている唯一のベクターイメージ形式でした。 Microsoft WordはSVG形式もサポートするようになりましたが、メタファイル形式は依然としてWord文書で一般的に使用されています。 また、Metafileは、Microsoft Visioなどの他のアプリケーションの交換形式になる可能性があります。 基本的に、メタファイルの主な目的はWindowsアプリケーション間のグラフィカル情報の交換を確実にすることです。
Windowsメタファイルには3バージョンがあります:
- WMF-ストアは16ビットGDIを呼び出します。
- EMF-ストアはWin32/GDIを呼び出します。
- EMF+メタファイルはGDI+への呼び出しを格納します。 EMF+メタファイルもデュアルであり、EMFとEMF+の両方の部分で同じグラフィックを記述することができます。
Windowsメタファイルの既存の問題は、文書が通常保存されるほとんどの非Word形式ではサポートされていないことです。 したがって、メタファイル形式を他のラスタ形式またはベクトル形式に変換する必要があります。 Windowsメタファイルをgdi+に渡すだけで.NETのラスターイメージに変換するのは簡単ですが、Gdi+でもメタファイルからベクターグラフィックスを抽出する機能が提供されていないため、他のプラットフォームでは不可能です。 これらの問題を解決するために、Aspose.Wordsは独自のWindowsメタファイルプレーヤーを実装しており、すべてのプラットフォームでベクタグラフィックスとラスタグラフグラフィックスの両方をメタファイル形式で再生することができます。
Aspose.Wordsメタファイルプレーヤーの制御
MetafileRenderingOptionsクラスを使用すると、メタファイルプレーヤーを制御できます。 たとえば、ビットマップに変換するときに特別な意味を持つRenderingModeプロパティを使用してメタファイルイメージをレンダリングする方法を決定できます(MetafileRenderingOptions
ビットマップへの保存は.NET以外のプラットフォームでは動作が異なります。 .NETGDI+レンダリングは、最も複雑なメタファイル形式であってもほぼ完全に機能する参照ですが、他のプラットフォームでは問題が発生したり、まったくサポー
ラスター操作のサポート
ラスター操作は複雑なメタファイル機能であり、現在サポートされている機能は限られています。 ラスター操作は、WMFおよびEMFメタファイル形式で使用できます。 EMF+メタファイル形式はラスター操作を直接使用しませんが、EMFパーツ、埋め込みWMF、またはEMFメタファイルを含めることができます。
バイナリラスタ操作と三項ラスタ操作があります:
- バイナリラスター操作は、線や曲線の描画などのペン描画コマンドに適用されます。 線を描画するとき、ペンの色は、16進数の色値で指定されたビット単位の論理演算を使用して、宛先ビットマップの色(デバイス表面上の対応するピク 次の画像の例は、20種類のカラーバーに適用された16個のバイナリラスター操作すべての効果を示しています。 垂直カラーバーは最初に描画され、水平バーは各バイナリラスター操作が適用された後に描画されます。 単純なケースでは、R2_BLACKは黒を描画し、R2_NOTは色を反転し、R2_NOPは背景を変更せず、R2_WHITEは白を描画します。

- ビットマップイメージを描画するときには、三項ラスタ操作が適用されます。 対応するビットマップイメージピクセル、ブラシ、および宛先ビットマップの色を、指定されたhex色値でビット単位の論理演算を使用して結合します。 三項ラスタ演算を使用する最も一般的な目的の1つは、透明度のエミュレーションです。 以下の例で提供されている画像は、アイコンの透明度をエミュレートする方法を示しています。 ビットマップには、b/wマスクビットマップとカラービットマップの2種類があります。 まず、SRCANDラスタ操作でマスクビットマップが描画されます。 不透明なアイコン領域を白黒に変更し、透明な領域は変更されません。 次に、SRCINVERTラスター操作で2番目のビットマップが描画されます。 黒の領域にカラーピクセルが表示され、透明な領域は変更されません。

ラスター操作をベクターグラフィックスに直接変換することはできません。 Aspose.Wordsラスタ操作の影響を受けるデバイスサーフェスを部分的にラスタライズすることにより、ラスタ操作をエミュレートします。 この目的のために、EmulateRasterOperationsプロパティが使用されます。
以下の例では、メタファイルレコードの一部をベクターグラフィックスに正しくレンダリングできない場合に、Aspose.Wordsがメタファイルをビットマップにレンダーする方法を示しています:
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
class HandleDocumentWarnings : public IWarningCallback { | |
using ThisType = HandleDocumentWarnings; | |
using BaseType = IWarningCallback; | |
using ThisTypeBaseTypesInfo = ::System::BaseTypesInfo<BaseType>; | |
RTTI_INFO(ThisType, ThisTypeBaseTypesInfo); | |
public: | |
System::SharedPtr<WarningInfoCollection> mWarnings; | |
void Warning(System::SharedPtr<WarningInfo> info) override; | |
HandleDocumentWarnings(); | |
}; | |
void HandleDocumentWarnings::Warning(System::SharedPtr<WarningInfo> info) | |
{ | |
//For now type of warnings about unsupported metafile records changed from DataLoss/UnexpectedContent to MinorFormattingLoss. | |
if (info->get_WarningType() == WarningType::MinorFormattingLoss) | |
{ | |
std::cout << "Unsupported operation: " << info->get_Description().ToUtf8String() << std::endl; | |
mWarnings->Warning(info); | |
} | |
} | |
HandleDocumentWarnings::HandleDocumentWarnings() : mWarnings(System::MakeObject<WarningInfoCollection>()) | |
{ | |
} | |
void RenderMetafileToBitmap(System::String const& inputDataDir, System::String const& outputDataDir) | |
{ | |
// Load the document from disk. | |
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"PdfRenderWarnings.doc"); | |
System::SharedPtr<MetafileRenderingOptions> metafileRenderingOptions = System::MakeObject<MetafileRenderingOptions>(); | |
metafileRenderingOptions->set_EmulateRasterOperations(false); | |
metafileRenderingOptions->set_RenderingMode(MetafileRenderingMode::VectorWithFallback); | |
// If Aspose.Words cannot correctly render some of the metafile records to vector graphics then Aspose.Words renders this metafile to a bitmap. | |
System::SharedPtr<HandleDocumentWarnings> callback = System::MakeObject<HandleDocumentWarnings>(); | |
doc->set_WarningCallback(callback); | |
System::SharedPtr<PdfSaveOptions> saveOptions = System::MakeObject<PdfSaveOptions>(); | |
saveOptions->set_MetafileRenderingOptions(metafileRenderingOptions); | |
doc->Save(outputDataDir + u"PdfSaveOptions.HandleRasterWarnings.pdf", saveOptions); | |
} |
メタファイルのフォールバック設定
Aspose.Wordsは、最も複雑またはまれな多くのメタファイル機能をサポートしていません。 ユーザーはIWarningCallBackインターフェイスを実装し、警告メッセージを受け取ることができます。 Aspose.Wordsがメタファイル内でサポートされていない機能を検出した場合、WarningSourceで警告メッセージが発行されます。Metafile. この場合、Aspose.Wordsは異なるタイプのメタファイルプレーヤへのフォールバックを実行することができます。 フォールバックに関する警告メッセージも発行されます。
まず、Aspose.Wordsは、RenderingModeプロパティによって制御されるベクターメタファイルプレーヤーからラスターへのフォールバックを実行します。 フォールバック機能が無効になっている場合、Aspose.Wordsはサポートされていない機能の代わりに一部の置換グラフィックスをレンダリングしようとします。
Aspose.Wordsは、.NETでgdi+を使用してメタファイルをラスターに正常に再生します。
次に、EMF+デュアルメタファイルがEMF+パートをEMFパートに再生することからフォールバックするオプションがあります。 これはEmfPlusDualRenderingModeによって制御されます。 EMFパートを再生するときにいくつかの問題が発生した場合は、ラスターへのフォールバックも実行される可能性があります。
ラスター操作については、EmulateRasterOperations が無効になっている場合、ラスター操作はサポートされていないとみなされ、ビットマップ メタファイル プレーヤーが有効になっている場合は、そのプレーヤーへのフォールバックがトリガーされます。したがって、ラスター操作を含むメタファイルがあり、ラスター操作エミュレーションを使用せずに、代替グラフィックスを含むベクター出力を取得する場合は、MetafileRenderingMode.Vector を選択します。