[QGIS-it-user] Raster Image Marker da BLOB da GPGK

Buongiorno,

ho la necessità di associare, data-driven, un’immagine memorizzata in un gpgk come blob ad un tematismo puntuale

ho provato in var modi ma non mi riesce di farlo

ho un’espressione personalizzata che mi trasforma i blob in immagine ma funziona per le cornici html ma non per il tematismo:

from qgis.core import *
from qgis.gui import *

@qgsfunction(args=‘auto’, group=‘Custom’, handlesnull=True)
def blobjpg_to_html(blob,style,feature,parent):
“”"
Restituisce il blob (che deve essere in jpeg) convertito in HTML img data url per visualizzarlo

in un Widget HTML o in un suggerimento mappa.

E’ obbligatorio il secondo parametro style.

Il parametro style puo’ assumere il valore ‘’ per nessuno stile (dimensioni originali)

o puo’ essere una stringa CSS di stile per img HTML tag,

Se stile e’ ‘Null’ viene applicato di default ‘style="max-width:100%; max-height:100%;’.

Sintassi

blobjpg_to_html( blob,style)

Argomenti

blob - campo contenente i dati blob
style - campo contenente stringa CSS

Esempi

  • blobjpg_to_html("photo", '') -> tag img con immagine a risoluzione originale
  • blobjpg_to_html("photo", Null) -> tag img con dimensioni massime
  • blobjpg_to_html("photo", 'width="250" height="250"') -> tag img dimensionato

Ringraziamenti

