全手動で撮影する人の為のアプリ(完)

以前Pythonで「EV計算機を作る」を作ったことがありますが、今回は簡単にスクリプトでEV関係のクイズを作ってみました。
こんな数字は覚えていなくても特に問題は出ませんが、これらの大まかなEV値を知っていると被写体を見つけた時に、自分の撮りたい絵にするための設定がすぐ浮かぶようになります。

外界の明るさは下記のように学術的に決まっております。光景の中のどこに焦点を合わせるかによっては明暗が変わります。

自分の撮り方としては、大体この範囲に入りますのでこれから作るアプリでOKです。

・体育館/事務所:  EV=7
・夕暮れ:    EV=8
・明るい舞台:  EV=9
・ナイター/TVスタジオ:EV=10
・雨天/暗い曇り:  EV=11
・曇り/日陰:    EV=12
・薄曇り:    EV=13
・晴天:     EV=14
・快晴:     EV=15
・快晴の海・山: EV=16

カメラはこの明るさになるように、絞り・シャッター速度・ISO値を自動で設定していますが、ここではF・T・ISOを自分で決めて上記の明るさに、或いは自分好みの明るさにしましょうと言うのがこの稿の主旨なのです。

ではcode化する前にプログラムの構造を考えます。

・絞り・T時間またはその両方の問題を出すか決める。input()関数を使う
・絞り値(F)とそれに応じた明るさ(Fev)のリストを作る
・T時間(T)とそれに応じた明るさ(Tev)のリストを作る
・上の二つをあわせたリストも作る
・選んだ問題のカテゴリーに応じたQ&Aを表示する
・ctrl+cで終了


 

① どの問題のQ&Aを学習するかを決める

#Fev TevVクイズ.py 6/18/2020

import random
choice =input('select choice 1 for Fev, 2 for Tev, 3 for Fev+Tv, 4 for total EV at ISO=100 ---> ? ')
 #input()で関数で受け取るもの(choice)は文字列であり、数値ではない
print()

 

②  絞り値に対する明るさのQ&A

if choice == '1':      
    #絞り値に対する明るさのリスト
    Fev = {1: 0, 1.4: 1, 2: 2, 2.8 : 3, 4: 4, 5.6: 5, 8: 6, 11: 7, 16: 8, 22: 9, 32: 10}
 
    while True:
        ev = random.choice(list(Fev.keys()))
        print(ev, end='')
 
        try: # 例外が発生するかもしれないが、実行したい処理。
            input() # 入力待ち、改行あり
            print("    --->", end='') 
        except KeyboardInterrupt: #KeyboardInterruptはエラー名で、例外発生時に行う処理
            # CTRL+Cが押されたらループ終了
            break
        else:
            # CTRL+Cが押されなかったら答えを表示、Fevの要素(F値に対する明るさの数値)
            print(' : ' + 'EV = ' + str(Fev[ev]), '\n')

 

③ シャッター速度に対する明るさのQ&A

  elif choice == '2': 
      #シャッター速度に対する明るさのリスト
      Tev = {'1': 0, '1/2': 1, '1/4': 2, '1/8': 3, '1/15': 4, '1/30': 5, '1/60': 6,  '1/125': 7,
              '1/250': 8, '1/500': 9, '1/1,000': 10, '1/2,000': 11, '1/4,000': 12, '1/8,00': 13
             }
   
      while True:
          ev = random.choice(list(Tev.keys()))
          print(ev, end='')
   
          try: # 例外が発生するかもしれないが、実行したい処理。
              input() # 入力待ち、改行あり
              print("--->", end='') 
          except KeyboardInterrupt: #KeyboardInterruptはエラー名で、例外発生時に行う処理
              # CTRL+Cが押されたらループ終了
              break
          else:
              # CTRL+Cが押されなかったら答えを表示、Fevの要素(Tに対する明るさの数値)
              print(' : ' + 'EV = ' + str(Tev[ev]), '\n')
   

 

④ Fev+Tev対する明るさのQ&A

  elif choice == '3': 
      #Fev+Tevのリスト(Fev+Tev) FevかTevの問題かわかり難い!
      FTev = {1: 0, 1.4: 1, 2: 2, 2.8 : 3, 4: 4, 5.6: 5, 8: 6, 11: 7, 16: 8, 22: 9, 32: 10,
          '1': 0, '1/2': 1, '1/4': 2, '1/8': 3, '1/15': 4, '1/30': 5, '1/60': 6,  '1/125': 7,
              '1/250': 8, '1/500': 9, '1/1,000': 10, '1/2,000': 11, '1/4,000': 12, '1/8,00': 13
             }
   
      while True:
          ev = random.choice(list(FTev.keys()))
          print(ev, end='')
   
          try: # 例外が発生するかもしれないが、実行したい処理。
              input() # 入力待ち、改行あり
              print("--->", end='') 
          except KeyboardInterrupt: #KeyboardInterruptはエラー名で、例外発生時に行う処理
              # CTRL+Cが押されたらループ終了
              break
          else:
              # CTRL+Cが押されなかったら答えを表示、Fevの要素(Tに対する明るさの数値)
              print(' : ' + 'EV = ' + str(FTev[ev]), '\n')
   
  else:
      print('End')

 

