Casio Python - RGB値による色設定

Python Casio Python
 Casioグラフ関数電卓の Python を使ってみる
     - RGB値による色設定 
目次


初版:2020/10/31
追記:2020/11/02
修正:202011/03

前の記事 - 14. CGモデルとFXモデルのPythonモードの違い |  次の記事 - 16. circle() 関数のFXモデルへの拡張


15. RGB値による色設定 

Casio Python のグラフィックモジュール - casioplot には、色の値を引数にとったり、戻り値として色の値を返すグラフィック関数 (描画関数) があります。そして色の値は、256階調のRGB値をタプル型の (R, G, B) で使うことが仕様になっています。
 
RGB値 = (R, G, B)と実際の色の関係は、なかなか判りにくいと思いますが、例えば以下のようになります。

  (white) - (255, 255, 255)
(black) - (0, 0, 0)
(blue) - (0, 0, 255)
(red) - (255, 0 ,0)
マゼンタ (magenta) - (255, 0, 255)
(green) - (0, 255, 0)
シアン (cyan) - (0, 255, 255)
(yellow) - (255, 255, 0)


15.1 RGB値の色を確認するプログラム
最初に、256階調のRGB値と実際の色を fx-CG50 で確認するプログラムを紹介します。
RGB指定による色確認プログラム - RGB2ap:RGB Ver 1.2ap <シンプル機能版>

RGB_sample1 RGB_sample2 RGB_sample3 

RGB_sample4 RGB_sample5 RGB_sample6. 

このような感じで、RGB値を指定すると、fx-CG50 の液晶で実際にどのような色になるのかを確認できます。

純正Casio Basic はRGB値での色指定機能が無いので、このプログラムは CGモデル用のアドイン版Casio Basic - C.Basic for CG で走らせる必要があります。C.Basic for CGC.Basic for CG:最新版の入手のページ から Ver 1.45  build 20 を ダウンロードし、解凍して得られる CBCG145.g3afx-CG50 のストレージメモリに転送すれば、インストールできます。

C.Basic for CG のマニュアル類も同じページから参照できます。

RGB2ap は、上記からダウンロードして解凍して居られる RGB2ap.g3mfx-CG50 のストレージメモリか、その下に作った C.Basic 専用フォルダ (例えば @CBASIC) に転送してインストールします。


15.2 fx-CG50 の高精細カラー液晶 - 実は 16bit カラー
Casio Python の仕様として、256階調の RGB値、つまり 24bitカラーで色を表現することになっています。ところが、fx-CG50 の実際の高精細カラー液晶は 16bitカラー液晶です。

・R:0から始まり 248 までの 8 飛びの整数 32 個で指定 - 5bit
・G:0から始まり 252 までの 4 飛びの整数 64 個で指定 - 6bit
・B:0から始まり 248 までの 8 飛びの整数 32 個で指定 - 5bit

※ 5bit + 6bit + 5bit = 16bit 


24bitカラーは 224 = 16,777,216 色であるのに対して、fx-CG50 で実際に表現できる色は 216 = 65,536 色まで少なくなっています。
16bitカラーの液晶に対して、24bitカラーで色指定をしてもエラーにならず、RGB値それぞれ、設定値以下の有効な値が自動的に採用されます。例えば、(255, 255, 255) 白 を指定すると、自動的に (248, 252, 248) となり、実際に白色が指定されます。

fx-CG50 のカラー液晶は、PCやスマホのカラー液晶と異なり、視線の角度が変われば色が変化してしまいます。RGB値での色設定は、あまり細かいことを気にしない方が良いと言えます。従って24bitカラー、つまり 256階調のRGB値による色指定でも大きな問題にならないと思います。むしろ問題になるようなスクリプト/プログラムは fx-CG50 には不向きだと割り切るべきでしょう。

fx-CG50 / CG20 のaRGBカラー設定について詳しくは こちら を参照ください


