自分自身の
自分自身による
自分自身のための ものづくり
/ プログラム

LCDのサブピクセルを考慮して画像のアスペクト比の変換をするテスト

はじめに

液晶モニタって画素が離散的なのでゲーム機を繋ぐには向かないんだよなぁ。
→でも、サブピクセルまで考慮して補完したらどうなるのかな?
→X68000エミュレータで実機のアスペクト比が1:1じゃない画面モードの 処理とかに使えないかな?

…というアイディアが浮かんだので、実験プログラムを書いてみました。 手始めに、X68000で描かれた512x512のPICファイルを変換することにしました。

プログラム

以下にプログラムを書く前に感じをつかむために書いたメモを貼っておきます。

処理イメージ

以下が書いたプログラムです。

g++でコンパイルできることを確認しています。たぶん他のC++処理系でも 問題なくコンパイルできると思います。

実験とその結果

準備

手持ちのパソコン通信時代の画像データが貯めたMOの中を漁ってPIC画像を 探しました。で、選んだのはぷりめ〜らさんが描いたPR_014.PIC 「セーラー服な、ナコルル様(;_;)」。

MAGとかPICとかからppmに変換するツールを作った方がいて、以前に大学でSUN4を 使っていたときにコンパイルして使っていたはずなのですが、検索しても 見つかりませんでした。しょうがないので、GVで読み込んでアスペクト比を変換せずに 表示してPNGで保存し、元データとしました。

実験

変換プログラム自体はWebサーバを兼任しているLinux機で動かしましたが、 作業と閲覧はWindows環境の ThinkPad T22 AEJ(SXGA+のLCD搭載) にて ターミナルとかVNCとかsambaとかを通して行いました。

結果

無許可で載せるとまずいので、とりあえずほんの一部分を切り取って掲載。

(後で載せてもいいか問い合わせよう…。)

変換元画像

変換後の画像

上から順に、
・pic_expand 1.3333
ViX 単純拡大縮小 (512x512→682x512)
・ViX三次補間 (同上)

変換元画像2倍拡大

変換後の画像

上から順に、
・pic_expand 1.3333 2
・ViX単純拡大縮小 (512x512→1365x1024)
・ViXにて横方向に三次補間で1365x512に拡大、さらに1365x1024に単純拡大

pic_expandで拡大した画像はLCDで見ないと想定した結果になりません。CRTでは ダメです。また、LCDのサブピクセルが左からRGBと並んでいることを想定しています。 たまにあるらしいBGR配列のだとダメですし、LCDを90°回転して 縦画面で使っていたりしてもダメです。

考察

効果は微妙です。

単純拡大で気になるドットの大きさの不揃いは軽減されていますし、 三次補間によるボケもありませんが、色の境界に元々無い色が現れています。

サブピクセルを利用する場合は 液晶のガンマ特性を考慮する必要があるらしいです。また、 Sub-Pixel Font Rendering Technologyでは境界に現れる色を低減する 手法が書かれています。(後者は実験しました。)

他、色々

LCDはブラウン管と違って画素がピクセル単位で固定されているために、その モニタの画素数と異なる大きさの画像を表示するときにガタガタになるのが 問題だったけど、サブピクセルまで使えば横方向の解像度についてはCRTと 肩を並べるんだよなぁ。わたしゃは 各種ゲーム機を繋ぐので液晶 モニタは却下だったのだけど、サブピクセルまで使って横256ドットだろーが 320ドットだろーが512ドットだろーが640ドットだろーが1280ドットだろーが それなりに映る、アスペクト比固定拡大機能付きのSXGAのS入力付き液晶モニタが あったらCRTを捨ててもいいかも。ちゃんと実装してあれば、横方向の解像度に 関しては、今使っているXRGB-2plus&CRTよりもずっとよくなるはずだ。

軽くWebを検索しただけだと、サブピクセルを使う 平面薄型モニタは Panasonic 「VIERA(ビエラ)」しか見つからなかった。高いよっ! パネル自体は従来の物が使用できてコントローラを変えれば対応できるはずだから、 他のメーカーも追従して低価格のにも搭載してくれー。

履歴・著作

2005/02/11

プログラム作成・ページ作成

by 爆竹銃 @自分自身のためのものづくり