ネット検索していたら、6点式点字のTrueTypeフォントSixBrailleと言うものを見つけました。
これは面白そうだなと思って、それを使ってみたバージョンの点字変換プログラムを作ってみました。
このフォントは無料かつパブリックドメインのライセンスで、だれでも自由に利用できるそうです。
製作は「長野高専 電子情報工学科」の「伊藤祥一」様です。
さて、私が作ったプログラムのことを話しますね。
プログラムの構造的に言いますと、何はともあれ点字を正しく表示するためには「中間データ」を正確に作らないと駄目だということが分かりました。
清音・濁音・半濁音・拗音・拗濁音・半拗濁音・その他特殊文字や括弧類などを動変換すれば良いかを見極めてそれに見合った変換をする必要がありました。この作業は半分試行錯誤の連続でした。これには結構手間がかかりました。
(ここまで詳細に説明してあるホームページのサイトを見つけられませんでした。)
その「中間データ」がうまく出来れば、そのデータを「SixBraille」のフォントを指定したテキストボックスに代入するだけで点字が描けました。今回は「枠線を表示するとともに点のない箇所には横線を表示する」ものと「点だけ表示する」フォントの2つを選べるようにしました。
凸字データはそれで比較的簡単に出来るのですが、凹字データはそれほど簡単には作れませんので、こちらは別の方法を使いました。
まず凸字データを表示したテキストボックスの画像キャプチャをします。その画像データを左右反転させてからピクチャーボックスに表示しています。
ラジオボタンで凸字を選択した場合は、テキストボックスの Visible=true; ピクチャーボックスの Visible=false; とします。
逆に凹字を選択した場合はテキストボックスの Visible=false; ピクチャーボックスのVisible=true; とします。
この二つのコントロールは同じ大きさで重ねて配置してありますのでどちらかを目に見えるように切り替えているわけです。
中間データ作成部分のロジック ソースコードの例
>>>>> 訂正 <<<<< 数字と英字に対応していませんでしたので、修正しました。
#region [Six Brille] Font セット
private void TenjiFont()
{
// "SixBraille HLF" または "SixBraille P" の20ptに変更します。
if (radioButtonDisp.Checked)
{
textBoxTenji.Font = new System.Drawing.Font("SixBraille HLF", fsize);
}
else
{
textBoxTenji.Font = new System.Drawing.Font("SixBraille P", fsize);
}
}
#endregion
#region 中間データの作成
//中間データの作成
private void CVT_Chukan()
{
textBoxMongon.Text = textBoxMongon.Text.TrimEnd();
string s1 = textBoxMongon.Text + " ";
string s2 = "", s3 = "";
string s4 = "", s5 = "";
//半角を全角に変換する
s1 = Microsoft.VisualBasic.Strings.StrConv(
s1, Microsoft.VisualBasic.VbStrConv.Wide, 0x411);
int len = s1.Length;
for (int i=0;i<len-2;i++)
{
s2 = s1.Substring(i , 1);
s3= s1.Substring(i , 2);
s5 = s1.Substring(i + 1, 1);
#region 拗音・拗濁音・半拗濁音
//拗音・拗濁音・半拗濁音
if (s5.Contains("ゃ") | s5.Contains("ゅ") | s5.Contains("ょ"))
{
switch(s3)
{
case "きゃ":
s4 = s4 + "拗か";
i++;
break;
case "きゅ":
s4 = s4 + "拗く";
i++;
break;
case "きょ":
s4 = s4 + "拗こ";
i++;
break;
case "しゃ":
s4 = s4 + "拗さ";
i++;
break;
case "しゅ":
s4 = s4 + "拗す";
i++;
break;
case "しょ":
s4 = s4 + "拗そ";
i++;
break;
case "ちゃ":
s4 = s4 + "拗た";
i++;
break;
case "ちゅ":
s4 = s4 + "拗つ";
i++;
break;
case "ちょ":
s4 = s4 + "拗と";
i++;
break;
case "にゃ":
s4 = s4 + "拗な";
i++;
break;
case "にゅ":
s4 = s4 + "拗ぬ";
i++;
break;
case "にょ":
s4 = s4 + "拗の";
i++;
break;
case "ひゃ":
s4 = s4 + "拗は";
i++;
break;
case "ひゅ":
s4 = s4 + "拗ふ";
i++;
break;
case "ひょ":
s4 = s4 + "拗ほ";
i++;
break;
case "みゃ":
s4 = s4 + "拗ま";
i++;
break;
case "みゅ":
s4 = s4 + "拗む";
i++;
break;
case "みょ":
s4 = s4 + "拗も";
i++;
break;
case "りゃ":
s4 = s4 + "拗ら";
i++;
break;
case "りゅ":
s4 = s4 + "拗る";
i++;
break;
case "りょ":
s4 = s4 + "拗ろ";
i++;
break;
case "ぎゃ":
s4 = s4 + "ぎか";
i++;
break;
case "ぎゅ":
s4 = s4 + "ぎく";
i++;
break;
case "ぎょ":
s4 = s4 + "ぎこ";
i++;
break;
case "じゃ":
s4 = s4 + "ぎさ";
i++;
break;
case "じゅ":
s4 = s4 + "ぎす";
i++;
break;
case "じょ":
s4 = s4 + "ぎそ";
i++;
break;
case "ぢゃ":
s4 = s4 + "ぎた";
i++;
break;
case "ぢゅ":
s4 = s4 + "ぎつ";
i++;
break;
case "ぢょ":
s4 = s4 + "ぎと";
i++;
break;
case "びゃ":
s4 = s4 + "ぎは";
i++;
break;
case "びゅ":
s4 = s4 + "ぎふ";
i++;
break;
case "びょ":
s4 = s4 + "ぎほ";
i++;
break;
case "ぴゃ":
s4 = s4 + "ぴは";
i++;
break;
case "ぴゅ":
s4 = s4 + "ぴふ";
i++;
break;
case "ぴょ":
s4 = s4 + "ぴほ";
i++;
break;
case "てゅ":
s4 = s4 + "ぴつ";
i++;
break;
case "ふゅ":
s4 = s4 + "ぴゆ";
i++;
break;
case "ふょ":
s4 = s4 + "ぴよ";
i++;
break;
default:
break;
}
}
#endregion;
#region 特殊音など
//特殊音など
else if (s5.Contains("ぁ") | s5.Contains("ぃ") | s5.Contains("ぅ") | s5.Contains("ぇ") | s5.Contains("ぉ"))
{
switch (s3)
{
case "いぇ":
s4 = s4 + "拗え";
i++;
break;
case "きぇ":
s4 = s4 + "拗け";
i++;
break;
case "しぇ":
s4 = s4 + "拗せ";
i++;
break;
case "じぇ":
s4 = s4 + "ぎせ";
i++;
break;
case "ちぇ":
s4 = s4 + "拗て";
i++;
break;
case "にぇ":
s4 = s4 + "拗ね";
i++;
break;
case "ひぇ":
s4 = s4 + "拗へ";
i++;
break;
case "うぃ":
s4 = s4 + "疑い";
i++;
break;
case "うぇ":
s4 = s4 + "疑え";
i++;
break;
case "うぉ":
s4 = s4 + "疑お";
i++;
break;
case "くぁ":
s4 = s4 + "疑か";
i++;
break;
case "くぃ":
s4 = s4 + "疑き";
i++;
break;
case "くぇ":
s4 = s4 + "疑け";
i++;
break;
case "くぉ":
s4 = s4 + "疑こ";
i++;
break;
case "ぐぁ":
s4 = s4 + "句か";
i++;
break;
case "ぐぃ":
s4 = s4 + "句き";
i++;
break;
case "ぐぇ":
s4 = s4 + "句け";
i++;
break;
case "ぐぉ":
s4 = s4 + "句こ";
i++;
break;
case "つぁ":
s4 = s4 + "疑た";
i++;
break;
case "つぃ":
s4 = s4 + "疑ち";
i++;
break;
case "つぇ":
s4 = s4 + "疑て";
i++;
break;
case "つぉ":
s4 = s4 + "疑と";
i++;
break;
case "ふぁ":
s4 = s4 + "疑は";
i++;
break;
case "ふぃ":
s4 = s4 + "疑ひ";
i++;
break;
case "ふぇ":
s4 = s4 + "疑へ";
i++;
break;
case "ふぉ":
s4 = s4 + "疑ほ";
i++;
break;
case "ヴぁ":
s4 = s4 + "句は";
i++;
break;
case "ヴぃ":
s4 = s4 + "句ひ";
i++;
break;
case "ヴぇ":
s4 = s4 + "句へ";
i++;
break;
case "ヴぉ":
s4 = s4 + "句ほ";
i++;
break;
case "すぃ":
s4 = s4 + "拗し";
i++;
break;
case "ずぃ":
s4 = s4 + "ぎし";
i++;
break;
case "てぃ":
s4 = s4 + "拗ち";
i++;
break;
case "でぃ":
s4 = s4 + "ぎち";
i++;
break;
case "とぅ":
s4 = s4 + "疑つ";
i++;
break;
case "どぅ":
s4 = s4 + "句つ";
i++;
break;
default:
break;
}
}
#endregion;
//濁音・半濁音・静音
#region 英数字のフラグ編集
//英数字のフラグ編集
else
{
//数字フラグリセット
if (!s2.Contains("1") & !s2.Contains("2") & !s2.Contains("3") & !s2.Contains("4") & !s2.Contains("5") &
!s2.Contains("6") & !s2.Contains("7") & !s2.Contains("8") & !s2.Contains("9") & !s2.Contains("0") &
!s2.Contains(".") & !s2.Contains("-"))
{
suji = false;
}
//英字フラグ リセット
if (!s2.Contains("a") & !s2.Contains("b") & !s2.Contains("c") & !s2.Contains("d") & !s2.Contains("e") & !s2.Contains("f") &
!s2.Contains("g") & !s2.Contains("h") & !s2.Contains("i") & !s2.Contains("j") & !s2.Contains("k") & !s2.Contains("l") &
!s2.Contains("m") & !s2.Contains("n") & !s2.Contains("o") & !s2.Contains("p") & !s2.Contains("q") & !s2.Contains("r") &
!s2.Contains("s") & !s2.Contains("t") & !s2.Contains("u") & !s2.Contains("v") & !s2.Contains("w") &
!s2.Contains("x") & !s2.Contains("y") & !s2.Contains("z") &
!s2.Contains("A") & !s2.Contains("B") & !s2.Contains("C") & !s2.Contains("D") & !s2.Contains("E") & !s2.Contains("F") &
!s2.Contains("G") & !s2.Contains("H") & !s2.Contains("I") & !s2.Contains("J") & !s2.Contains("K") & !s2.Contains("L") &
!s2.Contains("M") & !s2.Contains("N") & !s2.Contains("O") & !s2.Contains("P") & !s2.Contains("Q") & !s2.Contains("R") &
!s2.Contains("S") & !s2.Contains("T") & !s2.Contains("U") & !s2.Contains("V") & !s2.Contains("W") &
!s2.Contains("X") & !s2.Contains("Y") & !s2.Contains("Z") &
!s2.Contains("大") & !s2.Contains("大") & !s2.Contains("/") & !s2.Contains("."))
{
eiji = false;
oomoji = false;
nijuoomji = false;
}
//二重大文字フラグセット
if (!eiji & s2.Contains("大"))
{
eiji = true;
nijuoomji = true;
s4 = s4 + "外大";
//i++;
}
//英字フラグセット
if (!eiji)
{
if (s2.Contains("a") | s2.Contains("b") | s2.Contains("c") | s2.Contains("d") | s2.Contains("e") | s2.Contains("f") |
s2.Contains("g") | s2.Contains("h") | s2.Contains("i") | s2.Contains("j") | s2.Contains("k") | s2.Contains("l") |
s2.Contains("m") | s2.Contains("n") | s2.Contains("o") | s2.Contains("p") | s2.Contains("q") | s2.Contains("r") |
s2.Contains("s") | s2.Contains("t") | s2.Contains("u") | s2.Contains("v") | s2.Contains("w") |
s2.Contains("x") | s2.Contains("y") | s2.Contains("z") | s2.Contains("/"))
{
s4 = s4 + "外";
eiji = true;
}
else if (s2.Contains("A") | s2.Contains("B") | s2.Contains("C") | s2.Contains("D") | s2.Contains("E") | s2.Contains("F") |
s2.Contains("G") | s2.Contains("H") | s2.Contains("I") | s2.Contains("J") | s2.Contains("K") | s2.Contains("L") |
s2.Contains("M") | s2.Contains("N") | s2.Contains("O") | s2.Contains("P") | s2.Contains("Q") | s2.Contains("R") |
s2.Contains("S") | s2.Contains("T") | s2.Contains("U") | s2.Contains("V") | s2.Contains("W") |
s2.Contains("X") | s2.Contains("Y") | s2.Contains("Z"))
{
if (!eiji)
{
s4 = s4 + "外";
oomoji = true;
eiji = true;
}
}
}
#endregion;
switch (s2)
{
#region 濁音など
//濁音など
case "が":
s4 = s4 + "濁か";
break;
case "ぎ":
s4 = s4 + "濁き";
break;
case "ぐ":
s4 = s4 + "濁く";
break;
case "げ":
s4 = s4 + "濁け";
break;
case "ご":
s4 = s4 + "濁こ";
break;
case "ざ":
s4 = s4 + "濁さ";
break;
case "じ":
s4 = s4 + "濁し";
break;
case "ず":
s4 = s4 + "濁す";
break;
case "ぜ":
s4 = s4 + "濁せ";
break;
case "ぞ":
s4 = s4 + "濁そ";
break;
case "だ":
s4 = s4 + "濁た";
break;
case "ぢ":
s4 = s4 + "濁ち";
break;
case "づ":
s4 = s4 + "濁つ";
break;
case "で":
s4 = s4 + "濁て";
break;
case "ど":
s4 = s4 + "濁と";
break;
case "ば":
s4 = s4 + "濁は";
break;
case "び":
s4 = s4 + "濁ひ";
break;
case "ぶ":
s4 = s4 + "濁ふ";
break;
case "べ":
s4 = s4 + "濁へ";
break;
case "ぼ":
s4 = s4 + "濁ほ";
break;
case "ゔ":
s4 = s4 + "濁う";
break;
case "『":
s4 = s4 + "外継";
break;
case "』":
s4 = s4 + "継外";
break;
case "《":
s4 = s4 + "外= ";
break;
case "》":
s4 = s4 + "=外";
break;
#endregion;
#region 数字
//数字
case "1":
if (!suji)
{
suji = true;
s4 = s4 + "数1";
}
else
{
s4 = s4 + "1";
}
break;
case "2":
if (!suji)
{
suji = true;
s4 = s4 + "数2";
}
else
{
s4 = s4 + "2";
}
break;
case "3":
if (!suji)
{
suji = true;
s4 = s4 + "数3";
}
else
{
s4 = s4 + "3";
}
break;
case "4":
if (!suji)
{
suji = true;
s4 = s4 + "数4";
}
else
{
s4 = s4 + "4";
}
break;
case "5":
if (!suji)
{
suji = true;
s4 = s4 + "数5";
}
else
{
s4 = s4 + "5";
}
break;
case "6":
if (!suji)
{
suji = true;
s4 = s4 + "数6";
}
else
{
s4 = s4 + "6";
}
break;
case "7":
if (!suji)
{
suji = true;
s4 = s4 + "数7";
}
else
{
s4 = s4 + "7";
}
break;
case "8":
if (!suji)
{
suji = true;
s4 = s4 + "数8";
}
else
{
s4 = s4 + "8";
}
break;
case "9":
if (!suji)
{
suji = true;
s4 = s4 + "数9";
}
else
{
s4 = s4 + "9";
}
break;
case "0":
if (!suji)
{
suji = true;
s4 = s4 + "数0";
}
else
{
s4 = s4 + "0";
}
break;
case ".":
if (!suji)
{
suji = true;
s4 = s4 + "数.";
}
else
{
s4 = s4 + ".";
}
break;
case "-":
if (!suji)
{
suji = true;
s4 = s4 + "数継";
}
else
{
s4 = s4 + "継";
}
break;
#endregion;
#region 英字
//英字
case "A":
if (nijuoomji)
{
s4 = s4 + "A";
}
else
{
s4 = s4 + "大A";
}
break;
case "a":
if (nijuoomji)
{
s4 = s4 + "A";
}
else
{
nijuoomji = false;
s4 = s4 + "a";
}
break;
case "B":
if (nijuoomji)
{
s4 = s4 + "B";
}
else
{
s4 = s4 + "大B";
}
break;
case "b":
if (nijuoomji)
{
s4 = s4 + "B";
}
else
{
nijuoomji = false;
s4 = s4 + "b";
}
break;
case "C":
if (nijuoomji)
{
s4 = s4 + "C";
}
else
{
s4 = s4 + "大C";
}
break;
case "c":
if (nijuoomji)
{
s4 = s4 + "C";
}
else
{
nijuoomji = false;
s4 = s4 + "c";
}
break;
case "D":
if (nijuoomji)
{
s4 = s4 + "D";
}
else
{
s4 = s4 + "大D";
}
break;
case "d":
if (nijuoomji)
{
s4 = s4 + "D";
}
else
{
nijuoomji = false;
s4 = s4 + "d";
}
break;
case "E":
if (nijuoomji)
{
s4 = s4 + "E";
}
else
{
s4 = s4 + "大E";
}
break;
case "e":
if (nijuoomji)
{
s4 = s4 + "E";
}
else
{
nijuoomji = false;
s4 = s4 + "e";
}
break;
case "F":
if (nijuoomji)
{
s4 = s4 + "F";
}
else
{
s4 = s4 + "大F";
}
break;
case "f":
if (nijuoomji)
{
s4 = s4 + "F";
}
else
{
nijuoomji = false;
s4 = s4 + "f";
}
break;
case "G":
if (nijuoomji)
{
s4 = s4 + "G";
}
else
{
s4 = s4 + "大G";
}
break;
case "g":
if (nijuoomji)
{
s4 = s4 + "G";
}
else
{
nijuoomji = false;
s4 = s4 + "g";
}
break;
case "H":
if (nijuoomji)
{
s4 = s4 + "H";
}
else
{
s4 = s4 + "大H";
}
break;
case "h":
if (nijuoomji)
{
s4 = s4 + "H";
}
else
{
nijuoomji = false;
s4 = s4 + "h";
}
break;
case "I":
if (nijuoomji)
{
s4 = s4 + "I";
}
else
{
s4 = s4 + "大I";
}
break;
case "i":
if (nijuoomji)
{
s4 = s4 + "I";
}
else
{
nijuoomji = false;
s4 = s4 + "i";
}
break;
case "J":
if (nijuoomji)
{
s4 = s4 + "J";
}
else
{
s4 = s4 + "大J";
}
break;
case "j":
if (nijuoomji)
{
s4 = s4 + "J";
}
else
{
nijuoomji = false;
s4 = s4 + "j";
}
break;
case "K":
if (nijuoomji)
{
s4 = s4 + "K";
}
else
{
s4 = s4 + "大K";
}
break;
case "k":
if (nijuoomji)
{
s4 = s4 + "K";
}
else
{
nijuoomji = false;
s4 = s4 + "k";
}
break;
case "L":
if (nijuoomji)
{
s4 = s4 + "L";
}
else
{
s4 = s4 + "大L";
}
break;
case "l":
if (nijuoomji)
{
s4 = s4 + "L";
}
else
{
nijuoomji = false;
s4 = s4 + "l";
}
break;
case "M":
if (nijuoomji)
{
s4 = s4 + "M";
}
else
{
s4 = s4 + "大M";
}
break;
case "m":
if (nijuoomji)
{
s4 = s4 + "M";
}
else
{
nijuoomji = false;
s4 = s4 + "m";
}
break;
case "N":
if (nijuoomji)
{
s4 = s4 + "N";
}
else
{
s4 = s4 + "大N";
}
break;
case "n":
if (nijuoomji)
{
s4 = s4 + "N";
}
else
{
nijuoomji = false;
s4 = s4 + "n";
}
break;
case "O":
if (nijuoomji)
{
s4 = s4 + "O";
}
else
{
s4 = s4 + "大O";
}
break;
case "o":
if (nijuoomji)
{
s4 = s4 + "O";
}
else
{
nijuoomji = false;
s4 = s4 + "o";
}
break;
case "P":
if (nijuoomji)
{
s4 = s4 + "P";
}
else
{
s4 = s4 + "大P";
}
break;
case "p":
if (nijuoomji)
{
s4 = s4 + "P";
}
else
{
nijuoomji = false;
s4 = s4 + "p";
}
break;
case "Q":
if (nijuoomji)
{
s4 = s4 + "Q";
}
else
{
s4 = s4 + "大Q";
}
break;
case "q":
if (nijuoomji)
{
s4 = s4 + "Q";
}
else
{
nijuoomji = false;
s4 = s4 + "q";
}
break;
case "R":
if (nijuoomji)
{
s4 = s4 + "R";
}
else
{
s4 = s4 + "大R";
}
break;
case "r":
if (nijuoomji)
{
s4 = s4 + "R";
}
else
{
nijuoomji = false;
s4 = s4 + "r";
}
break;
case "S":
if (nijuoomji)
{
s4 = s4 + "S";
}
else
{
s4 = s4 + "大S";
}
break;
case "s":
if (nijuoomji)
{
s4 = s4 + "S";
}
else
{
nijuoomji = false;
s4 = s4 + "s";
}
break;
case "T":
if (nijuoomji)
{
s4 = s4 + "T";
}
else
{
s4 = s4 + "大T";
}
break;
case "t":
if (nijuoomji)
{
s4 = s4 + "T";
}
else
{
nijuoomji = false;
s4 = s4 + "t";
}
break;
case "U":
if (nijuoomji)
{
s4 = s4 + "U";
}
else
{
s4 = s4 + "大U";
}
break;
case "u":
if (nijuoomji)
{
s4 = s4 + "U";
}
else
{
nijuoomji = false;
s4 = s4 + "u";
}
break;
case "V":
if (nijuoomji)
{
s4 = s4 + "V";
}
else
{
s4 = s4 + "大V";
}
break;
case "v":
if (nijuoomji)
{
s4 = s4 + "V";
}
else
{
nijuoomji = false;
s4 = s4 + "v";
}
break;
case "W":
if (nijuoomji)
{
s4 = s4 + "W";
}
else
{
s4 = s4 + "大W";
}
break;
case "w":
if (nijuoomji)
{
s4 = s4 + "W";
}
else
{
nijuoomji = false;
s4 = s4 + "w";
}
break;
case "X":
if (nijuoomji)
{
s4 = s4 + "X";
}
else
{
s4 = s4 + "大X";
}
break;
case "x":
if (nijuoomji)
{
s4 = s4 + "X";
}
else
{
nijuoomji = false;
s4 = s4 + "x";
}
break;
case "Y":
if (nijuoomji)
{
s4 = s4 + "Y";
}
else
{
s4 = s4 + "大Y";
}
break;
case "y":
if (nijuoomji)
{
s4 = s4 + "Y";
}
else
{
nijuoomji = false;
s4 = s4 + "y";
}
break;
case "Z":
if (nijuoomji)
{
s4 = s4 + "Z";
}
else
{
s4 = s4 + "大Z";
}
break;
case "z":
if (nijuoomji)
{
s4 = s4 + "Z";
}
else
{
nijuoomji = false;
s4 = s4 + "z";
}
break;
//case ".":
// MessageBox.Show("*****");
// nijuoomji = false;
// s4 = s4 + ".";
// break;
case "/":
nijuoomji = false;
s4 = s4 + "や";
break;
#endregion;
#region その他記号など
//その他記号など
case "入":
if (!sonyu)
{
sonyu = true;
s4 = s4 + "==";
}
else
{
sonyu = false;
s4 = s4 + "==";
}
break;
case "和":
s4 = s4 + " ";
break;
case "英":
s4 = s4 + "外";
break;
default:
if (!s5.Contains("ゃ") & !s5.Contains("ゅ") & !s5.Contains("ょ") &
!s5.Contains("ぁ") & !s5.Contains("ぃ") & !s5.Contains("ぅ") &
!s5.Contains("ぇ") & !s5.Contains("ぉ"))
{
s4 = s4 + s2;
}
break;
}
}
}
s4 = s4 + s1.Substring(s1.Length-2);
textBoxChukanData.Text = s4.TrimEnd();
}
#endregion;
#endregion;
#region 中間データ変換全体の制御
//中間データ変換全体の制御
private void CVT_Tenji()
{
TenjiFont();
CVT_Chukan();
textBoxTenji.Text = textBoxChukanData.Text;
Bitmap bmp = new Bitmap(textBoxTenji.Width, textBoxTenji.Height);
textBoxTenji.DrawToBitmap(bmp, new Rectangle(0, 0, textBoxTenji.Width, textBoxTenji.Height));
bmp.RotateFlip(RotateFlipType.RotateNoneFlipX);
pictureBoxTenji2.Image = bmp;
}
#endregion