9 件 見つかりました。
下記コマンドでEPSをBMPに変換できた。
gswin32c -dSAFER -q -dNOPAUSE -sDEVICE=bmp256 -sOutputFile=hoge_out.bmp -r32 -dEPSCrop -dBATCH hoge.eps
画像は情報量が多く情報伝達媒体として極めて優秀だが、ちと検索が難しいので後々の整理が悩ましい。画像のキーワードが既知であれば、それを元に文字からの検索が可能となるので、後々の整理で威力を発揮するだろう。要は画像ファイルにコメントとしてキーワードが埋め込まれていれば便利そうだという話。PNGについてこのへんの事情を調べた。[2006-12-05]も参照。
【前提知識】
もともとPNGファイルにはtEXtチャンクなるコメント用の領域が用意されている。もちろん、libpngからの読み書きが可能である。
・PNG利用術
・PNGファイル(2) PNG操作の手順
しかしながら、ここには日本語のデータを入れてはいけない模様。とても残念な仕様である。
・PNG Specification: Chunk Specifications 中に次の記述が:"The text string can contain any Latin-1 character."
・お絵描き研究室:PNG(原理編)
・PNG チャンク編集ツール < 10 < November < 2004 < nulog, NULL::something : out of the headphone
その不満を受けてのことだろうが、iTXtチャンクなる、UTF-8を入れてもいいコメント領域が追加されたようだ。「PNGの常識」と捉えるにはまだ早いのかな?
・PNG Specification: Chunk Specifications
・煤 - Note 0312
【コード】
tEXtチャンクの読み書きはPNG利用術を見るとよくわかる。
だけどiTXtのサンプルコードはあんまり見ない。Re: g_warnings in png loaderくらい?ちょっとやってみて、独断でうまくいったっぽいと感じたのでメモする。
libpngは libpng-1.2.22-no-config.tar.gz を使用。このバージョンでは、iTXtの機能はデフォルトでは無効になっている(pngconf.h の474行目 "iTXt support was turned off by default")。これを有効にするために、503行目あたり(iTXt関連の#defineが終わった直後)に無理矢理以下をねじこみ、その上でコンパイルしてライブラリを作成した。
#define PNG_iTXt_SUPPORTED #define PNG_READ_iTXt_SUPPORTED #define PNG_READ_iTXt #define PNG_WRITE_iTXt_SUPPORTED #define PNG_WRITE_iTXt
png_text text_ptr[3]; const WCHAR* wstr[3] = {L"これが1番目です", L"これは2番目かも", L"そして3番目だ"}; char str[3][1024]; char key[3][32]; for(int i=0; i<3; i++){ sprintf(key[i], "My Key %d", i); WideCharToMultiByte(CP_UTF8, 0, wstr[i], -1, str[i], 1024, NULL, NULL); text_ptr[i].key = key[i]; text_ptr[i].text = str[i]; text_ptr[i].compression = PNG_ITXT_COMPRESSION_NONE; text_ptr[i].text_length = 0; text_ptr[i].itxt_length = strlen(text_ptr[i].text); text_ptr[i].lang = NULL; text_ptr[i].lang_key = NULL; } png_set_text(png_ptr, info_ptr, text_ptr, 3);こうして作ったPNGは次の通り:
cl /MD main.cpp libpng.lib zlib.lib
#include <stdio.h> #include <stdlib.h> #include "png.h" void check_if_png(char *file_name, FILE **fp); void read_png_info(FILE *fp, png_structp *png_ptr, png_infop *info_ptr); #define PNG_BYTES_TO_CHECK (4) int main() { FILE *fp; png_structp png_ptr; png_infop info_ptr; png_uint_32 i; check_if_png("test.png", &fp); read_png_info(fp, &png_ptr, &info_ptr); { // 以下8行はtEXtチャンクを取得し表示します png_textp text_ptr; int num_text; if (png_get_text(png_ptr, info_ptr, &text_ptr, &num_text)) for (i = 0; i < num_text; i++) printf("%s", text_ptr[i].text); } png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); fclose(fp); return 0; } void check_if_png(char *file_name, FILE **fp) { char sig[PNG_BYTES_TO_CHECK]; if ((*fp = fopen(file_name, "rb")) == NULL) exit(EXIT_FAILURE); if (fread(sig, 1, PNG_BYTES_TO_CHECK, *fp) != PNG_BYTES_TO_CHECK) { fclose(*fp); exit(EXIT_FAILURE); } } void read_png_info(FILE *fp, png_structp *png_ptr, png_infop *info_ptr) { *png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (*png_ptr == NULL) { fclose(fp); exit(EXIT_FAILURE); } *info_ptr = png_create_info_struct(*png_ptr); if (*info_ptr == NULL) { png_destroy_read_struct(png_ptr, (png_infopp)NULL, (png_infopp)NULL); fclose(fp); exit(EXIT_FAILURE); } if (setjmp((*png_ptr)->jmpbuf)) { png_destroy_read_struct(png_ptr, info_ptr, (png_infopp)NULL); fclose(fp); exit(EXIT_FAILURE); } png_init_io(*png_ptr, fp); png_set_sig_bytes(*png_ptr, PNG_BYTES_TO_CHECK); png_read_info(*png_ptr, *info_ptr); }
libpngとzlibを使ってVC++(non MFC)でプログラムを書こうと思った。(VS.NET 2003)
まずはライブラリをコンパイルする。libpng-1.2.22-no-config.tar.gzとzlib-1.2.3.tar.gzをダウンロードした。展開し、zlibの内容をlibpngと「兄弟」となるように配置(例えばC:\temp\libpng\(libpngの中身)、C:\temp\zlib\(zlibの中身))。で、(libpng)\projects\visualc71\libpng.sln を開き、ビルド => 構成マネージャから LIB Release を選んで、ビルドするとライブラリができる。このあたりは (libpng)\projects\visualc71\README.txt に書いてある。Win32_LIB_Releaseディレクトリのlibpng.lib、zlib.libを、またソースファイルからpng.h、pngconf.h、zlib.h、zconf.hを持ってくれば使用準備は整う。
さてプログラムを書いてビルドしたらば、「競合」によって失敗した。内容から解決法まで、下記と同様であった。
2006-10-26 - 王様の箱庭::blog
エラーは下記のようなものである。プロジェクトのプロパティから C/C++ => コード生成 => ランタイムライブラリ を「マルチスレッドDLL」にすることでエラーは消えた。なぜうまくいったかは理解していない。
... step1 error LNK2005: _abort は既に LIBC.lib(abort.obj) で定義されています。 ... step1 fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。 step1 warning LNK4098: defaultlib 'MSVCRTD' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
画像ファイルを画像データたらしめているのは、ファイル名ではなく画像そのものである。つまり、画像に対していちいちファイル名を用意してそれを基に管理するのは面倒でナンセンスだと考える。(「横着プログラミング 第1回: Unixのメモ技術」を読んでこの考えに至った)
TeXによる文章で図を挿入する際には画像をファイル名で指定する。で、それに対してラベル文字列\label{...}を付し、これが後の参照に使われる(「図\ref{...}」が「図2.4」とかになる)。つまり画像(図)を管理するため2種類もの文字列が使われていることになるのだが、これは2重に面倒である。「ファイル名をラベル文字列とする」とルールを定めれば1重の面倒に改善されるが、それでもファイル名管理の煩わしさは残る。不精な私にとっては、アタマに思い描く画像とファイル名の対応をいちいち把握しておくことはとても面倒だ。
私はTeXの文章作成時には、YaTeXという便利なTeX文書作成補助パッケージを愛用している。これに参照コマンド\refの入力支援機能が備わっているが、そこではラベル文字列の代わりにキャプション文字列で図を管理する。通常キャプション文字列はファイル名などと同じになり得ないので、画像(図)を指定するための文字列を新たに増やしてしまっていることに相当する。これは別にyatexの設計が悪いわけではなく、平テキストで画像入り文章を扱っている以上仕方のないことなのだが、やっぱりこのテの把握と管理は面倒である。
画像のインライン表示によって、この面倒さを解決できないかなあと考えている。emacsは21から画像の表示がサポートされたようなので、例えばTeXのソース編集中に\includegraphics{...}付近に実際の画像の縮小版を表示させることも可能だと思う(画像表示の機構は知らないので、具体的な技術的課題なんかはわからん)。で、その図を\ref{...}する際にも、文書中の画像(図)をサムネイル表示させた上で参照先を選ばせるようにすれば、ラベル文字列との対応でいちいち悩む必要は無い。この時ラベル文字列はただの内部変数の様な役割なので、他と干渉さえしなければ何でもよいはず(ファイル名とか)。\ref{...}付近にも適宜画像を表示させれば、執筆中の文書の見通しも良くなりそうだ。
TeXとは関係ないが、メモツールhowmでも似た事情がある。ちょっとした画像をメモ代わりに残したくなることはあるが、いちいちそれっぽいファイル名を考えて後日アクセスできるようにするのが億劫で、結局残さないなんて本末転倒なこともある。日付+時間とかで必ずuniqueになるファイル名を適当に自動でつけ、メモ中にインライン表示できるようにすれば、気兼ねなく「メモ画像」を扱えるのではと思う。
とりあえず今日は思ったことをメモするだけ。実装したいが、どのくらいの手間暇がいるのだろうか?以下に画像表示のelisp例が記述されていた。
・横着プログラミング 第1回: Unixのメモ技術
・Poohのページ
Acrobatの機能として、ページのイメージのサムネール画像の作成・埋め込みがサポートされているが、単体のラスタ画像ファイルでこれを作成したい場合にはどうすればよいか。
外部プログラムでこれらを行うものがいくつかある。
Xpdfに付属する pdftoppm でPDFのページイメージをppmにできる。
pdftoppm.exe -f 3 -l 5 adachi.pdf -r 50 myimgとして、3ページから5ページの画像が50dpiで myimg-000003.ppm とかの名前で出力される。ppmはそれなりに一般的な画像形式のようだが手元のwwwブラウザでは表示できなかった。
convert.exe -resample 50x50% mydoc.pdf hoge.pngなどとして全ページのイメージを出力できる。(指定したページのみの場合はどうするのだろう?)
Dim app, avdoc, pddoc, pdpage, point, rect Set app = CreateObject("AcroExch.App") Set avdoc = app.GetActiveDoc Set pddoc = avdoc.GetPDDoc Set pdpage = pddoc.AcquirePage(0) Set point = pdpage.GetSize() Set rect = CreateObject("AcroExch.Rect") rect.Left = 0 rect.Right = point.X rect.Top = 0 rect.Bottom = point.Y pdpage.CopyToClipboard rect, 0, 0, 100
PDFのサムネール表示は全体を俯瞰するのに便利。手元のAcrobat 7 Standardでは「ページ」というナビゲーションタブでこれが見られる(Foxit Readerを2分ほど使ってみたが、同様の機能はなかった)。特に私は口頭発表でPDFを用いるため、ページの順序を考えたり、聞き手の方々に全体を示しつつ指示のあったページに素早く移動する際にこれが活躍する。この時のサムネール画像の解像度について考えたことをメモする。
まず、PDFにはページのデータとは別にサムネール用のラスタ画像ファイルを内包する仕様が用意されている。これを持っていないPDFをAcrobatでサムネール表示する際には、Acrobatがその都度サムネール画像を作成し描画する。これが一番解像度の良い表示となるが、当然ながら描画にあたってはそれなりの時間がかかってしまう。
この欠点を克服するのが「サムネール画像の埋め込み」というものである。「ページ」のオプションメニューからこれを選択すると、ラスタイメージがPDFの仕様に従ってファイルに埋め込まれ、サムネール表示にあたっての描画の負担はかなり軽減される。だが解像度はサムネール画像なしの場合よりも悪い。かつ、その解像度を指定するオプションも見当たらなかった。
私は発表用のスライドはIllustrator CSで1枚ずつ作成し、後でこれを結合している。Illustratorのオプションとしてサムネール画像を作成というのがあるが、この場合の解像度はかなり悪い。
またPDFキャビネットもPDFのサムネール表示をすることが可能である。これは既存のサムネール画像とは別の機構で表示してくれるようで、その解像度はそれほど悪くなく、かつ内容はどこかにキャッシュするらしく、表示のたび再描画してる気配は見えない。
まとめる。解像度の大小は以下の通り:
埋め込みサムネール画像なし > PDFキャビネットの表示 > Acrobat 7 Standardによる埋め込みサムネール画像 > Illustrator CSによる埋め込みサムネール画像
埋め込みサムネール画像なし | |
PDFキャビネットの表示 | |
Acrobat 7 Standardによる埋め込みサムネール画像 | |
Illustrator CSによる埋め込みサムネール画像 |
とりあえず参考URLをメモ。
http://module.jp/blog/comment_in_imagefile.html
http://search.cpan.org/dist/Image-ExifTool/
pngな画像をTeXの図に使うためPhotoshopを起動しようとしたらモタツキ具合にブチ切れそうになった。なのでそのためのお手軽ツールを探したらbmepsなるものを見つけた。
Windows用のバイナリも配布されているようだが、手元の環境では c/usr/local/bin/bmeps.exe にもともと用意されていた。ありがたや
TeXにおいて画像はEPSが一番相性が良い。で、論文を書く際には大量のEPSが生産されるのであるが、そのうちどのファイル名がどの画像に対応するのかわけがわからなくなってくる。そんな場合はサムネイル表示が活躍するわけであるが、jpgやpngなどと違い、EPSのサムネイル表示はややハードルが高い。
一覧するためのソフトを幾つか試した所感:
= Irfanviewがフリーで高機能で便利なのだが、EPSの表示は私の環境では遅く、やや不満。キャッシュもしてくれない。また、ディレクトリのパスを手入力やペーストができないのも残念。
= XnViewもフリーで高機能で便利。EPS表示は遅いが、キャッシュしてくれるようなので、2回目以降の閲覧は高速。Irfanviewで残念だった所をカバーしている感がある。
= susieプラグインでEPS用のものがいくつかあるようだが、手元のEPSは見られなかった。このあたりは、プレビューあるなしなどEPS作成時の事情に強く依存するようである。あふを愛用してる関係で、susieプラグインがあると一番嬉しいのだが、難しいようだ。
= エクスプローラは何げに優秀で、Illustrator CSで「サムネールを作成」としたものはサムネイル表示が可能である。しかし、Igor Proから出力したEPSは"Suppress Preview"のチェックをオフにしてもサムネイル表示はできなかった。偶然だろうが、Illustrator CSの「ファイルを開く」ダイアログや、Photoshop CSのファイルブラウザでも同様であった。Adobe Bridgeを試したいが、そんなカネはない。
というわけで今日のドラフト結論:
= XnView便利そう
= EPS出力の際、Illustrator CSの「プレビュー」と「サムネール」、Igor Proの"Preview"などのオプションがあるが、これらは不要。でも「サムネール」はファイル開く時に便利だからあってもいいかも。Igor Proの"Preview"はつけるとdvioutでコケたりする(dvipdfmは問題なし)のでつけるべきではない。つけるメリットもない
ChangeLog INDEX