Mostar imagen BLOB

Necesito saber como muestro una imagen grande en powerbuilder (Ver 6.5). Tengo un campo tipo Blob con una imagen de tamaño media carta, pero no me la muestra en el objecto picture p_1
Si la imagen es pequeña si lo hace.

1 Respuesta

Respuesta
1
- El problema consiste en que cuanto más grande es la imagen, más información es necesaria almacenar en la variable de tipo 'blob', y esta tiene un límite, que estarás sobrepasando.
Para solucionar esto te sugiero dos soluciones:
La primera ( si es indispensable el tratamiento "dinámico" de la imagen), que utilices un programa gráfico (photoshop, etc) y le quites un poco de resolución a la imagen y vuelvas a probar, probando tamaños de menor a mayor hasta que veas que ya no puede con la imagen.
La segunda (si no es necesario que utilices la variable de tipo 'blob').
Juega con la propiedad del objeto Picture llamada PictureName, en ella le asocias la imagen que quieras en cualquier momento.
Por ejemplo:
picture1.PictureName = "C:\pelota.bmp"
Ya hice los del primer punto, cree una imagen (circulo) en paint y lo salve con 256 colores, la imagen ocupa 75 KB, pero aun así no se muestra.
Si hay otra forma de hacerlo a sea sin mostrarla en un picture.
La solución del punto dos no me sirve por que estas imágenes deben estar en la Base de datos y no en el sistema operativo.
Gracias experto.
Otra vez:
Vamos a ver...
El problema es debido a que el gráfico que quieres volcar
sobre la variable excede la longitud que está puede soportar (32765 bytes),
ya que me indicas que tiene 75 Kb o más, eso significa 75x1024 = 76800 bytes.
Sabiendo que debes realizar la operativa de forma "dinámica" te expongo la solución:
---------------

- Debes asegurarte que la propiedad de
conexión de la base de datos es "Autocommit = TRUE"
-----------------------
2º (Atención aquí)
- Al cargar el gráfico acumula los valores recogidos de tipo blob,
y luego actualiza el blob con UPDATEBLOB como te expongo:
***********************
Ejemplo para 'msgarcia'
***********************
integer vueltas
blob b_blob, b_blob_total
long longitud
int fichero, bytes_leidos,i
// Imaginamos que tenemos que cargar el siguiente fichero:
// Como la imagen es grande, nos conviene poner el relojito, ;-))
Setpointer(Hourglass!)
// Obtenemos su longitud
// imaginemos que la imagen que quieres cargar está en el directorio "windows"
longitud = FileLength("c:\windows\estadio1g.bmp")
// Abrá que acumular tantas veces
// como el número de bytes que tenga la imagen entre 32765
IF longitud > 32765 THEN
IF Mod(longitud, 32765) = 0 THEN
vueltas = longitud/32765
ELSE
vueltas = (longitud/32765) + 1
END IF
ELSE
vueltas = 1
END IF
// Abrimos el fichero en modo lectura
fichero = FileOpen("c:\windows\estadio1g.bmp", StreamMode!, Read!, LockRead!)
FOR i = 1 to vueltas
bytes_leidos = FileRead(fichero, b_blob)
b_blob_total = b_blob_total + b_blob
NEXT
// Cerramos el fichero
FileClose(fichero)
// Insertamos en la tabla "rvm_dibujo" los campos clave y el resto, menos el de tipo BLOB
INSERT INTO rvm_dibujo ( codigo, otro )
VALUES ( 1, 2 );
// UPDATEAMOS LA FILA CON LA VARIABLE DE TIPO BLOB
UPDATEBLOB rvm_dibujo SET dibujo = :b_blob_total
WHERE codigo = 1;
COMMIT;
---------------------

Ahora para cargar el dibujo en un picture llamado "p_1",
desde el evento requerido teclea:
blob b_dibujo
int a, li_otro
dec longi
SELECTBLOB dibujo
into :b_dibujo
from rvm_dibujo
where codigo = 1;
p_1.SetRedraw(FALSE)
a = p_1.SetPicture(b_dibujo)
p_1.SetRedraw(TRUE)
-----------
Y esto es todo, te debe funcionar.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas