こんばんは
サブジェクトのようなことがしたくて検索すると下記のページに辿り着きました
https://social.msdn.microsoft.com/Forums/ja-JP/95739584-5d75-4ecd-8d3b-c42bad38d24a/rtf?forum=vcgeneralja
書かれてある通り画像部分の文字列を別のファイルに保存して「HEX2BIN」というアプリで問題なく画像(.wmf)として保存できました
これをプログラムソース内にてTGraphicなりTPictureに変換して扱いたいのですが
上記サイトの「12 AB ... という文字列を、それぞれ 18, 171 という数値になおし、その数値を BYTE として保存すればいいのですが」の部分が理解できませんでした
TMemoryStreamにそのバイナリデータさえ入れられればいいと思うのですがRTFでの数値を何に変換すればよいのかお教えください
環境はDelphi2009+Windows7です
こんにちは。
HEX2BIN 相当の事をコード内でやりたいのですよね?
「12 AB ... という文字列を、それぞれ 18, 171 という数値になおし...(略)」
これは RTF 内で画像がバイナリではなくテキスト (16進ダンプ) で格納されているという事ですから、
1.RTF を TStringList 等に読み込ませる。
2.RTF 内で画像部分を検索。
3.画像の範囲を特定したら2文字単位で16進数文字列->数値(Byte)変換を行う。
4.TMemoryStream 等に書き込む。
5.TPicture 等で LoadFromStream()
こういう事ですよね。
例えば Delphi のフォームに TImage を貼って画像を読み込ませた状態で、
フォームを "エディタで表示" すると同じように画像は 16進ダンプ文字列
になっていると思いますが、これを画像に戻すのと同じ事になります。
"12" という16進文字列を数値に変換するには頭に '$' か '0x' を
付けて StrToInt() すればいいです。
var
B: Byte;
begin
B := StrToInt('$' + '12'); // 16進文字列 '12'
ShowMessage(IntToStr(B)); // 18 (10進)
end;
DEKO 様
ありがとうございます仰る通りにしたら(4.まで)
HEX2BIN と同じように画像(.wmf)として保存できました
件のAPMヘッダが無いせいかLoadFromStreamでエラーとなりましたが
そちらの方はもう一つのサイトを理解してサイズを書き込めば
出来そうな気がします
ありがとうございました
あ、METAFILEHEADER が消えているのですね > RTF 内の WMF
[DEKO の雑談 (1999/03/07)]
http://ht-deko.com/ft9903.html#990307
[Delphi ノート 002 画像ファイルを開かずに、縦横サイズを得る WMF 編 (さどやま)]
http://sadoyama.sakura.ne.jp/world/htm/note/002_06_wmf.htm
途中で送信してしまいましたが、
METAFILEHEADER の単位は TWIPS な事に注意してください。
> MicroSoft社はこれを標準とは認めていませんが、
> 今日では広く受け入れられて事実上の標準になっており、
> WMFとはAPM のことと言ってもよいでしょう。
申し訳ないですが、これには賛同しかねます。
例えば PowerPoint で図を右クリックして "図として保存" し、
WMF 形式で出力して得られるのは Windows の WMF です。APM ではありません。
ちゃんとした Windows Metafile のフォーマットに従うべきだと思います。
("APM ヘッダ" と聞いて「何の事?」と思いましたし...)
# PowerPoint で出力した WMF の inch メンバには 96 ではなく、
# 576 (0x0240) が入っています。
訂正:
歴史的経緯としては WMF ファイルのヘッダは Aldus のもののようですね。
http://download.microsoft.com/download/a/e/6/ae6e4142-aa58-45c6-8dcf-a657e5900cd3/Windows_Server_Protocols.zip
この中に含まれる [MS-WMF].pdf には META_PLACEABLE 構造体として紹介してあり、以下のような説明があります。
[2.3.2.3 META_PLACEABLE Record (P.123) より]
Key (4 bytes):
Identification value that indicates the presence of a placeable metafile header.
This value MUST be 0x9AC6CDD7.
HWmf (2 bytes):
The resource handle to the metafile, when the metafile is in memory. When the metafile is on disk,
this field MUST contain 0x0000. This attribute of the metafile is specified in the Type field of the META_HEADER record.
BoundingBox (8 bytes):
The destination rectangle, measured in logical units, for displaying the metafile.
The size of a logical unit is specified by the Inch field.
Inch (2 bytes):
The number of logical units per inch used to represent the image.
This value can be used to scale an image.
By convention, an image is considered to be recorded at 1440 logical units (twips) per inch. Thus,
a value of 720 specifies that the image SHOULD be rendered at twice its normal size,
and a value of 2880 specifies that the image SHOULD be rendered at half its normal size.
Reserved (4 bytes):
A field that is not used and MUST be set to 0x00000000.
Checksum (2 bytes):
A checksum for the previous 10 16-bit values in the header.
This value can be used to determine whether the metafile has become corrupted.
Microsoft の公式資料なので、これを参考にするのがいいかと思います。
すみません昨日は仕事から帰った後死んだように寝ていました
ヘッダの話と深いお話(ちょっとむずかしい…)ありがとうございます
ツイート | ![]() |