Estoy explorando el uso, a través de Extern, de la librería MagickWand para ello me sirvo de un ejemplo alojado en la wiki del foro gambas-it.org.
https://www.gambas-it.org/wiki/index.php...mageMagick
Bien la pegunta es:
¿Como convertir la variable tipo Pointer "magickwand", que ya contiene un la imagen redimensionada, en una imagen en memoria que pueda usar gambas?
Ya que para el uso que deseo darle no es necesario que la imagen redimensionada sea guardada en el sistema de archivos.
Encontré que hay una
Struct de la siguiente forma:
Código:
size_t id
char name [MagickPathExtent]
Image * images
ImageInfo * image_info
ExceptionInfo * exception
MagickBooleanType insert_before
MagickBooleanType image_pending
MagickBooleanType debug
size_t signature
https://www.imagemagick.org/api/MagickWa...kWand.html
Pero no se como asignar el puntero a dicha estructura.
¿La imagen esta en "Image * images" ? en ese caso ¿Como la convierto en una
Image de gambas?
Este es el código modificado para usarlo como función, que no funciona:
Código:
' Gambas module file
Library "libMagickWand-6.Q16:6.0.0"
Private Enum MagickFalse = 0, MagickTrue
Private Enum UndefinedFilter = 0, PointFilter, BoxFilter, TriangleFilter, HermiteFilter,
HanningFilter, HammingFilter, BlackmanFilter, GaussianFilter, QuadraticFilter,
CubicFilter, CatromFilter, MitchellFilter, JincFilter, SincFilter, SincFastFilter,
KaiserFilter, WelshFilter, ParzenFilter, BohmanFilter, BartlettFilter, LagrangeFilter,
LanczosFilter, LanczosSharpFilter, Lanczos2Filter, Lanczos2SharpFilter, RobidouxFilter,
RobidouxSharpFilter, CosineFilter, SplineFilter, LanczosRadiusFilter, SentinelFilter
Public Struct Swand
id As Integer
char As String
images As Pointer
image_info As String
exception As String
insert_before As Boolean
image_pending As Boolean
bdebug As Boolean
signature As Integer
End Struct
' void MagickWandGenesis(void)
' Initializes the MagickWand environment.
Private Extern MagickWandGenesis()
' MagickWand *NewMagickWand(void)
' Returns a wand required for all other methods in the API.
Private Extern NewMagickWand() As Pointer
' MagickBooleanType MagickReadImage(MagickWand *wand,const char *filename)
' Reads an image or image sequence.
Private Extern MagickReadImage(wand As Pointer, filename As String) As Boolean
' MagickBooleanType MagickResizeImage(MagickWand *wand, const size_t columns,const size_t rows,const FilterType filter)
' Scales an image to the desired dimensions with a filter.
Private Extern MagickResizeImage(wand As Pointer, columns As Long, rows As Long, filter As Integer, blur As Float) As Boolean
' MagickBooleanType MagickWriteImages(MagickWand *wand, const char *filename,const MagickBooleanType adjoin)
' Writes an image or image sequence.
Private Extern MagickWriteImages(wand As Pointer, filename As String, adjoin As Boolean) As Boolean
' MagickWand *DestroyMagickWand(MagickWand *wand)
' Deallocates memory associated with an MagickWand.
Private Extern DestroyMagickWand(wand As Pointer) As Pointer
' void MagickWandTerminus(void)
' Terminates the MagickWand environment.
Private Extern MagickWandTerminus()
Public Function Image(jpg As String) As Image
Dim bo As Boolean
Dim magickwand As Pointer
Dim w As New Swand
Dim fileimmagine, nuovofile As String
Dim img As Image
MagickWandGenesis()
magickwand = NewMagickWand()
bo = MagickReadImage(magickwand, jpg)
If bo = MagickFalse Then
Error.Raise("Impossibile caricare il file immagine !")
Chiude(magickwand)
Endif
' Ridimensiona l'immagine:
MagickResizeImage(magickwand, 106, 80, LanczosFilter, 1.0)
bo = MagickWriteImages(magickwand, nuovofile, MagickTrue)
If bo = MagickFalse Then
Error.Raise("Impossibile creare il nuovo file dell'immagine ridimensionata !")
Chiude(magickwand)
Else
w = magickwand
img = w.images
Endif
Chiude(magickwand)
If img Then
Return img
Else
Return Null
Endif
End
Private Procedure Chiude(mw As Pointer)
' Libera la memoria e chiude la libreria "ImageMagick":
DestroyMagickWand(mw)
Wait 0.01
MagickWandTerminus()
End
(17-11-2022, 11:41)Shordi escribió: con un directorio con tropecientas fotos, si cambias de vista de lista detalle a iconos, verás que la miniatura se va rellenando poco a poco.
Efectivamente, el esta sobre la mesa esa opción, de hecho tengo algo armado en otro programa que extrae las imágenes de un PDF para ello uso la clase Task de gambas que funciona súper bien para esto que decís.
De todas manera quisiera saber si esta forma que uso es mejorable.
(17-11-2022, 11:32)gartumar2 escribió: ¿Cuanto "pesan" las imágenes antes de redimensionarlas?
Las imágenes son de unos 4Mb son fotos de teléfonos y cámaras.
Esto es para el programa
Photo organizer que hace un tiempo estoy desarrollando y en el feedback de Shordi y TercoIDE me instaron a que se puedan ver las fotos y se pueda buscar en una base de datos, así que acá estoy tratando de lograr el desafío.
El objetivo es mostrar unas miniaturas de las imágenes de un directorio d importación y también mostrar las imágenes del disco duro al buscar por fecha o por alguna otra restricción.
(17-11-2022, 12:04)gartumar2 escribió: PD. Efectivamente la activación del perfilado me deja a Gambas frito, se queda bloqueado en Loading profiling file...... hasta que explota. Con Gtk funciona bien.
si, correcto, hay que usar QT para que funcione. Antes funcionaba con GTK pero algo cambio.