Armadilloフォーラム

Armadillo410 色指定について

sankyo_takada

2015年5月1日 11時34分

お世話になっております。
高田と申します。
Armadillo410+QtでGUIを作成しているのですが、
ウィジェットの色指定について質問があります。

LCDに表示される画面をキャプチャして、
指定した色と実際に表示される色(キャプチャ画像)を比較すると
微妙に異なっています。
例えば#188FCF(指定) → #188ECE(実際)といった具合です。
(Qtが表示色を変更している?)
指定した色で表示したいのですが、どのようにすればいいのでしょうか?

なお、キャプチャは以下のようにして取得しています。(PNG形式で保存)

// ファイル保存
strPath.append(filename);
strPath.append("_");
strPath.append(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz"));
strPath.append(".png");
 
QImage img(widget->size(), QImage::Format_RGB32);
QPainter painter(&img);
widget->render(&painter);
 
if ( img.save(strPath) == false) {

また、色の指定方法は以下になります。

#define _COLOR_MAIN_TITLE_LINE          "#188FCF"
QWidget* titleline = new QWidget(this);
titleline->setGeometry(0, 49, 480, 8);
titleline->setAutoFillBackground(true);
titleline->setPalette(QPalette(QColor(_COLOR_MAIN_TITLE_LINE)));

環境
Armadillo410
Qt4.8.3
Linux2.6.26

よろしくお願いいたします。

コメント

at_takashi.sasayama

2015年5月1日 18時29分

笹山です。

> 指定した色と実際に表示される色(キャプチャ画像)を比較すると
> 微妙に異なっています。
> 例えば#188FCF(指定) → #188ECE(実際)といった具合です。

色の RGB 値を、どのような方法で確認されているかを
教えていただけないでしょうか?

例)
PNG形式で保存した画像をGIMPで開き、
ピクセル情報 ダイアログで _COLOR_MAIN_TITLE_LINE で指定した個所の RGB値を確認。

atde4-qt-amd64-20130131 上での確認結果なのですが、
Qtアプリで 色を #188FCF に指定したウィジェットを描画し、
画面をプリントスクリーンして、上述したGIMPの方法でRGB値を確認してみましたところ、
#188FCF の値が変わってしまう現象は発生しませんでした。

また #188FCF 以外で、異なってしまったRGB値がありましたら
教えていただけないでしょうか?

笹山 様

高田です。
早々のご回答ありがとうございます。

> 色の RGB 値を、どのような方法で確認されているかを
> 教えていただけないでしょうか?

PNG形式で保存したキャプチャ画像を「Paint.NET」で開き、
色選択ツールで画像の指定箇所を選択した際に
色情報ウィンドウに表示されるRGB値を確認しました。

> また #188FCF 以外で、異なってしまったRGB値がありましたら
> 教えていただけないでしょうか?

以下の色でも指定と異なっているようです。

指定色    キャプチャ
#E6E6E8  → #E7E7EF
#7690FF  → #7392FF
#FFC182  → #FFC384
#F6FD8A  → #F7FF8C

キャプチャ画像の形式をBMPにするなどして試してみます。

at_takashi.sasayama

2015年5月11日 17時42分

笹山です。

> PNG形式で保存したキャプチャ画像を「Paint.NET」で開き、
> 色選択ツールで画像の指定箇所を選択した際に
> 色情報ウィンドウに表示されるRGB値を確認しました。

上記の情報ありがとうございました。

下記プログラムをArmadillo-440上で実行し、
生成された test.png を Paint.NET、GIMP で RGB値を確認してみたのですが、
指定色が変わってしまう現象は再現できませんでした。

#define _COLOR_MAIN_TITLE_LINE          "#188FCF"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->widget->setGeometry(0, 50, 50, 50);
    ui->widget->setAutoFillBackground(true);
    ui->widget->setPalette(QPalette(QColor(_COLOR_MAIN_TITLE_LINE)));
 
    QImage img(ui->widget->size(), QImage::Format_RGB32);
    QPainter painter(&img);
    ui->widget->render(&painter);
    img.save("test.png","PNG");
}

