מאמר זה פורסם במקור באנגלית, ב-05/01/2018, על ידי גרהרד בריקל – בקישור >> כאן <<
בתחתית המאמר ישנו קובץ PBIX להורדה עם הקודים, כך שלא צריך להעתיק ולבנות את הקובץ לבד.
כפי שכמה מכם כנראה זוכרים, כאשר PowerPivot הייתה זמינה רק בתוך Excel ו-Power Query עדיין לא הייתה קיימת, הייתה אפשרות לטעון תמונות ממסד נתונים (עמודה בינרית) ישירות לתוך המודל הנתונים ולהציג אותן ב-PowerView. לצערנו, התכונה הזו לא עבדה יותר ב- PowerBI Desktop והדרך היחידה להציג תמונות בוויזואל היא לספק את כתובת ה-URL של התמונה שזמינה לציבור. הוויזואל יציב את התמונה במהלך הצגת הדוח מה-URL ויציג אותה. כמובן, ישנם מגבלות שונות:
התמונה חייבת להיות זמינה דרך כתובת URL ציבורית (לדוגמה, להעלות אותה תחילה ל-Azure Blob Store).
התמונה לא יכולה להופיע במצב מקוון.
הקישור עשוי להיפסק בעתיד או להפנות לתמונה אחרת שונה מהמקורית בבניית המודל.
קיים גם פריט משוב על נושא זה שאני ממליץ לכם להצביע בעדו: https://ideas.powerbi.com/forums/265200-power-bi-ideas/suggestions/7340150-data-model-image-binary-support-in-reports
עד היום דעתי הייתה שאנחנו חייבים לחיות עם המגבלה הזו, אבל אז מצאתי פוסט בבלוג של ג'ייסון תומס (בשם הכינוי גם SqlJason). הוא מציג דרך לאפשר אחסון תמונות ישירות במודל הנתונים של PowerBI ולהציג אותן בדוח כאילו הן תמונות רגילות שנטענות מכתובת URL. זה מדהים ביותר ואני חייב להקדיש לפחות 99.9% מהפוסט הזה לג'ייסון ולפתרונו!
אך, בפוסט הבלוג הזה אני רוצה לקחת את גישתו של ג'ייסון צעד קדימה. הוא יוצר את מחרוזת ה-Base64 מחוץ למודל ומקובע בו באמצעות DAX. יש לכך יתרונות (תמונה סטטית, אין תלות חיצונית יותר…) אבל יש לכך גם הרבה חסרונות (יצירת מחרוזת ה-Base64 מחוץ למודל, העתקה ידנית של מחרוזת ה-Base64 לכל תמונה, קשה לתחזק, אין אפשרות להוסיף תמונות באופן דינאמי…). עבור תרחישים שבהם יש לך תיקייה מקומית עם תמונות, סט של כתובות URL [פרטיות] שמצביעות לתמונות או תמונות שמאוחסנות בטבלה ב SQL (כעמודה בינארית) שאתה רוצה לטעון למודל הנתונים שלך ב PowerBI, יש לאטומציה את תהליך כולו ואפשר יותר טוב לעשות זאת בתוך PowerBI.
מאושר, זה נראה פשוט! Power Query מספק פונקציה ייחודית להמרת כל בינארי למחרוזת בפורמט Base64: Binary.ToText(). החלק החשוב כאן הוא להשתמש בפרמטר השני שמאפשר לך להגדיר את קידוד הטקסט המתקבל. יש לו שני ערכים: BinaryEncoding.Base64 (ברירת מחדל) ו-BinaryEncoding.Hex. פעם שיש לנו את מחרוזת ה-Base64, אנחנו פשוט צריכים להוסיף לה את המטא דאטה הבא: "data:image/jpeg;base64, "
כדי להקל על התהליך, כתבתי שתי פונקציות לשאיבת נתונים מסוג URL או תמונה בינארית והמרתם למחרוזת המתאימה שיכולה לשמש ב PowerBI:
Default
let
UrlToImage = (ImageUrl as text) as text =>
let
BinaryContent = Web.Contents(ImageUrl),
Base64 = "data:image/jpeg;base64, " & Binary.ToText(BinaryContent, BinaryEncoding.Base64)
in
Base64
in
UrlToImage
let
UrlToImage = (ImageUrl as text) as text =>
let
BinaryContent = Web.Contents(ImageUrl),
Base64 = "data:image/jpeg;base64, " & Binary.ToText(BinaryContent, BinaryEncoding.Base64)
in
Base64
in
UrlToImage
Default
let
BinaryToPbiImage = (BinaryContent as binary) as text=>
let
Base64 = "data:image/jpeg;base64, " & Binary.ToText(BinaryContent, BinaryEncoding.Base64)
in
Base64
in
BinaryToPbiImage
let
BinaryToPbiImage = (BinaryContent as binary) as text=>
let
Base64 = "data:image/jpeg;base64, " & Binary.ToText(BinaryContent, BinaryEncoding.Base64)
in
Base64
in
BinaryToPbiImage
אם התמונות שלך נמצאות בתיקייה מקומית, תוכל פשוט לטעון אותם באמצעות מקור נתונים מסוג "תיקייה". זה יתן לך רשימה של כל התמונות והתוכן בינארי שלהן כעמודה נפרדת. לאחר מכן, הוסף עמודה מותאמת אישית חדשה שבה תזמין את הפונקציה הנדרשת להמרת הבינארי למחרוזת שמתחילה ב-Base64 המוקדמת, שתוכל להיצג ב PowerBI (או ב-Analysis Services) כתמונה רגילה.
קח בחשבון רק לקטלג את עמודת הנתונים להיות "URL של תמונה": PowerBI_Image_URL_Base64
וזהו, כעת הויזואלי יציג את התמונה שמאוחסנת במודל הנתונים בלי לצורך בגישה למשאבים חיצוניים!
אזהרה: כמו שג'ייסון מציין בסוף הפוסט שלו, יש הגבלה פנימית על גודל עמודת הטקסט. זה עשוי לגרום לבעיות כאשר אתה מנסה לטעון תמונות ברזולוציה גבוהה! במקרה כזה, פשוט נמוך את גודל/איכות התמונות לפני שאתה מעלה אותם.
עדכון מאי 2019: כריס ווב מספק עוד מידע ופתרון(!) לבעיה הזו בפוסט הבלוג שלו: https://blog.crossjoin.co.uk/2019/05/19/storing-large-images-in-power-bi-datasets
הורדה: StoreImageInPbiModel.pbix
מודל PowerBI Desktop זה מכיל את כל הדוגמאות הנ"ל כולל הפונקציות של PowerQuery!