これで動作するはずです。 スクリプで動作させてみましょう。

select choice 1 for Fev, 2 for Tev, 3 for Fev+Tv.  3 <--- 3(Fev+Tevを選びました)

22
---> : EV = 9

1/4,000
---> : EV = 12

1/4,000
---> : EV = 12

1/2
---> : EV = 1

2
---> : EV = 2

32
---> : EV = 10

5.6
---> : EV = 5

1/4
---> : EV = 2

という具合に絞り値やT時間に対応したEV値が表示されます。 まずは絞り値でのQ&A(1を選択)をやり、
次にTevをやれば知らずのうちに大体の明るさに対する適切な設定が出来るようになるでしょう。

 

⑤ F値とT値の組み合わせに対するTotal EVとその設定に合う明るさの光景も表示するようにしました。

1 #Fev+Tevの組み合わせに対する明るさのQ&A
2 elif choice == '4': 
3      #絞り値に対する明るさのリスト
4     Fev = {'1': 0, '1.4': 1, '2': 2, '2.8' : 3, '4': 4, '5.6': 5, '8': 6, '11': 7, '16': 8, '22': 9, '32': 10}
5  
6     #シャッター速度に対する明るさのリスト
7     Tev = {'1': 0, '1/2': 1, '1/4': 2, '1/8': 3, '1/15': 4, '1/30': 5, '1/60': 6,  '1/125': 7,
8             '1/250': 8, '1/500': 9, '1/1,000': 10, '1/2,000': 11, '1/4,000': 12, '1/8,00': 13
9            }
10     
11     while True:
12        f_ev = random.choice(list(Fev.keys()))
13        print(f_ev + '  ' , end='') ; print("", end='')
14  
15        t_ev = random.choice(list(Tev.keys()))
16        print(t_ev, end='') 
17  
18        try: # 例外が発生するかもしれないが、実行したい処理。
19             input() # 入力待ち、改行あり
20             print("    --->", end='') 
21        except KeyboardInterrupt: #KeyboardInterruptはエラー名で、例外発生時に行う処理
22             # CTRL+Cが押されたらループ終了
23             break
24        else:
25             # CTRL+Cが押されなかったら答えを表示、Fevの要素(Tに対する明るさの数値)
26             print(' : ' + 'F_EV = ' + str(Fev[f_ev]) , end='')
27             print(' ,  ' + 'T_EV = ' + str(Tev[t_ev]), end='')
28             #print('--> 明るさの合計は ', int(Fev[f_ev])+int(Tev[t_ev]) ,'EV' )
29  
30             #F値とT時間のEV、総合EV及びそのEVに該当する明るさも表示します。
31             if int(Fev[f_ev])+int(Tev[t_ev])==0:
32                 print('    --> 明るさの合計は', int(Fev[f_ev])+int(Tev[t_ev]),'EV,  真夜中の住宅街の暗さ。' )
33             elif int(Fev[f_ev])+int(Tev[t_ev])==1:
34                 print('    --> 明るさの合計は', int(Fev[f_ev])+int(Tev[t_ev]),'EV,  真夜中の住宅街の暗さ。' )
35             elif int(Fev[f_ev])+int(Tev[t_ev])==2:
36                 print('    --> 明るさの合計は', int(Fev[f_ev])+int(Tev[t_ev]),'EV,  遠くの夜景の暗さ。' )
37             elif int(Fev[f_ev])+int(Tev[t_ev])==3:
38                 print('    --> 明るさの合計は', int(Fev[f_ev])+int(Tev[t_ev]),'EV,  花火を撮るのに良い明るさです。' )
39             elif int(Fev[f_ev])+int(Tev[t_ev])==4:
40                  print('    --> 明るさの合計は', int(Fev[f_ev])+int(Tev[t_ev]),'EV,  街頭の有る夜景の明るさ。' )
41             elif int(Fev[f_ev])+int(Tev[t_ev])==5:
42                 print('    --> 明るさの合計は', int(Fev[f_ev])+int(Tev[t_ev]),'EV, 街頭の有る宅街の明るさ。' )                 
43             elif int(Fev[f_ev])+int(Tev[t_ev])==6:
44                 print('    --> 明るさの合計は', int(Fev[f_ev])+int(Tev[t_ev]),'EV, 暗い室内・イルミネーションの明るさです。' )
45             elif int(Fev[f_ev])+int(Tev[t_ev])==7:
46                 print('    --> 明るさの合計は', int(Fev[f_ev])+int(Tev[t_ev]),'EV,  体育館/事務所の明るさです。' )
47             elif int(Fev[f_ev])+int(Tev[t_ev])==8:
48                 print('    --> 明るさの合計は', int(Fev[f_ev])+int(Tev[t_ev]),'EV,  明るい室内・夕暮れの明るさです。' )
49             elif int(Fev[f_ev])+int(Tev[t_ev])==9:
50                 print('    --> 明るさの合計は', int(Fev[f_ev])+int(Tev[t_ev]),'EV,  明るい舞台の明るさです。' )
51             elif int(Fev[f_ev])+int(Tev[t_ev])==10:
52                 print('    --> 明るさの合計は', int(Fev[f_ev])+int(Tev[t_ev]),'EV,  早朝・夕暮れの明るさです。' )
53             elif int(Fev[f_ev])+int(Tev[t_ev])==11:
54                 print('    --> 明るさの合計は', int(Fev[f_ev])+int(Tev[t_ev]),'EV,  雨天/暗い曇りの明るさです。' )
55             elif int(Fev[f_ev])+int(Tev[t_ev])==12:
56                 print('    --> 明るさの合計は', int(Fev[f_ev])+int(Tev[t_ev]),'EV,  曇り/日陰の明るさです。' )
57             elif int(Fev[f_ev])+int(Tev[t_ev])==13:
58                 print('    --> 明るさの合計は', int(Fev[f_ev])+int(Tev[t_ev]),'EV,  薄曇りの明るさです。' )
59             elif int(Fev[f_ev])+int(Tev[t_ev])==14:
60                 print('    --> 明るさの合計は', int(Fev[f_ev])+int(Tev[t_ev]),'EV,  晴天の明るさです。' )
61             elif int(Fev[f_ev])+int(Tev[t_ev])==15:
62                 print('    --> 明るさの合計は', int(Fev[f_ev])+int(Tev[t_ev]),'EV,  快晴の明るさです。' )
63             elif int(Fev[f_ev])+int(Tev[t_ev])==16:
64                 print('    --> 明るさの合計は', int(Fev[f_ev])+int(Tev[t_ev]),'EV,  快晴の海・山の明るさです。' )
65             elif int(Fev[f_ev])+int(Tev[t_ev])==17:
66                 print('    --> 明るさの合計は', int(Fev[f_ev])+int(Tev[t_ev]),'EV,  日の出、日の入りの太陽の明るさです。' )
67             elif int(Fev[f_ev])+int(Tev[t_ev])==18:
68                 print('    --> 明るさの合計は', int(Fev[f_ev])+int(Tev[t_ev]),'EV,   日の出、日の入りの太陽の明るさです。' )
69             elif int(Fev[f_ev])+int(Tev[t_ev])==19:
70                 print('    --> 明るさの合計は', int(Fev[f_ev])+int(Tev[t_ev]),'EV,  快晴の太陽の明るさです。' )
71             elif int(Fev[f_ev])+int(Tev[t_ev])==20:
72                 print('    --> 明るさの合計は', int(Fev[f_ev])+int(Tev[t_ev]),'EV,  快晴の太陽の明るさです。' )
73                            
74             else:
75                print('    --> 明るすぎるか、暗すぎますので再設定して下さい。')
76            
77 else:#1,2,3,4 以外は’End表示となる
78     print('End')

 

