ドナドナされるプログラマのメモ

Windows用アプリのプログラミングメモ

MozJpegGUIの更新: そもそもPNGとJPGでメタデータの互換性がない!?

githubのissueに、メタデータのコピーに失敗するPNGのサンプルがアップロードされた。

github.com

そこで、さっそく解析ソフトを作って、どんなメタデータがコピーできていないのかを調べてみた。そして絶望した。

PNGにおいて、画像を含む各種データはチャンクに格納される。各チャンクの種別はChunk Typeを読むことでわかる(PNGのファイルフォーマットは下記公式仕様を参照した)。

http://www.libpng.org/pub/png/spec/1.2/PNG-Structure.html

そして、今回issueとして上がっていた「画像変換時にメタデータをコピーしたい」において、コピーを希望されていたのはtEXtチャンク内に保存されたテキストだった。tEXtチャンクには「キーワード」(任意の79文字以下)と「テキスト」(任意文字数)のペアを1つ保存することができ、今回のissueのサンプルではキーワード:「prompt」「workflow」の2つのチャンクが存在し、それぞれに長大なテキストが存在した。

これをJPGにコピーするには、同様のテキスト保存機能か、そのキーワードに相当するタグが必要だ。しかし、JPGの仕様書をいくら見ても任意のテキストキーワードを保存する機能は無い。また、AIのpromptやworkflowに対応するようなタグも当然無い。すなわち、当該メタデータPNGからJPGにコピーすることはできない。

どうしたものか。コメントセグメントにでも保存するか?

MozJpegGUIの更新: メタデータコピーの方針

MozJpegGUI 1.3にメタデータコピー機能を追加するための方針について。

まず、MozJpegライブラリにメタデータ指定機能があるかどうかを調査した。・・・うーん、元jpegにあるメタデータをコピーできるのに、メタデータの外部指定機能がなさそう?

次に、画像変換後にWin32APIを使ってメタデータを書き込む方法を調査した。GDI+のImageやBitmapを使えばできるようだけど、困ったことに読み込みや保存に実ファイルが必要。しかも、読み込み元と保存先は別ファイルにする必要がある。ということは、保存が今まで1回だったのが、2回に増えてしまう。メモリ上に一時ファイル(tempファイル)を作成するなどの迂回策が必要そうだ。

最後に、MozJpegライブラリに手を加えることで対応できるか調査した。cjpeg.cの/* Copy metadata */以下にてメタデータ保存要否をマーカー毎に判断しているようだ。ということは、マーカーデータを必要に応じ生成してあげればいいのね。大変そうだけど。

以上をまとめると、以下な感じかな。

  • メタデータをGDI+等で読み取り、MozJpegの引数指定でメタデータを保存:そのような引数はなさそうなのでNG
  • メタデータをGDI+にて後処理で保存:ファイル保存回数が1増えるので、避けたい
  • MozJpegライブラリに、GDI+で読み取ったメタデータを保存する機能を追加する:できなくはないけど難易度高い?

3番目の案が処理一番早くなるけど・・・どうしようかな。以下、今後の調査のためのメモ。

JPEG メタデータ仕様

dev.exiv2.org

hp.vector.co.jp

MozJpegGUIの更新: メタデータのコピー状況

MozJpegGUI 1.3は、メタデータのコピーについてMozJpeg任せにしている。そこで、GDI+を利用する簡単なメタデータ表示ソフトを作りメタデータのコピー状況を確認してみた。

まずはサンプルデータの収集。プロが撮った写真や、プロが公開している画像だとexifがたいてい削除されていると思うので素人が撮った写真を探す。まずはTwitterを漁ってみたが画像アップロード時にexifを削除する仕様らしく色情報テーブル、輝度情報テーブル、ICC profile程度しか残っていなかった。さすが素人仕様、ちゃんと対策しているのね。となると・・・そこいらへんが甘そうな素人向けシステムは・・・はてなブログかな。というわけで漁ってみたところ、ビンゴ。jpegpngexifデータが残っていることを確認した。

サンプルデータを入手できたので、MozJpegGUI 1.3での変換前後でどう変わるか調べてみる。まずは風景写真のjpg。

風景写真jpgの変換前メタデータ

風景写真jpgの変換後メタデータ

ファイルサイズが1/5になっているので、変換は間違いなく実行できている。かつ、少なくともGDI+で認識できるデータはすべてコピーできているようだ。