Tratto da [https://gis.stackexchange.com/questions/350541/display-photo-stored-as-blob-in-gpkg](https://gis.stackexchange.com/questions/350541/display-photo-stored-as-blob-in-gpkg)

""" blob64 = blob.toBase64().data().decode() if style is None: stylestring = 'style="max-width:100%; max-height:100%;"' elif not(style): stylestring = 'style=""' else: stylestring = 'style="' + style + '"' fullstring = 'Invalid jpeg' return fullstring

Avete qualche suggerimento?

Grazie

Ciao Giulio,
non ho ben capito in quali modi hai provato e come vuoi implementare ciò che vuoi fare e che relazione c’è con la funzione di cui hai riportato il testo.

Comunque la simbologia Raster Image Marker accetta in input un’immagine codificata in base64 come testo base64: seguito dalla codifica base64 dell’immagine.
La funzione predefinita to_base64(value) trasforma il valore binario contenuto nel parametro value nella corrispondente rappresentazione di stringa codificata in base64 https://docs.qgis.org/3.16/en/docs/user_manual/working_with_vector/functions_list.html#to-base64

A presto.

Andrea

···

Il 22/02/2022 08:51, Giulio Fattori ha scritto:

Buongiorno,

ho la necessità di associare, data-driven, un’immagine memorizzata in un gpgk come blob ad un tematismo puntuale

ho provato in var modi ma non mi riesce di farlo

Ciao Andrea,
ho bisogno di utilizzare l'immagine memorizzata come blob nel gpgk come Raster Image Marker, in analogia a quanto già ottengo passando il percorso al file dell'immagine che ho in una cartella.
Ho provato come mi suggerisci ma sbaglio in qualcosa, potresti darmi un esempio?
La funzione che ho citato permette di inserire l'mmagine memorizzata come blob in una cornice html nel composer, ma non funziona, anche modificata, per inserire l'immagine nel Raster Image Marker.
Grazie
A presto

Il 22/02/2022 13:11, Andrea Giudiceandrea ha scritto:

Ciao Giulio,
non ho ben capito in quali modi hai provato e come vuoi implementare ciò che vuoi fare e che relazione c'è con la funzione di cui hai riportato il testo.

Comunque la simbologia Raster Image Marker accetta in input un'immagine codificata in base64 come testo base64: seguito dalla codifica base64 dell'immagine.
La funzione predefinita to_base64(value) trasforma il valore binario contenuto nel parametro value nella corrispondente rappresentazione di stringa codificata in base64 https://docs.qgis.org/3.16/en/docs/user_manual/working_with_vector/functions_list.html#to-base64

A presto.

Andrea

Il 22/02/2022 08:51, Giulio Fattori ha scritto:

Buongiorno,

ho la necessità di associare, data-driven, un'immagine memorizzata in un gpgk come blob ad un tematismo puntuale

ho provato in var modi ma non mi riesce di farlo

_______________________________________________
QGIS-it-user mailing list
QGIS-it-user@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/qgis-it-user

Il 22/02/2022 19:57, Giulio Fattori ha scritto:

Ciao Andrea,
ho bisogno di utilizzare l'immagine memorizzata come blob nel gpgk come Raster Image Marker, in analogia a quanto già ottengo passando il percorso al file dell'immagine che ho in una cartella.
Ho provato come mi suggerisci ma sbaglio in qualcosa, potresti darmi un esempio?

Ciao Giulio,
puoi indicare come esattamente hai provato?

Potresti magari rendere disponibile un layer GeoPackage con almeno una feature generica che contenga anche l'immagine in un campo blob?

A presto.

Andrea

Ciao Giulio,
ho visto che il parametro di Data defined override per la simbologia Raster Image Marker l'hai impostato con il valore del campo "image_link".

Ma avevi scritto che volevi usare il campo che contiene il BLOB dell'immagine, e questo campo è "Image_PNG".

Come ti accennavo, Raster Image Marker può aggettare come Data defined override una stringa che inizia con 'base64:' seguito dalla codifica base64 dell'immagine.
Per ottenere la codifica base64 dell'immagine contenuta in un BLOB si può usare la funzione predefinita to_base64().

Quindi, se non ho capito male, dovresti poter usare, per esempio, una delle seguenti espressioni:

'base64:' || to_base64( "Image_PNG" )

'base64:' + to_base64( "Image_PNG" )

concat( 'base64:', to_base64( "Image_PNG" ) )

A presto.

Andrea

Il 23/02/2022 16:28, Giulio Fattori ha scritto:

Buonasera,
ecco in allegato un esempio.
quel che mi domando, e che vorrei ottenere, è: perchè non riesco ad usare il blob memorizzato nel gpgk per tematizzare il punto?

Ci stavo impazzendo anche io,
ma dove è scritto che bisogna scrivere in questo modo?

‘base64:’ || to_base64( “Image_PNG” )

io provavo senza ‘base64:’ e non funzionava.

comunque grazie mille

saluti

···

Ing. Salvatore Fiandaca
mobile.:+39 327.493.8955
m: pigrecoinfinito@gmail.com
C.F.: FNDSVT71E29Z103G
P.IVA: 06597870820
membro QGIS Italia - http://qgis.it/
socio GFOSS.it - http://gfoss.it/
blog:**** https://pigrecoinfinito.com/
FB: Co-admin - https://www.facebook.com/qgis.it/****
TW: ****https://twitter.com/totofiandaca

43°51’0.54"N 10°34’27.62"E - EPSG:4326

“Se la conoscenza deve essere aperta a tutti,
perchè mai limitarne l’accesso?”
R. Stallman

Questo documento, allegati inclusi, contiene informazioni di proprietà di FIANDACA SALVATORE e deve essere utilizzato esclusivamente dal destinatario in relazione alle finalità per le quali è stato ricevuto. E’ vietata qualsiasi forma di riproduzione o divulgazione senza l’esplicito consenso di FIANDACA SALVATORE. Qualora fosse stato ricevuto per errore si prega di informare tempestivamente il mittente e distruggere la copia in proprio possesso.

Ciao Salvatore,
in effetti mi pare che questa funzionalità non sia documentata.

Per Raster image marker è stata introdotta [1] similarmente a quella per SVG marker [2].

Nel manuale utente [3] la funzionalità era stata inserita (“The image can be a file on the disk, a remote URL or an embedded file encoded as a base64 string”), ma poi eliminata forse per errore (“The image can be a file on the disk, a remote URL or embedded in the style database”).

L’ho segnalato in modo che venga reintrodotta [4] (e magari spiegata meglio).

La stringa ‘base64:’ iniziale è necessaria per indicare che ciò che segue è una stringa base64 che codifica un’immagine, come ‘http:’ o ‘https:’ per indicare che si tratta di un URL.

Ho visto ora che c’è anche una risposta su stackexchange [5] che lo spiega.

A presto.

Andrea

[1] https://github.com/qgis/QGIS/pull/8613
[2] https://github.com/qgis/QGIS/pull/7433
[3] https://docs.qgis.org/3.22/en/docs/user_manual/style_library/symbol_selector.html#marker-symbols
[4] https://github.com/qgis/QGIS-Documentation/pull/4641#discussion_r813232968
[5] https://gis.stackexchange.com/a/381492/107272

···

Il 23/02/2022 19:47, Totò Fiandaca ha scritto:

Ci stavo impazzendo anche io,
ma dove è scritto che bisogna scrivere in questo modo?

Il 23/02/2022 19:00, Andrea Giudiceandrea ha scritto:

Ciao Giulio,
ho visto che il parametro di Data defined override per la simbologia Raster Image Marker l'hai impostato con il valore del campo "image_link".

Ma avevi scritto che volevi usare il campo che contiene il BLOB dell'immagine, e questo campo è "Image_PNG".
Buongiorno,

grazie infinite, ci stavo diventando matto da giorni e non ho trovato alcuna documentazione esaustiva

Giulio

Come ti accennavo, Raster Image Marker può aggettare come Data defined override una stringa che inizia con 'base64:' seguito dalla codifica base64 dell'immagine.
Per ottenere la codifica base64 dell'immagine contenuta in un BLOB si può usare la funzione predefinita to_base64().

Quindi, se non ho capito male, dovresti poter usare, per esempio, una delle seguenti espressioni:

'base64:' || to_base64( "Image_PNG" )

'base64:' + to_base64( "Image_PNG" )

concat( 'base64:', to_base64( "Image_PNG" ) )

A presto.

Andrea

Il 23/02/2022 16:28, Giulio Fattori ha scritto:

Buonasera,
ecco in allegato un esempio.
quel che mi domando, e che vorrei ottenere, è: perchè non riesco ad usare il blob memorizzato nel gpgk per tematizzare il punto?

_______________________________________________
QGIS-it-user mailing list
QGIS-it-user@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/qgis-it-user

Buongiorno,

scusa se ti importuno ulteriormente

ho bisogno di ottenere le dimensioni dell’immagine memorizzata nel blob

ho scritto un’espressione per il field calc

from qgis.core import *
from qgis.gui import *
from PyQt5.QtGui import QImage, QImageReader

@qgsfunction(args=‘auto’, group=‘Custom’, referenced_columns=)
def get_blob_sizes(im_shape, feature, parent):
“”"
Calculate blob image size
“”"

reader = QImageReader(im_shape)
sizeOfImage = reader.size()
img_height = sizeOfImage.height()
img_width = sizeOfImage.width()
dimensioni = str(img_width)+ ’ x ’ + str(img_height)

return dimensioni

che funziona perfettamente con il link all’immagine ma non con il blob

come dovrei modificarla ?

Grazie e a presto

Giulio

···

Il 23/02/2022 19:00, Andrea Giudiceandrea ha scritto:

Ciao Giulio,
ho visto che il parametro di Data defined override per la simbologia Raster Image Marker l’hai impostato con il valore del campo “image_link”.

Ma avevi scritto che volevi usare il campo che contiene il BLOB dell’immagine, e questo campo è “Image_PNG”.

Come ti accennavo, Raster Image Marker può aggettare come Data defined override una stringa che inizia con ‘base64:’ seguito dalla codifica base64 dell’immagine.
Per ottenere la codifica base64 dell’immagine contenuta in un BLOB si può usare la funzione predefinita to_base64().

Quindi, se non ho capito male, dovresti poter usare, per esempio, una delle seguenti espressioni:

‘base64:’ || to_base64( “Image_PNG” )

‘base64:’ + to_base64( “Image_PNG” )

concat( ‘base64:’, to_base64( “Image_PNG” ) )

A presto.

Andrea

Il 23/02/2022 16:28, Giulio Fattori ha scritto:

Buonasera,
ecco in allegato un esempio.
quel che mi domando, e che vorrei ottenere, è: perchè non riesco ad usare il blob memorizzato nel gpgk per tematizzare il punto?


QGIS-it-user mailing list
QGIS-it-user@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/qgis-it-user

Ciao Giulio,
il tuo campo “Image_PNG” è di tipo QByteArray (come puoi vedere da Layer properties → Fields).

Per ottenere le dimensioni dell’immagine devi prima creare da esso un oggetto QImage (la cui classe hai già importato nel tuo script senza usarla), similarmente a come hai fatto creando un oggetto QImageReader.

Quindi, se l’oggetto QByteArray è memorizzato nella variabile blob:

image = QImage().fromData(blob)

https://doc.qt.io/qt-5/qimage.html#loadFromData-1

A questo punto dovresti poter ottenere un oggetto QSize con image.size() oppure direttamente le dimensioni con image.height() e image.width().

A presto.

Andrea

···

Il 24/02/2022 09:23, Giulio Fattori ha scritto:

Buongiorno,

scusa se ti importuno ulteriormente

ho bisogno di ottenere le dimensioni dell’immagine memorizzata nel blob

Ciao Giulio,
hai risolto il problema?

A presto.

Andrea

···

Il 24/02/2022 11:29, Andrea Giudiceandrea ha scritto:

Ciao Giulio,
il tuo campo “Image_PNG” è di tipo QByteArray (come puoi vedere da Layer properties → Fields).

Per ottenere le dimensioni dell’immagine devi prima creare da esso un oggetto QImage (la cui classe hai già importato nel tuo script senza usarla), similarmente a come hai fatto creando un oggetto QImageReader.

Quindi, se l’oggetto QByteArray è memorizzato nella variabile blob:

image = QImage().fromData(blob)

https://doc.qt.io/qt-5/qimage.html#loadFromData-1

A questo punto dovresti poter ottenere un oggetto QSize con image.size() oppure direttamente le dimensioni con image.height() e image.width().

A presto.

Andrea

Il 24/02/2022 09:23, Giulio Fattori ha scritto:

Buongiorno,

scusa se ti importuno ulteriormente

ho bisogno di ottenere le dimensioni dell’immagine memorizzata nel blob

Buongiorno e buona domenica

scusa il ritardo ma periodo concitato

Si risolto perfettamente grazie al tuo suggerimento

Ho messo il codice della funzione per il calcolatore di campi su gist

https://gist.github.com/Korto19/d8474e0284b6de9d78b5b4eab3ce1aa4

Grazie ancora

A presto

Giulio

···

Il 24/02/2022 11:29, Andrea Giudiceandrea ha scritto:

Ciao Giulio,
il tuo campo “Image_PNG” è di tipo QByteArray (come puoi vedere da Layer properties → Fields).

Per ottenere le dimensioni dell’immagine devi prima creare da esso un oggetto QImage (la cui classe hai già importato nel tuo script senza usarla), similarmente a come hai fatto creando un oggetto QImageReader.

Quindi, se l’oggetto QByteArray è memorizzato nella variabile blob:

image = QImage().fromData(blob)

https://doc.qt.io/qt-5/qimage.html#loadFromData-1

A questo punto dovresti poter ottenere un oggetto QSize con image.size() oppure direttamente le dimensioni con image.height() e image.width().

A presto.

Andrea

Il 24/02/2022 09:23, Giulio Fattori ha scritto:

Buongiorno,

scusa se ti importuno ulteriormente

ho bisogno di ottenere le dimensioni dell’immagine memorizzata nel blob


---

QGIS-it-user mailing list
QGIS-it-user@lists.osgeo.org
[https://lists.osgeo.org/mailman/listinfo/qgis-it-user](https://lists.osgeo.org/mailman/listinfo/qgis-it-user)