Power BIレポートにローカル保存された画像を表示する

## 概要

Power BIを触り始めた頃に躓いた画像表示に関する課題を書いてみようと思います。

それは「レポートで商品の画像もみたい」というリクエストです。

自分の環境は以下の通りです

- 自由に使えるWEBサーバがない

- Officeは買い切りで365契約がない→SharePointやOneDriveは使えない

- Power BIは単品ライセンス*必要人数で契約している

  

最終的に[Gerhard Brueckl様の記事](https://blog.gbrueckl.at/2018/01/storing-images-powerbi-analysis-services-data-models/)に辿り着き解決することができました。

当時ググり方も下手で適切なキーワードが思いつかず時間が掛かった次第です。

方法をそのまま写すだけでは芸がないので画像データサイズと綺麗さについての検証も書いてみます。

## 検証

1つの元画像データを変化させて、Power BIレポートでローカル画像をデータソースとするときに実用的な画像圧縮条件（サイズ、容量）を求める

### 準備

画像圧縮には「[縮小専用。](https://i-section.net/)」を使用させていただきました。[窓の杜記事](https://forest.watch.impress.co.jp/library/software/shukusen/)

画像素材には<a href="https://pixabay.com/ja/users/matthiasboeckel-3930681/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=5426709">Matthias Böckel</a>による<a href="https://pixabay.com/ja/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=5426709">Pixabay</a>様からの画像 を使用させていただきました（1920＊1238，454 KB (465,723 バイト)）　
![agapanthus-5426709_1920.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/b806794b-6a86-181e-50c8-08f745819306.jpeg)
　
「縮小専用。」のサイズとファイルサイズを以下のように生成
![Inkeds-CB_0007_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/9727bd98-9cf2-56fc-5533-098ad7ea9ec2.jpeg)![image-20200724144229526.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/64f3670f-d390-8989-79a5-d12eb427cb73.png)

[サンプルファイル](https://github.com/ZeroSysLog/test/)を用意しましたのでご自身でPower BI上で確認していただければと思います。

画像の綺麗さの考察は環境や個人の主観で異なりますのでご了承ください。



### PowerBIの設定

新規レポート＞データ取得＞フォルダー＞データの変換
![s-CB_0010-1595560291006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/9f1e0087-b7b4-033d-3a71-f783dc12dad5.jpeg)　　
詳細エディターを開いて以下のコードを記述します。  
![s-CB_0012.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/ffcc9aa6-57ba-268b-bcc0-f04db8a3de4b.jpeg)

>```
let
    BinaryToPbiImage = (BinaryContent as binary) as text=>
let
    Base64 = "data:image/jpeg;base64, " & Binary.ToText(BinaryContent, BinaryEncoding.Base64)
in
    Base64 
in
    BinaryToPbiImage
```

>[Gerhard Brueckl様の記事](https://blog.gbrueckl.at/2018/01/storing-images-powerbi-analysis-services-data-models/)より一部コードを引用させていただきました

画像データをBase64バイナリテキストにエンコードしてデータの頭に`data:image/jpeg;base64,`という文字列を合体するといった内容です。

完了押すとパラメータ関数が出来上がるので画像データに適用すると**画像データを文字列として格納したURL**が出来上がります。

この列はPower BIが画像URLとして扱ってくれます。



Resizedテーブル＞[列の追加]＞[カスタム関数の呼び出し]で追加する列名、先ほど設定したパラメータ関数、Content列を設定してOKします。  
![s-CB_0013.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/4eb318bc-4995-e0e1-e25c-de7ff241af18.jpeg)

URL列が追加できたら

[適用して保存]しQueryエディターから抜けます。

[データ]タブからImage列を選択してデータカテゴリの変更を行います。  
![s-CB_0014.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/874d0a1f-ebf8-a989-780c-c21a41f4e452.jpeg)  

[未分類]を[画像URL]に変更します。



[レポート]タブに戻ってテーブルを作成してimage列を使用すると画像が表示されるようになります。
![s-CB_0015.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/d6101dd1-2cf9-8387-0cee-c8fead3e08a8.jpeg)  
### 適正画像サイズの検証

- ページサイズは1440＊900にしています

- 使用しているモニターは1920＊1200です

- ストアから[Simple Image]というカスタムビジュアルをダウンロードして画像選択時に拡大画像が表示されるようにしています

- 画像ファイル名に縮専の設定とWindows上でのファイルサイズを付与してあるのでPower Queryエディターで[列の追加]>区切り文字で抽出を行い比較しやすいようにしています

- Image列に**テキストデータに変換された時の**文字数をみるために**Power Queryエディター**で[列の追加]>[カスタム列]より追加しています  


```
Text.Length = Text.Length([Image])
```

- Image列に**格納文字数**を見るために**レポート画面**で列の追加をしています


```
Lengh = LEN(Resized[Image])
```

- テーブルの書式設定で画像の高さは80にしてあります



#### 画像幅1280ピクセル 

![image-20200724133035658.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/ff99af5b-285b-b5a8-cec3-f0d967632e89.png)　　

- 1280ピクセル、サイズ30KB以上の画像では切れています

- 20KB設定では全体が見えますが相当粗いです

- 1280ピクセル設定で使えるものはないです  
#### 画像幅800ピクセル
100KB![image-20200724145052972.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/b93919e7-193c-efd6-823e-4fc1c157f909.png)  
10KB![image-20200724145252104.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/f393b894-4148-0a5b-9fed-1a6529b2a3cf.png)
- 800サイズではどのファイルサイズでも画像が切れることはありませんでした
- 100KBの設定では全体がぼけた感じになり、10KBでは粗すぎです
- 24KBの設定で一番きれいにみえます  
24KB![image-20200724145131973.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/601f6d59-334e-6569-e758-732452998239.png)

#### 画像幅400ピクセル
100KB![image-20200724145522528.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/113b6168-3f0f-d284-692c-02bf76297966.png)

10KB![image-20200724145653455.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/8e0d6d08-753c-a298-4ee6-33050def716b.png)  

- 400サイズでも100KBではぼけた印象
- 10KBでもそこそこいけると思います
- 20KBくらいが丁度良いです

20KB![image-20200724172817938.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/f96bd896-0bb1-96cd-d990-e47da65cb646.png)  

#### 画像幅80ピクセル

（サムネイルのみに使用を想定）
![image-20200724150204234.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/f9d3bd2b-83c2-dd36-8584-16e2128a85bb.png)
- サムネイルのみなら２KBで十分だと思います
- 拡大表示はどれも厳しいです  
## まとめ

- 大きいデータサイズの画像もテキストに変換処理はされるが、格納は32766バイトに制限されてます

- 32766バイトを超えないように画像調整の必要があります

- 画像をテキストデータ変換時に約1.33倍にバイト数が増えてしまうので、画像作成時に少し余裕をもって小さくした方がよいです

- 大きなデータサイズの画像でも圧縮処理のされ方で途切れないときもあるが、32766バイト制限されるので綺麗ではないです

- 主観にもよりますが400ピクセルで20KBあればPower BIレポート用途では十分綺麗だと思います

- 個人的には320～400ピクセルで10KBあればよいかなと
- サムネイル表示なら80ピクセルで2KBで十分だと思っています

- 膨大な数の画像を登録すればデータは大きくなり重くなる可能性があります

- オンプレミスゲートウェイに登録すれば画像が増えた時でもPower BIのWEBサービス側のレポートにも反映されます

- 大規模なものは難しいと思いますがローカル画像を利用して、画像入りの商品データベースが作れると思います