choiceで4を選択すると次のような結果になります。

Q: elect choice 1 for Fev, 2 for Tev, 3 for Fev+Tev, 4 for Total EV at ISO=100 ---> ? 4

5.6 1/8
---> : F_EV = 5 , T_EV = 3 --> 明るさの合計は 8 EV, 明るい室内・夕暮れの明るさです。
16 1/60
---> : F_EV = 8 , T_EV = 6 --> 明るさの合計は 14 EV, 晴天の明るさです。
2.8 1/1,000
---> : F_EV = 3 , T_EV = 10 --> 明るさの合計は 13 EV, 薄曇りの明るさです。
8 1/4,000
---> : F_EV = 6 , T_EV = 12 --> 明るさの合計は 18 EV, 日の出、日の入りの太陽の明るさです。
1.4 1/15
---> : F_EV = 1 , T_EV = 4 --> 明るさの合計は 5 EV, 街頭の有る宅街の明るさ。
4 1/1,000
---> : F_EV = 4 , T_EV = 10 --> 明るさの合計は 14 EV, 晴天の明るさです。
2.8 1/500
---> : F_EV = 3 , T_EV = 9 --> 明るさの合計は 12 EV, 曇り/日陰の明るさです。
11 1/8

・・・

・・・

 

これで終わりですが、マニアルで撮ってる人には既知のことです。 Pythonのお勉強でした。

 

 

 

Python小学館
クラスへの移行練習-① ②

先人のプログラムを利用させて頂くには、やはりクラス(特に継承機能)を理解する必要が有ります。 そこで …

Python別館
Python別館 目次

Pythonで作成したアプリ関連の記事は「Python別館」に、widgetやその使用方法・それを使 …

Python小学館
csvファイルの呼び込み その二

textファイルでもcsvファイルでも読めるように、読込機能だけのcodeをアップしておきます。 # …