15.3 モノクロ液晶モデルでのRGB値による色設定
モノクロ液晶を搭載した FXモデルでは、黒 (0, 0, 0) か 白 (255, 255, 255) のどちらかの値しかありません。

実際に使うときは、黒は (0, 0, 0)、白は (255,255,255) を使えば問題ありません。但し、CGモデルのスクリプトを FXモデルに移植する場合は、少しだけ注意が必要です。

そこで、モノクロ液晶を搭載するFXモデル (fx-9750GIII) での動作を検証します。

グラフィック画面の左上の座標 (0, 0) にあるピクセルの色を取得して出力します;
スクリプト:
 from casioplot import *
 print(get_pixel(0, 0, 0))

出力:
 (255, 255, 255)
解説:
 ピクセルの色を取得する時は、白 = 点がない 場合は (255, 255, 255) を返します。
 つまり、256階調 (24bit) カラーとしての仕様に従ってピクセル色を取得しています。
  このスクリプトを fx-CG50 で実行しても (255, 255, 255) が出力されます。

 グラフィック画面の左上の座標 (0, 0) にあるピクセルに黒か白の色を付けます
スクリプト1:RGB値 (247, 251, 247) で描画
 from casioplot import *
 set_pixel(0, 0, (247, 251, 247))
 show_screen()

出力:
 座標 (0, 0) のピクセルが黒くなります

スクリプト2:RGB値 (248, 252, 247) で描画
 from casioplot import +
 set_pixel(0, 0, (248, 252, 248))
 show_screen()

出力:
 座標 (0, 0) のピクセルが白くなります = 点が見えない

解説:
 ピクセルに色を付ける時は、(248, 252, 248) で白になります、
 これより小さい値では黒くなります。
  R < 248, G < 252, B < 248 の (R, G, B) で黒を描画します。
  R ≧ 248, B ≧ 252, B ≧ 248 の (R, G, B) で白を描画します。
 つまり、実際は 16bit カラーを前提にして動作しています。
 CGモデルのスクリプトをFXモデルに移植する際は、この点に留意すでば動作を正しく理解できます。

モノクロのFXモデルでの仕様の混乱は、実際は 16bit カラーのCGモデルのスクリプトとの細かい互換性を得るためだと思われます。


15.4 RGB値でのピクセル色設定と読取りの実験 - CGモデルとFXモデル
以下のスクリプト (CGモデル・FXモデル共用) を作りました。

このスクリプトの概要は、
(1) RGB値を1づつ変化させピクセルに色を付けて線分を描きます
(2) 描いた線分を端から順にスキャンして、各ピクセルの RGB値を読み取ります。

描いた線分の隣り合ったピクセルのRGB値の差は 1 になっています。そこで、
(a) 読み取ったRGB値が 1づつ変化していれば画面は 24bit カラー
(b) 読み取ったRGB値が 4 ないし 8 の倍数の値であれば 16bit カラー
だと判ります。

スクリプトを少し詳しく説明します。
  • このスクリプトは、set_pixel() を使って、RGB値を変えながらドットを x座標 0 から end-1 まで水平に描画します。
  • これを y座標 30、40、60 の位置に3本描きます。
  • 描いた3本の線分の各ピクセルを水平に x座標 start から end-1 まで順に get_pixel() を使ってRGB値を取得し、そのRGB値をシェル画面に出力します。
  • CGモデルかFXモデルかに応じて、startend の初期値を設定します。
  • CGモデルかFXモデルかの判定は、get_pixel() が画面の範囲外のピクセルを指定した時に None を返すことを利用します。
  • FXモデルの画面の範囲外の座標 (128, 64) を使って、get_pixel(128,64) を実行すると、FXモデルの場合は None を返します。
  • None が返されたとき、start=98, end=128 とし、そうでないとき start=195, end=256 と初期化します。

以下の具体的なスクリプトを実際に実行してみてください。

ckPixelCol.py - ダウンロード

from casioplot import *

# CGモデルかFXモデルかで初期値を変える
if get_pixel(128,64)==None:
 start=98;end=128