次に、pngを試してみる。はてなブログから拾ってきたやつはタグ0x5110, 0x5111, 0x5112を共通で有し、画像によって0x131をもってたり0x13e, 0x13f, 0x132をもっていたりしてた。一方でMSPaintを使ってjpgをpngで保存した場合、0x303, 0x301, 0x110, 0x131, 0x132, 0x9003と多数保存されていた。とりあえず傾向を見れればいいので、風景写真をMSPaintでpng保存したもので比較してみる。

風景写真pngの変換前メタデータ

風景写真pngの変換後メタデータ

うん、がっつり消えてるなあ。最後に、gif。これもMSPaintが一番残してくれるっぽい?

風景写真gifの変換前メタデータ

風景写真gifの変換後メタデータ

gifもがっつり消えている。

というわけで、まとめるとjpeg->jpegなら(少なくともGDI+が認識できる)メタデータは消えていないが、png->jpegやgif->jpegでは多くのメタデータが消えてしまうようだ。

さて、どうやって速度を落とさずにメタデータを保持しようかな。

MozJpegGUIの更新

MozJpegGUIの更新に着手。目標は、

このうち、ライブラリのバージョンアップは完了。速度は変わらず。

メタデータの維持はどうやろうかなあ。GDI+を使うのが王道っぽいけど、Save()時に再エンコードされそうでこわい。

自転車用ウインカーの制作(17)

ここまでにかかった材料と費用のまとめ。

■回路

 

5LED リアライト | 【公式】DAISO(ダイソー)ネットストア (100円)×5

AVRマイコン ATTINY202−SSNR: マイコン関連 秋月電子通商-電子部品・ネット通販 (70円)×5

SOP8(1.27mm)DIP変換基板 金フラッシュ (9枚入): パーツ一般 秋月電子通商-電子部品・ネット通販 (100円)×1

両面スルーホールガラスコンポジット・ユニバーサル基板 Fタイプ: パーツ一般 秋月電子通商-電子部品・ネット通販 (15円)×4

片面ユニバーサル基板 45×45mm: パーツ一般 秋月電子通商-電子部品・ネット通販 (50円)×1

5mm黄色LED 590nm OSY5RU5A31E−NO (100個入): LED(発光ダイオード) 秋月電子通商-電子部品・ネット通販 (150円)×1

カーボン抵抗(炭素皮膜抵抗) 1/6W150Ω (100本入): パーツ一般 秋月電子通商-電子部品・ネット通販 (100円)×1

カーボン抵抗(炭素皮膜抵抗) 1/6W1kΩ (100本入): パーツ一般 秋月電子通商-電子部品・ネット通販 (100円)×1

半固定ボリューム GF063P 1kΩ: パーツ一般 秋月電子通商-電子部品・ネット通販 (30円)×1

高速スイッチング・ダイオード 1SS178(100本入): 半導体(モジュール) 秋月電子通商-電子部品・ネット通販 (100円)×1

圧電スピーカー(圧電サウンダ)(13mm)PKM13EPYH4000−A0: パーツ一般 秋月電子通商-電子部品・ネット通販 (30円)×1

2.5mmピッチコネクタ ハウジング 2P SXH−2 (20個入): パーツ一般 秋月電子通商-電子部品・ネット通販 (80円)×1

XHコネクタ ベース付ポスト サイド型 2P S2B−XH−A(LF)(SN): パーツ一般 秋月電子通商-電子部品・ネット通販 (10円)×11

2.5mmピッチコネクタ コンタクト SXH−001T−P0.6C (100個入): パーツ一般 秋月電子通商-電子部品・ネット通販 (150円)×1

防水トグルスイッチ 1回路2接点 IP67 パネル取付用: パーツ一般 秋月電子通商-電子部品・ネット通販 (130円)×2

AWG28 赤・黒ペア撚り線 オヤイデ電気 (44円)×10m

電池ボックス 単3×2本 リード線・間仕切りあり: パーツ一般 秋月電子通商-電子部品・ネット通販 (50円)×1

小計 2660円

■プログラミング用デバイス

FT234X 超小型USBシリアル変換モジュール: 半導体(モジュール) 秋月電子通商-電子部品・ネット通販 (780円)×1

■構造材

ヒノキ材 35×10×450 セリア (100円)×1

