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.
Respuesta de merman
1
1
merman, ¡ DISPARA ! Más de 5 años trabajando con las versiones de Power...
- 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: --------------- 1º - 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; --------------------- 3º 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.