再現させることができるプログラムなどがありましたら
解析用に送っていただくことは可能でしょうか?

笹山 様

お世話になります。
高田です。

ご連絡遅れまして申し訳ありません。
また、こちらのキャプチャ方法が違うことがわかりました。
サンプルまで作成していただきながら大変申し訳ありません。

こちらではfbcatコマンドを使用してキャプチャしていました。
以下のような感じでppmファイルに出力した後にpng形式に変換していますが、
ppmファイルの時点で色が指定色と異なっています。
./fbcat /dev/fb0 > screenshot.ppm

作成していただいたサンプルとfbcatコマンドで取得したキャプチャでは
色が変わってくるのでしょうか?
また、色が変わる場合はどちらのキャプチャが実際の表示色となるのでしょうか?

お手数おかけしますが、よろしくお願いいたします。

伊澤です。

これまたよく分かっていないのに首を突っ込みますw
fbcutのソースを読んでみたのですが、colormap配列の値を(8bit足切りして)
参照しているので詳しいことは分かりませんでした。

処で、フレームバッファー自体は16bppなのでRGB各プレーンが5~6bitしかありません。
なので、8bitずつ指定しても足切りされて出力(表示)されていると思われます。
となると、ビット数が足りないので出力(表示)して入力(キャプチャ)し直した
段階で再現性がなくなるのは仕方ないことのようです。

高田様が挙げられた色についても、各プレーンごとに最大7(E8→EF)画素値が違うようです。
これも、3bit以内に納まるので矛盾はしていないと思います。
# と言うか、下位2~3bitの補間の仕方に傾向がありそうです。

高田です。
ご連絡遅くなりまして申し訳ありません。
また、ご回答ありがとうございます。

> 処で、フレームバッファー自体は16bppなのでRGB各プレーンが5~6bitしかありません。
> なので、8bitずつ指定しても足切りされて出力(表示)されていると思われます。
> となると、ビット数が足りないので出力(表示)して入力(キャプチャ)し直した
> 段階で再現性がなくなるのは仕方ないことのようです。

ご指摘の通り、Armadillo400シリーズのソフトウェアマニュアルを見ると
フレームバッファの仕様でRGB565カラーと記載されていますね。
勉強不足でお恥ずかしいです。

なお、RGB565というのはハード的な制約なのでしょうか?
ソフトウェアマニュアルでは「標準ではRGB565カラーの設定になっている」
という旨の記載がありますが、設定を変えればRGB888にも対応可能なのでしょうか?

よろしくお願いいたします。

at_takashi.sasayama

2015年5月28日 19時40分

笹山です。

> ソフトウェアマニュアルでは「標準ではRGB565カラーの設定になっている」
> という旨の記載がありますが、設定を変えればRGB888にも対応可能なのでしょうか?

ハード的な制約で 24bpp(RGB888)をLCDに出力することはできません。

これは Armadillo-410 から LCDへデータを出力する線が 18bit までしか出ていない為です。
(24bpp で LCDに出力するには 24bit 必要になります。)

i.MX25のLCDコントローラー自体は 24bpp に対応しているのですが、
LCDC_LD18 信号を出力できる全てのピンが、Armadillo-410 上で別の機能と接続済みです。
その為、ピンマルチプレクスの変更でも対応ができません。

> なお、RGB565というのはハード的な制約なのでしょうか?

LCDへデータを出力する線が 18bit 出ていますので、18bpp(RGB666)まではハードとして出力可能です。
しかし linux-2.6.26-at のフレームバッファドライバーが 18bpp に対応していません。
その為、ソフト的な制約により 16bpp(RGB565) が限界です。

■参考情報

i.MX25 Multimedia Applications Processor Reference Manual Rev.2
Chapter 33 Liquid Crystal Display Controller (LCDC)

上記データシートでは、24 bpp 時の設定に関して一部説明が抜けていますので、
以下も参考にしてみてください。

About 24bit LCD panel connection for i.MX25
https://community.freescale.com/thread/339831

高田です。

ご回答ありがとうございます。
表示色について理解できました。
RGB565にて画像を作成したいと思います。