else:
 start=195;end=256

# RGB値を0から1づつ変化させて、横にピクセルに色を付けてゆく
for i in range(end):
 set_pixel(i,30,(i,0,0)) #(R,G,B)のRを0から1づつ増やし、左端からend-1まで点を打つ
 set_pixel(i,40,(0,i,0)) #(RGB)のGを0から1づつ増やし、左端からend-1まで点を打つ
 set_pixel(i,50,(0,0,i)) #(RGB)のBを0から1づつ増やし、左端からend-1まで点を打つ

# 16bitカラーの白(248,252,248) で 座標(60,60)のピクセルを白くする
r=248;g=252;b=248
set_pixel(60,60,(r,g,b))
show_screen()
# グラフィック画面に3本の線分が描画されたら、[EXIT]キーを押して、シェル画面に切り替える

# シェル画面で、設定したRの値と get_pixel()で読み取ったRGB値を表示する
print('=R=')
for i in range(start,end):
 print(str(i)+':'+str(get_pixel(i,30)))

# シェル画面で、設定したGの値と、get_pixel()で読み取ったRGB値を表示する
print('\n=G=')
for i in range(start,end):
 print(str(i)+':'+str(get_pixel(i,40)))

# シェル画面で「、設定したBの値と、get_pixel()で読み取ったRGN値を表示する
print('\n=B=')
for i in range(start,end):
 print(str(i)+':'+str(get_pixel(i,50)))

# 16bitカラーの白(248,252,248)のピクセルを get_pixel()で読み取って表示する
print('\n=White=')
print('r='+str(r)+',g='+str(g)+',b='+str(b))
print(get_pixel(60,60))




CGモデル (fx-CG50) の出力

FXモデル (fx-9750GIII) の出力

MicroPython x1.9.4
|CASIO COMPUTER CO.,
>>>frim ckPixCol import *
=R=
195:(192, 0, 0)
196:(192, 0, 0)
196:(192, 0, 0)
197:(192, 0, 0)
198:(192, 0, 0)
199:(192, 0, 0)
200:(200, 0, 0)
201:(200, 0, 0)
202:(200, 0, 0)
203:(200, 0, 0)
204:(200, 0, 0)
205:(200, 0, 0)
206:(200, 0, 0)
207:(200, 0, 0)
208:(208, 0, 0)
209:(208, 0, 0)
210:(208, 0, 0)
211:(208, 0, 0)
212:(208, 0, 0)
213:(208, 0, 0)
214:(208, 0, 0)
215:(208, 0, 0)
216:(216, 0, 0)
217:(216, 0, 0)
218:(216, 0, 0)
219:(216, 0, 0)
220:(216, 0, 0)
221:(216, 0, 0)
222:(216, 0, 0)
223:(216, 0, 0)
224:(224, 0, 0)
225:(224, 0, 0)
226:(224, 0, 0)
227:(224, 0, 0)
228:(224, 0, 0)
229:(224, 0, 0)
230:(224, 0, 0)
231:(224, 0, 0)
232:(232, 0, 0)
233:(232, 0, 0)
234:(232, 0, 0)
235:(232, 0, 0)
236:(232, 0, 0)
237:(232, 0, 0)
238:(232, 0, 0)
239:(232, 0, 0)
240:(240, 0, 0)
241:(240, 0, 0)
242:(240, 0, 0)
243:(240, 0, 0)
244:(240, 0, 0)
245:(240, 0, 0)
246:(240, 0, 0)
247:(240, 0, 0)
248:(248, 0, 0)
249:(248, 0, 0)
250:(248, 0, 0)
251:(248, 0, 0)
252:(248, 0, 0)
253:(248, 0, 0)
254:(248, 0, 0)
255:(248, 0, 0)
 
