Ako zobraziť obrázky z databázy v reporte Power BI

Databázy často obsahujú obrázky, ktoré by ste chceli zobraziť v reporte. Power BI to priamo síce neumožňuje, ale cez jeden elegantný trik je to možné pomerne jednoducho spraviť. Tým pádom môžete využiť tabuľky a matice v reporte na zobrazovanie napr. produktových katalógov či záznamov v tabuľkách s fotografiami, a zobraziť v nich obrázky z databázy priamo, bez potreby exportu na webový server.

Obrázky z databázy zvyčajne chcete zobrazovať, ak tam máte uložené fotografie produktov, zamestnancov, či napr. fotografie z reklamačného konania. A nechcete ich vyťahovať von, do nejakého zdieľaného adresára či na webový server, aby ste ich mohli zobraziť v Power BI klasickým spôsobom. A potom udržiavať kópiu tých dát. Najmä ak do vašej databázy pribúdajú tisícky či státisíce fotografií denne.

Čo spraví Power BI, ak mu dáme obrázky z databázy

Na ukážku použijeme tentokrát vzorovú databázu AdventureWorksDW pre SQL Server. Na nej spustíme takýto SELECT:

SELECT [ProductKey], [EnglishProductName], [Color], [ListPrice], [LargePhoto]
FROM DimProduct
WHERE [ListPrice] IS NOT NULL AND DATALENGTH([LargePhoto]) > 20000

Ten vráti napríklad takýto výsledok:

Obrázky z databázy SQL Servera

Je to zoznam produktov, a v stĺpci LargePhoto je uložený obrázok pre každý z produktov, v binárnej podobe. Po natiahnutí do Power BI to vyzerá v editore Power Query takto:

Obrázky z databázy v Power Query

Keď takéto dáta naimportujete do dátového modelu, tak import vynechá všetky binárne stĺpce. Takže pri importe stratíme obrázky, čo zrovna nechceme. A je potrebné ísť na to inak.

Ako ísť správne na obrázky z databázy

Využijeme dve veci, aby sa nám to podarilo. Za prvé, keď binárne dáta naimportujeme ako text, tak sa dostanú do dátového modelu. Lenže budeme musieť Power BI povedať, nech ich zobrazí ako obrázok. To zabezpečíme nastavením kategórie údajov pre ten stĺpec na “URL adresa obrázka”. Do nich však musíme vložiť inštrukciu, že sa jedná o obrázok. Podobne ako sme to robili pri vkladaní grafov do tabuľky cez jazyk SVG. Potom to už prejde.

Vrátime sa teda naspäť do Power Query (ak tam ešte nie ste), a najprv prekonvertujeme pole LargePhoto na text v kódovaní Base64. Potom pred ten text pridáme inštrukciu pre Power BI, že ide o obrázkové dáta vo formáte PNG a v kódovaní Base64. Bude to tento text:

"data:image/png;base64, "

Celé sa to dá spraviť v jednom kroku, pridaním vypočítaného stĺpca v jazyku M. Pridáme v Power Query teda nový vypočítaný stĺpec (menu “Pridať stĺpec”=> “Vlastný stĺpec”), s týmto vzorcom:

"data:image/png;base64, " & Binary.ToText([LargePhoto], BinaryEncoding.Base64)

Ak by ste mali obrázky v inom formáte, tak teoreticky by ste mali v tom texte vymeniť “png” napr. za “jpeg” alebo “gif”. A áno, idú zobrazovať aj animované GIF-y (radšej nechcem vedieť, čo sa vám teraz preháňa hlavou, na čo to všetko použiť). Prakticky to nie je potrebné, pretože reporty Power BI sú renderované cez webový prehliadač (aj v Power BI Desktope – cez Internet Explorer 11), a každý veľký webový prehliadač za posledných 10 rokov to ignoruje. A namiesto toho si pri čítaní obrázka detekuje správny typ obrázka sám. Takže to takto môžete nechať pre všetky typy obrázkov.

Zadáme teda vzorec, pomenujeme stĺpec názvom “Obrázok”, a stlačíme tlačítko “OK”:

Ak ste všetko zadali správne, tak by ste mali teraz vidieť textové údaje v novom stĺpci:

