(本記事は、10/22現在執筆中です。)
本記事は、株式会社 函館ラボラトリが運営する「Bラボ」における、大人向け「看板アプリ(デジタルサイネージ)を作るコース」用教材テキストです。
- 【Bラボデジタルサイネージ1】Processing+ラズパイでデジタルサイネージを作る!
- 【Bラボデジタルサイネージ2】ラズパイ初期設定
- 【Bラボデジタルサイネージ3】準備プログラム作成&機能実現の方針決定
- 【Bラボデジタルサイネージ4】レイアウトの基準になるグリッドを表示する「GridModule」
- 【Bラボデジタルサイネージ5】レイアウトの基準になる枠を表示する「PlaceholderModule」
- 【Bラボデジタルサイネージ6】画像を全画面表示する「FullImageModule」(本記事)
- 【Bラボデジタルサイネージ7】ページの自動切り替え
- 【Bラボデジタルサイネージ8】設置されている場所の名前を表示する「LocationModule」
- 【Bラボデジタルサイネージ9】現在の時間を表示する「DateModule」
- 【Bラボデジタルサイネージ10】ページ切り替えの時間が分かる「ProgressBarModule」
- 【Bラボデジタルサイネージ11】現在の表示中のページが分かる「PageControlModule」
- 【Bラボデジタルサイネージ12】現在の天気を表示する「WeatherRModule」
- 【Bラボデジタルサイネージ13】直近2件のバス時刻表を表示する「BusRModule」
- 【Bラボデジタルサイネージ14】ごみ出しカレンダーを表示する「GomiRModule」
- 【Bラボデジタルサイネージ15】(発展編)ツイートを表示する「TwitterRModule」
- 【Bラボデジタルサイネージ16】開店/閉店を表示する「OpenCloseRModule」
- 【Bラボデジタルサイネージ17】部屋の温度を表示する「TemperatureRModule」
- 【Bラボデジタルサイネージ18】部屋の明るさを表示する「BrightnessRModule」
- 【Bラボデジタルサイネージ19】起動画面を表示する「LaunchingScreenModule」
- 【Bラボデジタルサイネージ20】RModuleの影を実装
作るもの
読み込んだ画像を画面全体に表示する機能を作ります。
完成後は背景画像が表示できるようになります。
画像を読み込む
まずは、背景画像として表示したい画像を用意し(上図は例です)、「background.jpg」という名前に変更します。
(.png形式など別の形式の場合は、.jpg形式に変換してください。)
背景画像は1920x1080px以上のサイズが必要です。
Processingの画面上のタブで、「スケッチ > スケッチフォルダーを開く」を選ぶと、開いている.pdeファイルが一覧で表示されます。
これと同じ階層に「data」フォルダを作り、表示したい画像を「data」フォルダの直下においてください。(ドラッグ&ドロップ)
次に、Processingで画像「background.jpg」を読み込みます。
読み込んだ画像を保存するための変数background
を用意します。
/* 略 */
PImage background; /* 追加 */
void settings() {
size(1920, 1080);
//fullScreen();
}
/* 略 */
background
へ画像を読み込みます。
setup()
内に読み込むための処理を記述します。
/* 略 */
void setup() {
frameRate(1);
noCursor();
colorMode(HSB, 360, 100, 100, 100);
background = loadImage("background.jpg"); /* 追加 */
initialize();
}
/* 略 */
これで画像が読み込めるようになったので、background
を全画面表示する処理を書きます。
新しいファイルM_FullImage.pde
を作成し、その中に関数drawFullImageModule
を作ります。
void drawFullImageModule(PImage pImage) {
image(pImage, 0, 0, width, height);
}
関数が作れたので、関数draw()
で呼び出します。
void draw() {
drawFullImageModule(background); /* background(0, 0, 100);を削除し追加 */
drawGridModule();
drawPlaceholderModule();
}
この時点で実行してみましょう。
これで全画面表示が出来ていますね。
しかし何か違和感がありませんか?
元の画像が縦/横に引き伸ばされている場合の対処
出力結果の「違和感」というのは、今回の例では**「元の画像に比べて、表示された画像が横に引き伸ばされている」**ことです。
これは、元の画像が16:9の比率でない場合に起こります。
元の画像が16:9の比率でない場合には、16:9の比率になるよう切り取ることが必要になります。
本テキストで使っているbackground.jpg
の解像度は2048x1536、比率にして4:3になっています。
この画像から、解像度1920x1080、比率にして16:9になるように切り出した画像を使えるよう、新しい関数を定義します。
関数を実装するにあたり、下図のような方針にします。
仮に、画像の真ん中から1920x1080だけ切り取るとします。
まず横方向に1920pxだけ確保し(赤くなっている部分)、この部分だけにします。
次に縦方向に1080pxだけ確保し(赤くなっている部分)、この部分だけにします。
このようにして、1920x1080の画像を得ます。
画像を必要な部分だけ切り抜くには、PImageの関数get
が使えます。
画像を切り抜く関数として、PImage型の変数を返す関数pImageCut
を作ります。
/* 略 */
PImage pImageCut(PImage image, int modeX, int modeY, int afterWidth, int afterHeight) {
return image;
}
modeX
やmodeY
は、画像を切り取るときにどこを基準に切り取るのかを指します。
Processingに標準で用意されている値である、TOP
BOTTOM
CENTER
LEFT
RIGHT
を使います。
たとえばmodeX
にCENTER
が指定されていた場合には、真ん中が切り取られます。
modeX
にLEFT
が指定されていれば、ぴったり左端から切り取られます。
modeY
についても同様の考え方です。
afterWidth
とafterHeight
は、切り取られたあとのサイズを示します。
pImageCut(background, CENTER, CENTER, 1920, 1080);
たとえば上のように書いた場合、「background
という画像が、真ん中を基準にして、1920x1080のサイズで返ってくる」という意味になります。
画像を切り取る処理は、PImageの関数get
を使って書くと、このように書けます。
/* 略 */
PImage pImageCut(PImage image, int modeX, int modeY, int afterWidth, int afterHeight) {
/* ここから追加 */
int w = image.width;
int h = image.height;
if (modeX == LEFT) image = image.get(0, 0, afterWidth, h);
if (modeX == CENTER) image = image.get(w/2-afterWidth/2, 0, afterWidth, h);
if (modeX == RIGHT) image = image.get(w-afterWidth, 0, afterWidth, h);
if (modeY == TOP) image = image.get(0, 0, afterWidth, afterHeight);
if (modeY == CENTER) image = image.get(0, h/2-afterHeight/2, afterWidth, afterHeight);
if (modeY == BOTTOM) image = image.get(0, h-afterHeight, afterWidth, afterHeight);
/* ここまで追加 */
return image;
}
返り値のimage
で、切り取られた画像が返ってきます。
関数pImageCut
を実装したので、使って画像を正しい比率で表示できるようにしましょう。
setup()
内のbackground.jpg
を読み込む処理を変更します。
/* 略 */
void setup() {
frameRate(1);
noCursor();
colorMode(HSB, 360, 100, 100, 100);
background = pImageCut(loadImage("background.jpg"), CENTER, CENTER, width, height); /* 変更 */
initialize();
}
/* 略 */
書き換えたら再度実行してみましょう。
今度は、背景画像が正しい出力結果になっているはずです。
最後に
これで背景画像が表示できるようになりました。
次は、**ページの自動切り替え**を実装してみましょう。