9 件 見つかりました。

CHALOW Search - hiChangeLog ChangeLog INDEX

EPSをBMPに変換する [画像ファイル]

下記コマンドでEPSをBMPに変換できた。

gswin32c -dSAFER -q -dNOPAUSE -sDEVICE=bmp256 -sOutputFile=hoge_out.bmp -r32 -dEPSCrop -dBATCH hoge.eps

PNGにコメントを埋め込む [画像ファイル][Windowsプログラミング]

画像は情報量が多く情報伝達媒体として極めて優秀だが、ちと検索が難しいので後々の整理が悩ましい。画像のキーワードが既知であれば、それを元に文字からの検索が可能となるので、後々の整理で威力を発揮するだろう。要は画像ファイルにコメントとしてキーワードが埋め込まれていれば便利そうだという話。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

そのライブラリを使ったプログラム中で、下記のコードで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は次の通り:
上記コードでコメントを埋め込んだPNG

コメントの有無の確認はpngtxtで行った。TweakPNG(ver. 1.2.1)でもiTXtチャンクの有無は確認できたが、日本語は表示できないみたい。ソースが入手できるので、表示できるように修正できるかなと思ったが面倒なのでやめた。

読み込む際のコードはtEXtの場合と特に違いはなさそう。下記内容のmain.cppを用意し、ビルドしたらば、ちゃんとUTF-8でコメントを吐いてくれた(標準出力をテキストファイルにリダイレクトした上で見た)。なお下記はPNG利用術の「読み込み」節のコードをここでの目的に照らして必要最小限に削ったものである。省略は私が勝手に行ったことであり、また、コードそのものに私のオリジナルな部分は一切無い。

ビルドのコマンドライン:
cl /MD main.cpp libpng.lib zlib.lib

main.cpp:
#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++のプロジェクトで「競合」によるビルド失敗が、マルチスレッドDLLで解決した [Windowsプログラミング][C/C++][画像ファイル]

libpngzlibを使って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 を使用してください。

libpng生成とpng出力も参考にした。

Emacsのインライン画像表示機能を活用してyatexやhowmを便利にしたい [Emacs][TeX][yatex][howm][画像ファイル]

画像ファイルを画像データたらしめているのは、ファイル名ではなく画像そのものである。つまり、画像に対していちいちファイル名を用意してそれを基に管理するのは面倒でナンセンスだと考える。(「横着プログラミング 第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のページ

PDFのサムネール画像の作成方法 [PDF][COM][VBScript(WSH)][画像ファイル]

Acrobatの機能として、ページのイメージのサムネール画像の作成・埋め込みがサポートされているが、単体のラスタ画像ファイルでこれを作成したい場合にはどうすればよいか。

外部プログラムでこれらを行うものがいくつかある。

Xpdfに付属する pdftoppm でPDFのページイメージをppmにできる。

pdftoppm.exe -f 3 -l 5 adachi.pdf -r 50 myimg
として、3ページから5ページの画像が50dpiで myimg-000003.ppm とかの名前で出力される。ppmはそれなりに一般的な画像形式のようだが手元のwwwブラウザでは表示できなかった。

またImageMagickの convert でも
convert.exe -resample 50x50% mydoc.pdf hoge.png
などとして全ページのイメージを出力できる。(指定したページのみの場合はどうするのだろう?)

Ghostscriptの使用が多分最も正統派なのだろうが、それはPDF Hacksを参照。

手元のAcrobat 7 Standardはアドバンスドメニューから「すべての画像を書き出し」というメニューがあった。

またAcrobatがあればCOM経由で以下のようにもできる。拡張子をvbsなどとして保存し、ダブルクリックすれば開いてる文書の最初のページがクリップボードにコピーされる。
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のサムネール表示とその画像の解像度について [PDF][Illustrator][画像ファイル]

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キャビネットの表示PDFキャビネットの表示
Acrobat 7 Standardによる埋め込みサムネール画像Acrobat 7 Standardによる埋め込みサムネール画像
Illustrator CSによる埋め込みサムネール画像Illustrator CSによる埋め込みサムネール画像


画像ファイルを指定した埋め込みが最もflexibleと思うのだが、AcrobatのメニューのみならずAPI(もちろんJavaScript、COMインターフェースも)にもそういったものは無かった。まあAPIの方には PDDocCreateThumbs なる関数が用意されているのでこれを駆使すれば同等のことができると思うのだけれど。

ならばサムネール画像を埋め込むソフトはあるかと思いきや、以下しか発見できなかった。複数ページに一気に埋め込むのは面倒な感じである。
http://www.coolpdf.com/pdfthumbnail.html

調べてる最中に、いっそ自前でこういうソフトを作ってしまおうかとも考えたが、PDFの仕様を理解する時間がとれないのでとりあえず保留。

PNGとGIFとJPEGにコメントを埋め込む [画像ファイル]

とりあえず参考URLをメモ。
http://module.jp/blog/comment_in_imagefile.html
http://search.cpan.org/dist/Image-ExifTool/

bmepsはpngをepsに変換できるプログラム [TeX][画像ファイル]

pngな画像をTeXの図に使うためPhotoshopを起動しようとしたらモタツキ具合にブチ切れそうになった。なのでそのためのお手軽ツールを探したらbmepsなるものを見つけた。

Windows用のバイナリも配布されているようだが、手元の環境では c/usr/local/bin/bmeps.exe にもともと用意されていた。ありがたや

EPS画像をサムネイル表示するためにはどうすればよいか [TeX][Illustrator][Igor Pro][画像ファイル]

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
Powered by chalow