DAT―11 スチール金具 L字 M 4P | 【公式】DAISO(ダイソー)ネットストア (100円)×1

クリアキューブ90 | 【公式】DAISO(ダイソー)ネットストア (100円)×1

パッキン一体型保存容器(抗菌加工、200mL) | 【公式】DAISO(ダイソー)ネットストア (100円)×1

小計 400円

■工具類(すでに持っていたものも含む)

ハンダごて 30W | 【公式】DAISO(ダイソー)ネットストア (500円)×1

ハンダ 精密部品用 (300円?)×1

ジルコニウムコーティング 鉄工ドリル刃2.0mm | 【公式】DAISO(ダイソー)ネットストア (100円)×1

ジルコニウムコーティング 鉄工ドリル刃3.0mm | 【公式】DAISO(ダイソー)ネットストア (100円)×1

チタンコーティング鉄工ドリル刃5.0mm6角ビット付 | 【公式】DAISO(ダイソー)ネットストア (100円)×1

グルーガン | 【公式】DAISO(ダイソー)ネットストア (200円)×1

グルースティック(クリア、15本、7.5mm×100mm、ボ | 【公式】DAISO(ダイソー)ネットストア (100円)×1

レジン ハードタイプ 20g ダイソー (300円)×1

プラスドライバー

ねじりっこ

小計 1200円

 

材料費(基板+構造材):3060円

道具類(工具+プログラミング):1980円

合計:5040円

 

はんだごて等の工具類はだいたい持っていたから、今回かかったのは4000円ぐらいかな。

大人の夏休みの工作にしては、安く済んだかな?

自転車用ウインカーの制作(16)

今日は、各部品を自転車に固定するパーツを作る。

まずはウインカー用スイッチから。

ブレーキを固定している部分に、ブレーキと共締めで固定したい。でも、ネジの向きとスイッチの向きがねじれの関係になるので、パーツを作る必要がある。

何かいいのが無いかなーと探してたら、あった。

クリアキューブ90jp.daisonet.com

クリアキューブ90

こいつのコーナー部分を切り出して使う。

で、できあがったのがこちら。ちょっと穴あけミスってヒビが入ったけど、大丈夫だろう。分かりづらいけど、スイッチの向こう側にも壁がついていて、なにげに頑丈なのがポイント。本当は共締め側に壁が欲しかったんだけど、他のパーツと鑑賞する恐れがあったので断念。

スイッチ固定ツール

次。尾灯を固定する台。セリアで35mm×10mm×450mmのヒノキ板を購入。

尾灯はサドル後方の荷物固定部に取り付けるため、90度のアングルを介して台を取り付け、これに開けた穴にねじりっこを通して固定する。

アングルはやはり100均で4個入りのものを使用。スチール製なので錆びるかもしれん。

DAT―11 スチール金具 L字 M 4Pjp.daisonet.com

尾灯の取付台

これにねじりっこを通して

ねじりっこを通したところ

尾灯後部のフックを引っ掛ける。

尾灯のフックを引っ掛けて固定

反対側も固定して、後方のウインカー完成。

後方のウインカー完成

同様にして、前方のウインカーも完成。

前方ウインカー完成

今日はここまで。

自転車用ウインカーの制作(15)

自転車用ウインカー続き。

前回バグを修正したあとの基板裏面写真。追加抵抗が目立つ。

基板裏面(バグ修正後)

さて。これを容器に密封しなきゃならないんだけど。電池交換のことを考えるとフタつき密封容器が良さそうだ。

いいのがあった。

パッキン一体型保存容器(抗菌加工、200mL)jp.daisonet.com

これなら4方向にロックもついてて、意図せず開くことも無さそうだ。

さっそくフタに穴を開け、基板を固定。

フタに基板を固定したところ

ケーブル類は容器の方に穴を開けてそこを通そう。穴はあとで塞ごう。

んー。この容器はハンドル付近に固定したいけど、どうやって固定しようかな。

そういえば、あまった尾灯があったなあ。試しにつけてみるか・・・

ぴったりすぎる!採用!ということで、グルーガンで固定。

尾灯の下半分がピッタリハマった

自転車固定部もつけたところ

試しにケーブルを全て穴に通してみる。うん、なんとかなるな。

容器の穴にケーブルを通してみた

試運転

今日はここまで。