WPF/WinFormsで提供されるRichTextBoxを簡単にWORDのような機能を提供してくれますが、画像挿入やテーブル追加の機能がありません。
これらの機能を実現するには、RTFの仕様に従い文字列でデータを追加する必要があります。
コードは以下のようになります。
private const string RTF_HEADER = @"{\rtf1\ansi\ansicpg1252\deff0\deflang1033";
private const string RTF_DOCUMENT_POST = @"\cf0\fs17}";
public void InsertImage(RichTextBox rtfbox, Image _image) {
StringBuilder _rtf = new StringBuilder();
// Append the RTF header
_rtf.Append(RTF_HEADER);
// Create the Windows Metafile and append its bytes in HEX format
_rtf.Append(InsertJpgImage(_image));
//Close RTF header
_rtf.Append(RTF_IMAGE_POST);
rtfbox.SelectedRtf = _rtf.ToString();
}
private static string GetWidthAndHeight(Image image, float dpiX, float dpiY){
float width = (float)image.Width / dpiX;
float height = (float)image.Height / dpiY;
int picw = (int)(width * 2540);
int pich = (int)(height * 2540);
int picwgoal = (int)(width * 1440);
int pichgoal = (int)(height * 1440);
return "\\picw" + picw + "\\pich" + pich + "\\picwgoal" + picwgoal + "\\pichgoal" + pichgoal;
}
public static string InsertJpgImage(Image image){
byte[] buffer;
using (var stream = new MemoryStream())
{
image.Save(stream, ImageFormat.Jpeg);
buffer = stream.ToArray();
}
string hex = BitConverter.ToString(buffer, 0).Replace("-", string.Empty);
string widthAndHeight = GetWidthAndHeight(image, image.HorizontalResolution, image.VerticalResolution);
return "{\\pict\\jpegblip" + widthAndHeight + " " + hex + "}";
}
また、RTFの仕様では、画像は以下の書式となっています。
RTFファイルには、他のアプリケーションで作成された画像を含めることができます。 これらの画像は、16進数(デフォルト)またはバイナリ形式にすることができます。 写真は目的地であり、\ pictコントロールワードで始まります。 次の例で説明するように、\ pictキーワードの前に\ * \ shppict宛先制御キーワードがあります。 画像の宛先の構文は次のとおりです。
| タグ | 内容 |
|---|---|
| <pict> | '{' \pict (<brdr>? &
<shading>? & <picttype> & <pictsize> &
<metafileinfo>?) <data> '}' |
| <picttype> | | \emfblip | \pngblip | \jpegblip | \macpict | \pmmetafile | \wmetafile | \dibitmap <bitmapinfo> | \wbitmap <bitmapinfo> |
| <bitmapinfo> | \wbmbitspixel & \wbmplanes & \wbmwidthbytes |
| <pictsize> | (\picw & \pich) \picwgoal? & \pichgoal? \picscalex? & \picscaley? & \picscaled? & \piccropt? & \piccropb? & \piccropr? & \piccropl? |
<metafileinfo>
|
\picbmp & \picbpp |
| <data> | (\bin #BDATA) | #SDATA |
これらの制御ワードについて、次の表で説明します。 この表の一部の測定値はtwip単位です。 twipはポイントの20分の1です。
| タグ | 内容 |
|---|---|
\emfblip |
画像のソースはEMF(拡張メタファイル)です。 |
| \pngblip |
画像のソースはPNGです。 |
| \jpegblip |
画像のソースはJPEGです。 |
| \shppict |
Word97-2000の画像を指定します。 これは宛先制御ワードです。 |
| \nonshppict |
Word97-2000が入力時に読み取らない{\ pict宛先を書き込んだことを指定します。 このキーワードは、他のリーダーとの互換性のためです。 |
| \macpict |
画像のソースはQuickDrawです。 |
| \pmmetafileN |
画像のソースはOS / 2メタファイルです。 N引数は、メタファイルの種類を識別します。 N値は、以下の\ pmmetafileテーブルで説明されています。 |
| \wmetafileN |
画像のソースはWindowsメタファイルです。 N引数は、メタファイルタイプを識別します(デフォルトは1です)。 |
| \dibitmapN |
画像のソースは、Windowsデバイスに依存しないビットマップです。 N引数は、ビットマップタイプを識別します(0に等しい必要があります)。 Windowsデバイスに依存しないビットマップからRTFに含まれる情報は、BITMAPINFO構造体とそれに続く実際のピクセルデータの連結です。 |
| \wbitmapN |
画像のソースは、Windowsデバイスに依存するビットマップです。 N引数は、ビットマップタイプを識別します(0に等しい必要があります)。 Windowsデバイス依存ビットマップからRTFに含まれる情報は、GetBitmapBits関数の結果です。 |
画像サイズ、スケーリング、トリミング
| タグ | 内容 |
|---|---|
\picwN
|
画像がWindowsメタファイルの場合はxExtフィールド。 画像がビットマップの場合、またはQuickDrawからの画像の幅(ピクセル単位)。 N引数は長整数です。 |
\pichN
|
画像がWindowsメタファイルの場合はyExtフィールド。 画像がビットマップの場合、またはQuickDrawからの画像の高さ(ピクセル単位)。 N引数は長整数です。 |
\picwgoalN
|
画像の希望の幅(twip単位)。 N引数は長整数です。 |
\pichgoalN
|
画像の希望の高さ(twip単位)。 N引数は長整数です。 |
\picscalexN
|
水平スケーリング値。 N引数は、パーセンテージを表す値です(デフォルトは100です)。 |
\picscaleyN
|
垂直スケーリング値。 N引数は、パーセンテージを表す値です(デフォルトは100です)。 |
\picscaled
|
指定されたフレーム内に収まるように画像を拡大縮小します。 \ macpict画像でのみ使用されます。 |
\picprop
|
形状プロパティがインライン画像に適用されることを示します。 これは宛先制御ワードです。 |
\defshp
|
インライン画像がワードアート形状であることを示します。 |
\piccroptN
|
twipsでの最高のトリミング値。 正の値は画像の中央に向かってトリミングされます。 負の値は中央から離れてトリミングされ、画像の周囲にスペースの境界線が追加されます(デフォルトは0です)。 |
\piccropbN
|
twipsでの下部のトリミング値。 正の値は画像の中央に向かってトリミングされます。 負の値は中央から離れてトリミングされ、画像の周囲にスペースの境界線が追加されます(デフォルトは0です)。 |
\piccroplN
|
左のトリミング値をtwipで表示します。 正の値は画像の中央に向かってトリミングされます。 負の値は中央から離れてトリミングされ、画像の周囲にスペースの境界線が追加されます(デフォルトは0です)。 |
\piccroprN
|
ツイップでの正しいトリミング値。 正の値は画像の中央に向かってトリミングされます。 負の値は中央から離れてトリミングされ、画像の周囲にスペースの境界線が追加されます(デフォルトは0です)。 |

0 件のコメント :
コメントを投稿