none
RTFファイルに含まれる画像の保存 RRS feed

  • 質問

  • RTFファイルに含まれている画像を、別ファイルとして保存することを考えています。

    プログラムからRTFファイルにアクセスし、別ファイルとして保存したいのですが、

    どのように行ったらよいかわかりません。

    RTFの仕様書をDLし読んだのですが、どのように<data>を変換したらよいのかわかりません。

    ご指導いただけませんでしょうか。

    よろしくお願いいたします。

     

     

     

    2008年10月14日 12:58

回答

  • RTF に画像を貼り付けることはやったことがあります。参考までに→ http://blogs.wankuma.com/jitta/archive/2005/11/12/19254.aspx

     

    2008年10月14日 23:39
  • 処理の流れは、私がしたのとは逆になります。

    1. RTF から文字列を拾い出して、
    2. それを Byte に変換し、
    3. MemoryStream に流し込んで、
    4. イメージとして読み取り、
    5. ファイル ストリームに流す。

    という具合。

    で、どの段階で、どのようにしたところ、どうなることを期待したのに、どの様になったので「うまくいきません」と判断したのでしょう?

     

    編集追加

    あ、3の MemoryStream を通さず、直接ファイルに書き込んで、そのファイルの拡張子を wmf にした、ってことですね。

    RTF の、バージョンはいくつでしょう?初期の頃は、WMF しか扱えないようです。つまり、RTF に記録されているのは WMF です。

    2008年10月16日 3:06
  • 順番にいきましょう。

     

    具体的に行ったことです(手操作)
    1.RTFファイルをテキストエディタで開き、画像データと思われる部分をコピーし、別のテキストファイルに保存する
    2.「1.」で保存したファイルのテキストデータをバイナリデータに変換し、別ファイルに保存する
     この変換には以下のソフトを使用しました。
     HEX2BIN
     http://www.vector.co.jp/soft/win95/util/se085336.html

    ということは、HEX2BIN が行うことを、コードで書ければ、一つのステップが進めます。

     

    CreateEnhMetaFileは、ファイルからデバイス コンテキストを作るようです。ですから、ファイルができていなければなりません。SetEnhMetaFileBitsを使うにしても、バイト配列がなければなりません。HEX2BIN が行うのは、そのバイト配列を用意することです。

     

    12 AB ... という文字列を、それぞれ 18, 171 という数値になおし、その数値を BYTE として保存すればいいのですが、この説明で解りますか?

    2008年10月20日 23:40
  •  ewq さんからの引用

     

    今できていることは以下の通りです。
    1.RTFファイル(上のB.RTF)を開く
    2.pngblip形式画像の画像データ部分(テキスト)を探し出す
    3.画像データ部分(テキスト)をバイナリに変換してメモリ上に保持する(デバッグ中)
    後はファイルに保存すればPNG形式での保存はできるのではないかと思っています。

    そうです。まず、一歩。その一歩ができれば、もう少しです。

     

     Jitta さんからの引用

    12 AB ... という文字列を、それぞれ 18, 171 という数値になおし、その数値を BYTE として保存すればいいのですが、この説明で解りますか?

     

    はい。"12" 文字列を0x12に変換するということですよね?

    そうです

    (親指立てたマークが欲しいなぁ)

    2008年10月30日 13:32