=G=
195:(0, 192, 0)
196:(0, 192, 0)
196:(0, 192, 0)
197:(0, 192, 0)
198:(0, 192, 0)
199:(0, 192, 0)
200:(0, 200, 0)
201:(0, 200, 0)
202:(0, 200, 0)
203:(0, 200, 0)
204:(0, 200, 0)
205:(0, 200, 0)
206:(0, 200, 0)
207:(0, 200, 0)
208:(0, 208, 0)
209:(0, 208, 0)
210:(0, 208, 0)
211:(0, 208, 0)
212:(0, 208, 0)
213:(0, 208, 0)
214:(0, 208, 0)
215:(0, 208, 0)
216:(0, 216, 0)
217:(0, 216, 0)
218:(0, 216, 0)
219:(0, 216, 0)
220:(0, 216, 0)
221:(0, 216, 0)
222:(0, 216, 0)
223:(0, 216, 0)
224:(0, 224, 0)
225:(0, 224, 0)
226:(0, 224, 0)
227:(0, 224, 0)
228:(0, 224, 0)
229:(0, 224, 0)
230:(0, 224, 0)
231:(0, 224, 0)
232:(0, 232, 0)
233:(0, 232, 0)
234:(0, 232, 0)
235:(0, 232, 0)
236:(0, 232, 0)
237:(0, 232, 0)
238:(0, 232, 0)
239:(0, 232, 0)
240:(0, 240, 0)
241:(0, 240, 0)
242:(0, 240, 0)
243:(0, 240, 0)
244:(0, 240, 0)
245:(0, 240, 0)
246:(0, 240, 0)
247:(0, 240, 0)
248:(0, 248, 0)
249:(0, 248, 0)
250:(0, 248, 0)
251:(0, 248, 0)
252:(0, 248, 0)
253:(0, 248, 0)
254:(0, 248, 0)
255:(0, 248, 0)
 
=B=
195:(0, 0, 192)
196:(0, 0, 192)
196:(0, 0, 192)
197:(0, 0, 192)
198:(0, 0, 192)
199:(0, 0, 192)
200:(0, 0, 200)
201:(0, 0, 200)
202:(0, 0, 200)
203:(0, 0, 200)
204:(0, 0, 200)
205:(0, 0, 200)
206:(0, 0, 200)
207:(0, 0, 200)
208:(0, 0, 208)
209:(0, 0, 208)
210:(0, 0, 208)
211:(0, 0, 208)
212:(0, 0, 208)
213:(0, 0, 208)
214:(0, 0, 208)
215:(0, 0, 208)
216:(0, 0, 216)
217:(0, 0, 216)
218:(0, 0, 216)
219:(0, 0, 216)
220:(0, 0, 216)
221:(0, 0, 216)
222:(0, 0, 216)
223:(0, 0, 216)
224:(0, 0, 224)
225:(0, 0, 224)
226:(0, 0, 224)
227:(0, 0, 224)
228:(0, 0, 224)
229:(0, 0, 224)
230:(0, 0, 224)
231:(0, 0, 224)
232:(0, 0, 232)
233:(0, 0, 232)
234:(0, 0, 232)
235:(0, 0, 232)
236:(0, 0, 232)
237:(0, 0, 232)
238:(0, 0, 232)
239:(0, 0, 232)
240:(0, 0, 240)
241:(0, 0, 240)
242:(0, 0, 240)
243:(0, 0, 240)
244:(0, 0, 240)
245:(0, 0, 240)
246:(0, 0, 240)
247:(0, 0, 240)
248:(0, 0, 248)
249:(0, 0, 248)
250:(0, 0, 248)
251:(0, 0, 248)
252:(0, 0, 248)
253:(0, 0, 248)
254:(0, 0, 248)
255:(0, 0, 248)
 
