forked from mbk-lab/rui_orig
2
0
Fork 0

Added InlineImageFromResource function

This commit is contained in:
Alexei Anoshenko 2023-01-24 17:41:56 -05:00
parent 42b34ac4df
commit 644ec6d8c5
7 changed files with 70 additions and 53 deletions

View File

@ -1,6 +1,7 @@
# v0.12.0 # v0.12.0
* Added SvgImageView * Added SvgImageView
* Added InlineImageFromResource function
# v0.11.0 # v0.11.0

View File

@ -2875,7 +2875,25 @@ TextView наследует от View все Свойства параметро
Выводимое изображение задается string Свойством "src" (константа Source). Выводимое изображение задается string Свойством "src" (константа Source).
В качестве значения данному Свойству присваивается либо имя изображения в папке images ресурсов, В качестве значения данному Свойству присваивается либо имя изображения в папке images ресурсов,
либо url изображения. либо url изображения, либо inline-изображение.
inline-изображение это содержимое файла изображения закодированное в формате base64.
Для получения inline-изображение из ресурсов приложения используется функция
func InlineImageFromResource(filename string) (string, bool)
inline-изображения необходимо использовать в WebAssembly приложениях,
если вы хотите разместить изображения в ресурсах, а не на внешнем сервере.
inline-изображения могут вызывать фризы приложения в Safari, поэтому их лучше избегать.
Пример
if runtime.GOOS == "js" {
if image, ok := rui.InlineImageFromResource("image.png"); ok {
view.Set(rui.Source, image)
}
} else {
view.Set(rui.Source, "image.png")
}
ImageView позволяет выводить разные изображения в зависимости от плотности экрана ImageView позволяет выводить разные изображения в зависимости от плотности экрана
(см. раздел "Изображения для экранов с разной плотностью пикселей"). (см. раздел "Изображения для экранов с разной плотностью пикселей").

View File

@ -2848,7 +2848,25 @@ To create an ImageView function is used:
func NewImageView(session Session, params Params) ImageView func NewImageView(session Session, params Params) ImageView
The displayed image is specified by the string property "src" (Source constant). The displayed image is specified by the string property "src" (Source constant).
As a value, this property is assigned either the name of the image in the "images" folder of the resources, or the url of the image. As a value, this property is assigned either the name of the image in the "images" folder of the resources, or the url of the image, or inline-image.
An inline-image is the content of an image file encoded in base64 format.
To get an inline-image from the application resources, use the function
func InlineImageFromResource(filename string) (string, bool)
Inline-images must be used in WebAssembly applications
if you want to host images in resources rather than on an external server.
Inline-images can cause app freezes in Safari and should be avoided.
Example
if runtime.GOOS == "js" {
if image, ok := rui.InlineImageFromResource("image.png"); ok {
view.Set(rui.Source, image)
}
} else {
view.Set(rui.Source, "image.png")
}
ImageView allows you to display different images depending on screen density ImageView allows you to display different images depending on screen density
(See section "Images for screens with different pixel densities"). (See section "Images for screens with different pixel densities").

View File

@ -5,8 +5,6 @@ import (
"strings" "strings"
) )
var wasmMediaResources = false
//go:embed app_scripts.js //go:embed app_scripts.js
var defaultScripts string var defaultScripts string

View File

@ -1,11 +1,7 @@
package rui package rui
import ( import (
"encoding/base64"
"path/filepath"
"runtime"
"strconv" "strconv"
"strings"
) )
const ( const (
@ -83,27 +79,6 @@ func (manager *imageManager) loadImage(url string, onLoaded func(Image), session
image.loadingStatus = ImageLoading image.loadingStatus = ImageLoading
manager.images[url] = image manager.images[url] = image
if runtime.GOOS == "js" && wasmMediaResources {
if file, ok := resources.images[url]; ok && file.fs != nil {
dataType := map[string]string{
".svg": "data:image/svg+xml",
".png": "data:image/png",
".jpg": "data:image/jpg",
".jpeg": "data:image/jpg",
".gif": "data:image/gif",
}
ext := strings.ToLower(filepath.Ext(url))
if prefix, ok := dataType[ext]; ok {
if data, err := file.fs.ReadFile(file.path); err == nil {
session.callFunc("loadInlineImage", url, prefix+";base64,"+base64.StdEncoding.EncodeToString(data))
return image
} else {
DebugLog(err.Error())
}
}
}
}
session.callFunc("loadImage", url) session.callFunc("loadImage", url)
return image return image
} }

View File

@ -1,10 +1,7 @@
package rui package rui
import ( import (
"encoding/base64"
"fmt" "fmt"
"path/filepath"
"runtime"
"strings" "strings"
) )
@ -272,27 +269,7 @@ func (imageView *imageViewData) src(src string) (string, string) {
} }
if src != "" { if src != "" {
srcset := imageView.srcSet(src) return src, imageView.srcSet(src)
if runtime.GOOS == "js" && wasmMediaResources {
if image, ok := resources.images[src]; ok && image.fs != nil {
dataType := map[string]string{
".svg": "data:image/svg+xml",
".png": "data:image/png",
".jpg": "data:image/jpg",
".jpeg": "data:image/jpg",
".gif": "data:image/gif",
}
ext := strings.ToLower(filepath.Ext(src))
if prefix, ok := dataType[ext]; ok {
if data, err := image.fs.ReadFile(image.path); err == nil {
return prefix + ";base64," + base64.StdEncoding.EncodeToString(data), ""
} else {
DebugLog(err.Error())
}
}
}
}
return src, srcset
} }
return "", "" return "", ""
} }

View File

@ -1,7 +1,9 @@
package rui package rui
import ( import (
"encoding/base64"
"net" "net"
"path/filepath"
"strconv" "strconv"
"strings" "strings"
) )
@ -76,3 +78,31 @@ func dataFloatProperty(data DataObject, tag string) float64 {
} }
return 0 return 0
} }
// InlineImageFromResource reads image from resources and converts it to an inline image.
// Supported png, jpeg, gif, and svg files
func InlineImageFromResource(filename string) (string, bool) {
if image, ok := resources.images[filename]; ok && image.fs != nil {
dataType := map[string]string{
".svg": "data:image/svg+xml",
".png": "data:image/png",
".jpg": "data:image/jpg",
".jpeg": "data:image/jpg",
".gif": "data:image/gif",
}
ext := strings.ToLower(filepath.Ext(filename))
if prefix, ok := dataType[ext]; ok {
if data, err := image.fs.ReadFile(image.path); err == nil {
return prefix + ";base64," + base64.StdEncoding.EncodeToString(data), true
} else {
DebugLog(err.Error())
}
} else {
DebugLogF(`InlineImageFromResource("%s") error: Unsupported file`, filename)
}
} else {
DebugLogF(`The resource image "%s" not found`, filename)
}
return "", false
}