Stlačíme teda “Zavrieť a použiť”, aby sa nám údaje načítali do dátového modelu, a po úspešnom načítaní sa ocitneme v reporte. Tam vytvoríme tabuľku, kde dáme postupne stĺpce “Obrázok”, “EnglishProductName”, “Color” a “ListPrice”. Bude to vyzerať nejako takto, čo nie je zrovna moc vábne:

Potrebujeme ale ešte nastaviť tomuto stĺpcu, aby sa zobrazoval ako obrázok. To spravíme tak, že klikneme na názov stĺpca v ponuke napravo, aby zostal označený:

Potom prejdeme v hlavnom menu do záložky “Modelovanie”, a tam klikneme na “Kategória údajov: Nekategorizované” => “URL adresa obrázka”:

A ak ste všetko spravili správne, tak sa tabuľka prekreslí, a uvidíte svoje obrázky:

Ak by boli príliš malé, alebo naopak príliš veľké, tak ich zobrazovanú veľkosť môže zmeniť v nastaveniach tej zobrazovanej tabuľky. Nájdete to pod maliarskym valčekom, v skupine “Mriežka”, nastavenie “Výška obrázka”:

Tam si môžete výšku obrázka zmeniť, ak by bol príliš malý, alebo ak by bol príliš veľký a zbytočne by vám to naťahovalo riadky v tabuľke.

Takto teda môžete zobraziť obrázky z databázy na priamo nielen SQL Servera, ale aj Oracle, DB2, či iného databázového systému, ktorý vie ukladať a vracať binárne dáta. A netreba ich kvôli tomu exportovať do samostatných súborov a kopírovať niekam na webový server. Stačí iba jeden krok v Power Query a jedno nastavenie v dátovom modeli, a ide to.

Ako to rozbehať pre veľké obrázky z databázy

Táto metóda má však jedno obmedzenie. Veľkosť reťazca v tom našom vypočítanom stĺpci nemôže presiahnuť 32 766 znakov. Je to umelo vymyslený limit, pretože do textových stĺpcov môže ísť až 512 MB dát. Pri zapnutí kategorizácie “URL adresa obrázka” však Power BI z nejakého dôvodu ignoruje všetko za 32766. znakom. A zobrazí obrázok urezaný iba na tú časť, ktorá sa zmestila do tohto limitu. Ak by ste to chceli obísť, tak Chris Webb popisuje náhradné riešenie, s ktorým sa dostanete až na veľkosť takmer 2,1 MB na obrázok. V podstate ide o rozsekanie pôvodného stĺpca v Power Query na kusy po 32000 znakoch, do osobitných riadkov, a potom spájanie v merítku do jedného reťazca. Nie je to pekné, ale je to funkčné. A momentálne je to jediný jednoduchý spôsob, ako to spraviť.

A ak mám veľmi veľké obrázky?

Ak by ste ale chceli používať ešte väčšie obrázky ako 2 MB, tak máte 2 možnosti. Buď na to ísť klasickou metódou – vyexportovať a zavesiť všetky obrázky osobitne na webový server, a využiť klasickú možnosť “URL adresa obrázka” na ich zobrazenie cez URL odkaz na ten web server. Čo zrovna nepoteší, lebo musíte potom udržiavať aktuálne 2 kópie dát.

Druhé riešenie je nájsť si nejaký webový server, na ktorom beží PHP alebo ASP.NET, alebo nejaký iný skriptovací jazyk. Prípadne si dať taký server nainštalovať. Napr. IIS, ktorý je súčasťou snáď každých Windows za posledných 15 rokov. Následne spravíte na tom serveri skript, ktorý bude mať parameter “ID obrázka”, a jeho úlohou bude vrátiť obrázok s daným ID z databázy. Potom v Power BI spravíte vypočítaný stĺpec alebo merítko, kde bude URL adresa na ten skript, s parametrom ID pre daný obrázok. A tiež mu nastavíte možnosť “URL adresa obrázka”. Po troche hrania sa so serverom a nastavením cache-ovania by to nemalo preťažiť ani webový server, ani databázový server, ani pri veľkom množstve užívateľov.


Takže cesty sú. Skúšajte, a po chvíli nájdete, ako na to. A ak sa vám to podarilo, tak dajte vedieť do komentárov, ako ste sa s tým popasovali 🙂