トップ回答者
RTFファイルに含まれる画像の保存

質問
回答
-
RTF に画像を貼り付けることはやったことがあります。参考までに→ http://blogs.wankuma.com/jitta/archive/2005/11/12/19254.aspx
-
処理の流れは、私がしたのとは逆になります。
-
RTF から文字列を拾い出して、
-
それを Byte に変換し、
-
MemoryStream に流し込んで、
-
イメージとして読み取り、
-
ファイル ストリームに流す。
という具合。
で、どの段階で、どのようにしたところ、どうなることを期待したのに、どの様になったので「うまくいきません」と判断したのでしょう?
編集追加
あ、3の MemoryStream を通さず、直接ファイルに書き込んで、そのファイルの拡張子を wmf にした、ってことですね。
RTF の、バージョンはいくつでしょう?初期の頃は、WMF しか扱えないようです。つまり、RTF に記録されているのは WMF です。
-
-
順番にいきましょう。
具体的に行ったことです(手操作)
1.RTFファイルをテキストエディタで開き、画像データと思われる部分をコピーし、別のテキストファイルに保存する
2.「1.」で保存したファイルのテキストデータをバイナリデータに変換し、別ファイルに保存する
この変換には以下のソフトを使用しました。
HEX2BIN
http://www.vector.co.jp/soft/win95/util/se085336.htmlということは、HEX2BIN が行うことを、コードで書ければ、一つのステップが進めます。
CreateEnhMetaFileは、ファイルからデバイス コンテキストを作るようです。ですから、ファイルができていなければなりません。SetEnhMetaFileBitsを使うにしても、バイト配列がなければなりません。HEX2BIN が行うのは、そのバイト配列を用意することです。
12 AB ... という文字列を、それぞれ 18, 171 という数値になおし、その数値を BYTE として保存すればいいのですが、この説明で解りますか?
-
ewq さんからの引用 今できていることは以下の通りです。
1.RTFファイル(上のB.RTF)を開く
2.pngblip形式画像の画像データ部分(テキスト)を探し出す
3.画像データ部分(テキスト)をバイナリに変換してメモリ上に保持する(デバッグ中)
後はファイルに保存すればPNG形式での保存はできるのではないかと思っています。そうです。まず、一歩。その一歩ができれば、もう少しです。
Jitta さんからの引用 12 AB ... という文字列を、それぞれ 18, 171 という数値になおし、その数値を BYTE として保存すればいいのですが、この説明で解りますか?
はい。"12" 文字列を0x12に変換するということですよね?
そうです
(親指立てたマークが欲しいなぁ)
すべての返信
-
RTF に画像を貼り付けることはやったことがあります。参考までに→ http://blogs.wankuma.com/jitta/archive/2005/11/12/19254.aspx
-
Jitta様
参考HP拝見させていただきました。
行いたいことは、この逆の処理になります。
(画像→rtfを行うときは参考にさせていただきます)参考HPに
「16進表記したファイルの内容を並べればいいらしい」
とあったので、これを参考に以下の事を行ってみました。rtfファイル内の画像形式:png
rtfファイル内の画像データ部を切り取り、
テキスト→バイナリ変換し拡張子をwmfとしたところ、
rtfファイルに含まれる画像を保存することができました。画像形式がpngの場合は上の操作をコード化すればよいと思いますが、
rtfファイル内の画像形式:メタファイル
の場合、上の操作ではうまくいきませんでした。rtfファイル内の画像形式:メタファイル
の場合の抽出方法が知りたいと思います。
「この関数を使用する」といったアドバイスのほかに
手操作での実現方法でもかまいません。
ご指導をお願いいたします。 -
処理の流れは、私がしたのとは逆になります。
-
RTF から文字列を拾い出して、
-
それを Byte に変換し、
-
MemoryStream に流し込んで、
-
イメージとして読み取り、
-
ファイル ストリームに流す。
という具合。
で、どの段階で、どのようにしたところ、どうなることを期待したのに、どの様になったので「うまくいきません」と判断したのでしょう?
編集追加
あ、3の MemoryStream を通さず、直接ファイルに書き込んで、そのファイルの拡張子を wmf にした、ってことですね。
RTF の、バージョンはいくつでしょう?初期の頃は、WMF しか扱えないようです。つまり、RTF に記録されているのは WMF です。
-
-
Jitta様
ご回答いただきありがとうございます。
最終的な目的はプログラムでRTFファイルを読み込んで、
RTFファイルに含まれる画像を別ファイルとして保存することですが、
まず、別の方法(手操作)でこの操作を行おうと考えました。
具体的に行ったことです(手操作)
1.RTFファイルをテキストエディタで開き、画像データと思われる部分をコピーし、別のテキストファイルに保存する
2.「1.」で保存したファイルのテキストデータをバイナリデータに変換し、別ファイルに保存する
この変換には以下のソフトを使用しました。
HEX2BIN
http://www.vector.co.jp/soft/win95/util/se085336.html
3.「2.」で保存したファイルの拡張子をWMFに変換する
4.画像表示用のソフト(ACDSeeを使用しています)で開き、
画像が表示されれば「うまくいった」、画像が表示されなければ「うまくいかない」と判断しました。
使用したRTFファイルと結果です
a)pngblip形式で画像が保存されているRTFファイルに対して上の操作を行う
結果:うまくいった
b)wmetafe8形式で画像が保存されているRTFファイルに対して上の操作を行う
結果:うまくいかない
ふと思いついて以下のことも行いました。
A.上のa)、b)で生成したWMFファイルをペイントで開く
結果:a)、b)どちらで生成したWMFファイルとも表示された
B.エクスプローラのファイル表示を「詳細」から「縮小版」に変更した(常に「詳細」表示で使用していた)
結果:a)、b)どちらで生成したWMFファイルとも表示されたA.B.の結果を見ると、RTFファイル内の画像を手操作でWMFファイルに変換することはできていたようです。
ただし、出力したWMFファイルのプロパティを確認すると、
縦横比が1440:900とモニタの解像度と同じになっていたためこれを改善したいと思います。ここまでで、
pngblip形式、wmetafe8形式で画像が保存されているRTFファイルに対しては
上の手操作を行うと画像を別ファイルに保存することができました。Jitta様、いろいろとご指導いただき本当にありがとうございました。
ここからが本来の目的で、
プログラムでRTFファイルを読み込んで、RTFファイルに含まれる画像を
別ファイルとして保存することを考えようと思います。手操作で行ったようなことをプログラムにした場合、
画像の保存はできますが、画像の縦横比が崩れてしまいます。
参考HPのように画像のサイズを指定する必要があると思います。
環境を申し上げておりませんでした。
VC++6.0、WinXPを考えています。参考HPの逆のことを行えばよいと思っています。
MSDNを参照するとCreateEnhMetaFile、SetEnhMetaFileBits等ありますが、
これらの使い方をご存知でしょうか。
(これからMSDNを見ながら試そうと思っています)> 3の MemoryStream を通さず、直接ファイルに書き込んで、そのファイルの拡張子を wmf にした、ってことですね。
はい、そうです。直接ファイルに書き込んだので、画像サイズが保存できていないのだと思います。
RTFバージョンはこれから確認します。
追記
RTFファイルにバージョン情報は含まれていませんでした。
-
順番にいきましょう。
具体的に行ったことです(手操作)
1.RTFファイルをテキストエディタで開き、画像データと思われる部分をコピーし、別のテキストファイルに保存する
2.「1.」で保存したファイルのテキストデータをバイナリデータに変換し、別ファイルに保存する
この変換には以下のソフトを使用しました。
HEX2BIN
http://www.vector.co.jp/soft/win95/util/se085336.htmlということは、HEX2BIN が行うことを、コードで書ければ、一つのステップが進めます。
CreateEnhMetaFileは、ファイルからデバイス コンテキストを作るようです。ですから、ファイルができていなければなりません。SetEnhMetaFileBitsを使うにしても、バイト配列がなければなりません。HEX2BIN が行うのは、そのバイト配列を用意することです。
12 AB ... という文字列を、それぞれ 18, 171 という数値になおし、その数値を BYTE として保存すればいいのですが、この説明で解りますか?
-
Jitta様
いつもありがとうございます。
試行錯誤しているうちに以下のことに気がついたためこちらの作業を優先していました。
RTFファイル(画像形式:wmetafe8)をワードで開き、名前をつけて別名保存を行うと、
上のRTFファイルが、1枚の画像に対してwmetafe8とpngblipの2つの形式を含んだ
ファイルに変換されることに気がつきました。
A.RTF(画像形式:wmetafe8)
↓ ワードで開き、別名保存を行う
B.RTF(1つの画像に対してwmetafe8とpngblipの2つの形式を含んだファイルに変換される)
B.RTFファイルに含まれるpngblip形式の画像データをバイナリに変換すれば
PNG形式で保存できるのではないか?今できていることは以下の通りです。
1.RTFファイル(上のB.RTF)を開く
2.pngblip形式画像の画像データ部分(テキスト)を探し出す
3.画像データ部分(テキスト)をバイナリに変換してメモリ上に保持する(デバッグ中)
後はファイルに保存すればPNG形式での保存はできるのではないかと思っています。wmetafe8の画像データに対して
3.の処理を行うと、SetEnhMetaFileBitsで用いるバイト配列を作成する処理になるのではないかと思っています。
Jitta さんからの引用 12 AB ... という文字列を、それぞれ 18, 171 という数値になおし、その数値を BYTE として保存すればいいのですが、この説明で解りますか?
はい。"12" 文字列を0x12に変換するということですよね?
-
ewq さんからの引用 今できていることは以下の通りです。
1.RTFファイル(上のB.RTF)を開く
2.pngblip形式画像の画像データ部分(テキスト)を探し出す
3.画像データ部分(テキスト)をバイナリに変換してメモリ上に保持する(デバッグ中)
後はファイルに保存すればPNG形式での保存はできるのではないかと思っています。そうです。まず、一歩。その一歩ができれば、もう少しです。
Jitta さんからの引用 12 AB ... という文字列を、それぞれ 18, 171 という数値になおし、その数値を BYTE として保存すればいいのですが、この説明で解りますか?
はい。"12" 文字列を0x12に変換するということですよね?
そうです
(親指立てたマークが欲しいなぁ)
-
Jitta様
いつもありがとうございます。
A.RTF(画像形式:wmetafe8)
↓ ワードで開き、別名保存を行う
B.RTF(1つの画像に対してwmetafe8とpngblipの2つの形式を含んだファイルに変換される)
B.RTFファイルに含まれるpngblip形式の画像データをバイナリに変換すれば
PNG形式で保存できるのではないか?最近デバッグをする時間が取れなかったので遅くなってすみませんでしたが、
おかげさまで、B.RTFにふくまれるすべてのpngblip形式の画像データを
個別にPNG形式で保存することはできました。
ありがとうございました。
今後はいよいよ本来の目的であった
A.RTF(画像形式:wmetafe8)
から直接画像保存を行うことを試そうと思っています。10/16の書き込みで、手操作(HEX2BIN)で行った場合、
出力した画像のサイズがモニタサイズとなってしまったので、
これが改善できるかどうかだろうと思っています。まだMSDNでの勉強が十分でないのですが、これから行わなければいけないことは、
1.RTFファイルに含まれる画像データの取得
→PNGの時と同じような方法でおそらく取得できる
2.RTFファイルに含まれる画像サイズの取得
→RTFファイルに書かれているのでおそらく取得できる
3.「1.」のデータを「2.」のサイズで保存
→バイトデータを用いてSetEnhMetaFileBitsでメモリ上に
拡張形式メタファイルを作成した後
(1)CopyEnhMetaFileで保存?・・・画像のサイズを設定していない
(2)HDCに描画後に保存?・・・HDCを画像サイズに設定?などと考えています。
まだコーディングもしていない想像の段階ですので
間違っているかもしれませんが・・・実際にテストを行った後報告します。
-
Jitta 様
その後、なかなか作業を進める時間がなく作業を中断していました。
最近になって時間ができたためメタファイルについて調べていたところ、
以下のHPを見つけました。
http://sadoyama.sakura.ne.jp/world/htm/note/002_06_wmf.htm
RTFファイルから読み込んでいたメタファイルのデータは、
APMヘッダ以降のデータであることが分かりました。RTFファイルから読み込んだメタファイルのデータを
バイナリに変換し保存したファイルに対し、
バイナリエディタを用いてこの画像データに合うようなAPMヘッダを
付加したところ、Explorerでも手持ちの画像ビューアでも
このWMFファイルを表示することができました。よって、APMヘッダを付加する処理を追加すれば
目的は達成しそうです。
Jitta 様
色々とご指導いただきありがとうございました。