すべての返信

  • RTF に画像を貼り付けることはやったことがあります。参考までに→ http://blogs.wankuma.com/jitta/archive/2005/11/12/19254.aspx

     

    2008年10月14日 23:39
  • Jitta様
    参考HP拝見させていただきました。
    行いたいことは、この逆の処理になります。
    (画像→rtfを行うときは参考にさせていただきます)

     

    参考HPに
    「16進表記したファイルの内容を並べればいいらしい」
    とあったので、これを参考に以下の事を行ってみました。

     

    rtfファイル内の画像形式:png
    rtfファイル内の画像データ部を切り取り、
    テキスト→バイナリ変換し拡張子をwmfとしたところ、
    rtfファイルに含まれる画像を保存することができました。

     

    画像形式がpngの場合は上の操作をコード化すればよいと思いますが、
    rtfファイル内の画像形式:メタファイル
    の場合、上の操作ではうまくいきませんでした。

     

    rtfファイル内の画像形式:メタファイル
    の場合の抽出方法が知りたいと思います。


    「この関数を使用する」といったアドバイスのほかに
    手操作での実現方法でもかまいません。
    ご指導をお願いいたします。

     

     

     

     

    2008年10月15日 13:09
  • 処理の流れは、私がしたのとは逆になります。

    1. RTF から文字列を拾い出して、
    2. それを Byte に変換し、
    3. MemoryStream に流し込んで、
    4. イメージとして読み取り、
    5. ファイル ストリームに流す。

    という具合。

    で、どの段階で、どのようにしたところ、どうなることを期待したのに、どの様になったので「うまくいきません」と判断したのでしょう?

     

    編集追加

    あ、3の MemoryStream を通さず、直接ファイルに書き込んで、そのファイルの拡張子を wmf にした、ってことですね。

    RTF の、バージョンはいくつでしょう?初期の頃は、WMF しか扱えないようです。つまり、RTF に記録されているのは WMF です。

    2008年10月16日 3:06
  • 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ファイルにバージョン情報は含まれていませんでした。

    2008年10月16日 7:03
  • 順番にいきましょう。

     

    具体的に行ったことです(手操作)
    1.RTFファイルをテキストエディタで開き、画像データと思われる部分をコピーし、別のテキストファイルに保存する
    2.「1.」で保存したファイルのテキストデータをバイナリデータに変換し、別ファイルに保存する
     この変換には以下のソフトを使用しました。
     HEX2BIN
     http://www.vector.co.jp/soft/win95/util/se085336.html

    ということは、HEX2BIN が行うことを、コードで書ければ、一つのステップが進めます。

     

    CreateEnhMetaFileは、ファイルからデバイス コンテキストを作るようです。ですから、ファイルができていなければなりません。SetEnhMetaFileBitsを使うにしても、バイト配列がなければなりません。HEX2BIN が行うのは、そのバイト配列を用意することです。

     

    12 AB ... という文字列を、それぞれ 18, 171 という数値になおし、その数値を BYTE として保存すればいいのですが、この説明で解りますか?

    2008年10月20日 23:40
  • 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に変換するということですよね?

    2008年10月29日 23:41
  •  ewq さんからの引用

     

    今できていることは以下の通りです。
    1.RTFファイル(上のB.RTF)を開く
    2.pngblip形式画像の画像データ部分(テキスト)を探し出す
    3.画像データ部分(テキスト)をバイナリに変換してメモリ上に保持する(デバッグ中)
    後はファイルに保存すればPNG形式での保存はできるのではないかと思っています。

    そうです。まず、一歩。その一歩ができれば、もう少しです。

     

     Jitta さんからの引用

    12 AB ... という文字列を、それぞれ 18, 171 という数値になおし、その数値を BYTE として保存すればいいのですが、この説明で解りますか?

     

    はい。"12" 文字列を0x12に変換するということですよね?

    そうです

    (親指立てたマークが欲しいなぁ)

    2008年10月30日 13:32
  • 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を画像サイズに設定?

    などと考えています。

    まだコーディングもしていない想像の段階ですので
    間違っているかもしれませんが・・・

    実際にテストを行った後報告します。

     

     

     


     

    2008年11月8日 13:25
  • こんにちは、フォーラムオペレータ 大久保です。

     

    ewq さん、調子はいかがでしょうか?思い通りにできましたか?

    Jitta さん、たくさんのアドバイスありがとうございます!

     

    ひとまず、いろいろ教えてくださった Jitta さんの投稿に「回答済み」チェックをつけさせていただきました。

    Jitta さんも、ewq さんから「できました」のご連絡をいただくのが一番うれしいと思いますので、うまくいきましたら是非お知らせください。

     

    それではー

    2008年11月27日 1:06
  •  

    Jitta 様

    その後、なかなか作業を進める時間がなく作業を中断していました。

    最近になって時間ができたためメタファイルについて調べていたところ、
    以下のHPを見つけました。
    http://sadoyama.sakura.ne.jp/world/htm/note/002_06_wmf.htm


    RTFファイルから読み込んでいたメタファイルのデータは、
    APMヘッダ以降のデータであることが分かりました。

    RTFファイルから読み込んだメタファイルのデータを
    バイナリに変換し保存したファイルに対し、
    バイナリエディタを用いてこの画像データに合うようなAPMヘッダを
    付加したところ、Explorerでも手持ちの画像ビューアでも
    このWMFファイルを表示することができました。

    よって、APMヘッダを付加する処理を追加すれば
    目的は達成しそうです。


    Jitta 様
    色々とご指導いただきありがとうございました。

     

     

    2009年1月8日 3:32