djpeg.zip/Readme.txt
プログラム名:djpeg.so(Decompress JPEG deSuyO!)
用途:Rubyからお手軽Jpeg→他形式変換
使い方お手軽産業説明:
・インストールします(下記インストールの項参照)
・require "djpeg" します
・DJpeg.call("-grayscale test.jpg")します
使い方詳細:
djpegをrequireするとDJpegというクラスが使用可能になります。
コンストラクタには下記の1メソッドが含まれます。
・new(img_bytes = nil)
DJpegインスタンスを生成して返します
Stringインスタンスのjpegバイナリを引数として渡した場合はloadメソッドを読んだ場合と同等の動作を行います。
img = DJpeg.new(img_bytes)
と
img = DJpeg.new
img.load(img_bytes)
は完全に等価です。
ただし、loadメソッドと違い失敗を検地できないため、安全に使用したい場合はis_image?と組み合わせる必要があります。
インスタンスメソッドには下記の3メソッドが含まれます。
・load(img_bytes)
Stringインスタンスを受け取り、それをjpegと解釈して読み込みます。
純粋バイナリ以外にBase64形式にも対応しており、渡されたインスタンスの内容から自動識別して動作します。
成功した場合はtrueを、jpegイメージではなかった場合などはfalseを返します。
・is_image?
jpegイメージを保持しているならtrue、保持していないならばfalseを返します。
・convert(hash)
loadしたjpegイメージを指定方式で変換し、bmpバイナリを含んだStringインスタンスとして返します。
jpegイメージを保持していないか、変換に失敗した場合はnilを返します。
引数として指定可能なパラメーターはシンボルに限られており、以下のような物があります。
:grayscall
グレイスケールに変換します。
img.convert(:grayscall=>true)のように使用します。
:color
指定色数に減色します。
img.convert(:color=>256)のように使用します。
・save(filename)
loadしているjpegイメージをそのまま指定ファイル名で保存します。
正常時はtrueを、ファイルの作成に失敗した等の理由で保存できなかった場合はfalseを返します。
クラスメソッドには下記の3メソッドが含まれます。
・ver_string
バージョンをあらわす文字列を返します。
変える形式はhistory.txtに記載しているver0.22a等といった表記の文字列です。
・version
内部で使用されているバージョン番号を返します。
数値であり、ver_stringが変わるたびに必ず1以上上昇します。
・call(str)
strを引数にdjpegを実行します。
引数にとった文字列はコマンドライン引数と同等の分解を行なわれた後に内部Decompressエンジンに渡されて解釈されます。
出力形式を指定しなかった場合、基本的にbmp画像に変換されます。
主なパラメータは下記の通り。
※一覧「主なパラメータ」は工事中
・grayscall(filename)
filenameのjpeg画像をグレイスケールbmp画像に変換します。
DJpeg.grayscall("image.jpg")はcall("-grayscale image.jpg")と等価です。
・color(filename, num)
filenameのjpeg画像を色数numのbmp画像に変換します。
DJpeg.grayscall("image.jpg", 16)はcall("-color 16 image.jpg")と等価です。
もっと詳しい解説:
内部的に「Independent JPEG Group's JPEG software」付属のdjpeg.exeと同等の関数を呼んでいるだけにすぎません。
なので、シェル越しに叩いているかのごとくcallを叩けば意図した動作をします。
インストール:
djpeg.soをrubyからパスの通っているディレクトリ、もしくは使用したいrbファイルと同じディレクトリに配置してください。
djpeg.so以外のファイルは動作には関係ないため削除などご自由に。
アンインストール:
レジストリもテンポラリファイルも弄っておりません。
ファイル削除するだけですっきりさっぱりおさらばできます。
ファイル解説:
djpeg.so 拡張ライブラリ本体
Readme.txt 今読んでいるこれ
History.txt 更新履歴です。
Q&A:
Q:認識はしているけど出てきた画像がグチャグチャ
A:使用法を間違っている可能性が高いです。
使用法をもう一度見直してきちんと引数などを渡せているか検証してください。
Q:「外部に通信しようとしています、許可しますか?」的なダイアログ出るんだが
A:なぜかは知りませんが拡張ライブラリはws2_32.dll(ネット通信用dll)とリンクしなければいけないルールなせいです。
別に使っていないので許可せずとも動くとは思いますが、場合によってはおかしい動作をするかもしれません。
Q:いちいちインストール作業が面倒、クリック一発OKなbatファイルとかないの?
A:ありません
正確には、作者がRubyに疎くて作りたくても作れませんでした。
Q:使い方まったくわからん
A:作者が適当なためわかりづらいのは仕様です。
がんばって解読作業に入るか、このプログラムに見切りをつけて他を探すと良いでしょう。
Q:これを使用したプログラム配布したいんだけど、一緒に同梱していい
A:構いません、むしろ推奨します。
ただし下記ライセンスの項の著作権者表記を載せておかないと怒られるかもしれません。
詳しくはライセンスの項をお読みください。
Q:○○なことをしたいけど今の機能だけでは実現できない
A:作者の力不足です。
作者メールアドレスまで要望を投げてもらえればいつか実装されるかもしれません。
Q:Rubyなら他にいくらでもjpeg入出力ライブラリあるからいらなくね?
A:exerbなど一部環境において(ライセンス問題などで)使えるものがないため開発されました。
その他ライブラリで済むのならば済ませるべきでしょう。
Q:Rubyに更新かかって使えなくなったんだけど
A:作者にゴルァすると更新するかもしれません。
Q:ソース公開すれば手元でコンパイルできるじゃん、だから公開しろ!
A:コンパイルを通すために色々無理を通して道理を引っ込めたため公開が非常に難しいという問題があります。
手元の環境が特殊なのか、djpegのコードと相性が悪いのか、はたまたRubyのコードが悪さをしているのかは不明。
あと、ソース配布に伴うライセンスの諸々が面倒くさいんです、ごめんなさい。
Q:その他バグをみつけた or 動作しない or 要望がある
A:公開しても問題が無いメールアドレスにて下部に記載されたアドレスまでメールをどうぞ。
(必ず対応できるとは限りませんが……)
作者:sweetie
メールアドレス:bnryxx332a(あっと)mail.goo.ne.jp
ライセンス:
本プログラムは独自ライセンスされたプログラム「Independent JPEG Group's JPEG software」を使用しています。
{{{
This software is copyright (C) 1991-2009, Thomas G. Lane, Guido Vollbeding.
All Rights Reserved except as specified below.
}}}
それ以外の自作部分ライセンス:
・本ライセンスにおいて、全ての条項は「変更の有無を問わず、明示暗示を問わず、商業慈善を問わず、個人法人を問わず、保持使用を問わず、有料無料を問わず」と装飾されている物として扱う。
・著作権者は本ソフトウェアに関する一切の保障義務をもたない。
・上記条項唯一の例外として、本ライセンスに違反した場合を除いて著作権者から本ソフトウェアに関する一切の法的措置を受ける事が無い事のみ保証される。
・著作権者やその他保持者がこのライセンスの範囲で行う活動に支障が無い範囲であれば何を行っても構わない。
・上記条項の”何を行っても構わない”には本ソフトウェアの製作者を偽っての再配布も含まれる。
・全ての権利の行使において、著作権者への連絡、著作権者やライセンス条項の記載、適用ライセンスなどの制限は一切存在しない。
著作権者名:sweetie
面倒な人向けライセンス解説:
「Independent JPEG Group's JPEG software」の著作権者表示2行と
「Independent JPEG Group's JPEG software」を使っている事を示す文章をどこかに書いておけば再配布出来ます。
自作部分のライセンスについては記載義務すらありません。
上記二行だけ説明書に放り込んでおくといいでしょう。
スペシャルサンクス:
ゆご(Ayokura) Ruby拡張ライブラリに関する情報提供
unyaunya Ruby拡張ライブラリにおいてwikiを大いに参考にさせていただきました。
http://f21.aaa.livedoor.jp/~unya/pukiwiki/pukiwiki.php?%5B%5B%A4%CE%A1%BC%A4%C8%2F%A5%BD%A5%D5%A5%C8%A5%A6%A5%A7%A5%A2%2FRuby%5D%5D
青木峰郎 Ruby拡張ライブラリにおいてwikiを大いに参考にさせていただきました。
http://www.loveruby.net/w/RubyExtensionProgrammingGuide.html
技術情報(と、どうでもいい話):
Rubyで生成したmakefileでは通らず、適当に自前でmakeを書いて通したため動作に問題があるかも。
リファレンスなどには乗っていないが__declspec(dllexport)でInit_djpeg関数を装飾しないと動かなかったので装飾している。
内部的にはdjpeg.cのmainを呼んでいるだけ(中身は多少は変えてあるけど)
djpegの中身の酷さにただひたすら泣かされた、ruby側の実装も酷かったけど1行で直るだけマシっちゃまし。