=White=
r=248,g=252,b=248
(255, 255, 255)
MicroPython v1.9.4
|CASIO COMPUTER CO.,
>>>from ckPixCol import *
=R=
98:(0, 0, 0)
99:(0, 0, 0)
100:(0, 0, 0)
101:(0, 0, 0)
102:(0, 0, 0)
103:(0, 0, 0)
104:(0, 0, 0)
105:(0, 0, 0)
106:(0, 0, 0)
107:(0, 0, 0)
108:(0, 0, 0)
109:(0, 0, 0)
110:(0, 0, 0)
111:(0, 0, 0)
112:(0, 0, 0)
113:(0, 0, 0)
114:(0, 0, 0)
115:(0, 0, 0)
116:(0, 0, 0)
117:(0, 0, 0)
118:(0, 0, 0)
119:(0, 0, 0)
120:(0, 0, 0)
121:(0, 0, 0)
122:(0, 0, 0)
123:(0, 0, 0)
124:(0, 0, 0)
125:(0, 0, 0)
126:(0, 0, 0)
127:(0, 0, 0)
 
=G=
98:(0, 0, 0)
99:(0, 0, 0)
100:(0, 0, 0)
101:(0, 0, 0)
102:(0, 0, 0)
103:(0, 0, 0)
104:(0, 0, 0)
105:(0, 0, 0)
106:(0, 0, 0)
107:(0, 0, 0)
108:(0, 0, 0)
109:(0, 0, 0)
110:(0, 0, 0)
111:(0, 0, 0)
112:(0, 0, 0)
113:(0, 0, 0)
114:(0, 0, 0)
115:(0, 0, 0)
116:(0, 0, 0)
117:(0, 0, 0)
118:(0, 0, 0)
119:(0, 0, 0)
120:(0, 0, 0)
121:(0, 0, 0)
122:(0, 0, 0)
123:(0, 0, 0)
124:(0, 0, 0)
125:(0, 0, 0)
126:(0, 0, 0)
127:(0, 0, 0)
 
=B=
98:(0, 0, 0)
99:(0, 0, 0)
100:(0, 0, 0)
101:(0, 0, 0)
102:(0, 0, 0)
103:(0, 0, 0)
104:(0, 0, 0)
105:(0, 0, 0)
106:(0, 0, 0)
107:(0, 0, 0)
108:(0, 0, 0)
109:(0, 0, 0)
110:(0, 0, 0)
111:(0, 0, 0)
112:(0, 0, 0)
113:(0, 0, 0)
114:(0, 0, 0)
115:(0, 0, 0)
116:(0, 0, 0)
117:(0, 0, 0)
118:(0, 0, 0)
119:(0, 0, 0)
120:(0, 0, 0)
121:(0, 0, 0)
122:(0, 0, 0)
123:(0, 0, 0)
124:(0, 0, 0)
125:(0, 0, 0)
126:(0, 0, 0)
127:(0, 0, 0)
 
=White=
r=248,g=252,b=248
(255, 255, 255)


































































































シェル画面への出力を見れば、RGB値は 16bitカラーに対応していることがわかります。
唯一の例外として、最後の白のRGB値を get_pixel() で取得した時のみ 24bit RGB値の (255, 255, 255) を返します。

それ以外は get_pixel()set_pixel() も共に 16bit カラーに対応して動作します。




目 次

前の記事 - 14. CGモデルとFXモデルのPythonモードの違い

次の記事 - 16. circle() 関数のFXモデルへの拡張





応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 


keywords: fx-CG50Pythonfx-9750GIIIfx-9860GIIIプログラム関数電卓

リンク集 | ブログ内マップ
 
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

コメントの投稿

非公開コメント

最新記事
検索フォーム
最新コメント
カテゴリ
C# (3)
Visitors
Online Counter
現在の閲覧者数:
プロフィール

やす (Krtyski)

Author:やす (Krtyski)
since Oct 30, 2013


プログラム電卓は、プログラムを作って、使ってナンボ!

プログラム電卓を実際に使って気づいたこと、自作プログラム、電卓での Casio Basic や Casio Python プログラミングについて書いています。

なお管理人はカシオ計算機の関係者ではなく、Casio Basicが面白いと感じる1ユーザーです。


写真: 「4駆で泥んこ遊び@オックスフォード郊外」

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

ブロとも申請フォーム

この人とブロともになる

QRコード
QR