Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-08-2003
quetzal quetzal is offline
Miembro
 
Registrado: May 2003
Posts: 78
Poder: 16
quetzal Va por buen camino
Question Como Guardar una imagen

He esta tratando de guardar una imagen del formato Jpg en un campo BLOB de interbase, he realizado los consejos que hay tanto aqui en el foro, como los de truco mania, mas no he podido realizarlo, me marca que no es un grafico lo que se quiere guardar.


Como puedo Guardar un archivo Jpg en un campo BLOB de Interbase?


Gracias de Antemano por sus respuestas
Responder Con Cita
  #2  
Antiguo 12-08-2003
Viet Viet is offline
Miembro
 
Registrado: Jul 2003
Ubicación: Argentina - Mar del Plata
Posts: 252
Poder: 16
Viet Va por buen camino
Smile

Buenas, la verdad es que no sabria como lo puedes hacer directamente sobre la base. Pero lo que yo estoy haciendo para no ocupar espacio y trabajar de modo mas eficiente con la DB es guardar los archivos de las imagenes en un recurso compartido de red y en la DB solo guardo la direccion al mismo. por ej "\\fileserver\proyectoX\imagenes\imagen_10.jgp"


Es solo una sugerencia.

Suerte
__________________
Marín Ignacio Borthiry (Viet) - "El hombre arriesga su vida cada vez que elije y eso es lo que lo hace libre" ;)
Responder Con Cita
  #3  
Antiguo 12-08-2003
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: May 2003
Posts: 2.621
Poder: 18
kinobi Va por buen camino
Hola,

hay un par de puntos que no comprendo de tu comentario:

Cita:
Posteado originalmente por Viet
Pero lo que yo estoy haciendo para no ocupar espacio y trabajar de modo mas eficiente con la DB es guardar los archivos de las imagenes en un recurso compartido de red y en la DB solo guardo la direccion al mismo.
1. ¿Cómo se mejora el aprovechamiento del espacio almacenando las imágenes fuera de la base de datos?. En mi opinión, el espacio que ocupan es el mismo, o prácticamente el mismo, dentro o fuera de la base de datos.

2. ¿Cómo se mejora la eficiencia teniendo fuera de la base de datos las imágenes?. Salvo que se utilicen consultas tipo "todo de todo" (SELECT * ...), el rendimiento de la base de datos no se ve afectado especialmente por el uso de BLOBs.

Saludos.
Responder Con Cita
  #4  
Antiguo 12-08-2003
cadetill cadetill is offline
Miembro
 
Registrado: May 2003
Posts: 3.387
Poder: 19
cadetill Va por buen camino
Cita:
Posteado originalmente por kinobi
1. ¿Cómo se mejora el aprovechamiento del espacio almacenando las imágenes fuera de la base de datos?. En mi opinión, el espacio que ocupan es el mismo, o prácticamente el mismo, dentro o fuera de la base de datos.
Creo que lo que Viet queria decir es que si se ponen las imagenes dentro de la BD, esta augmenta de tamaño considerablemente (segun el tamaño y numero de imagenes), cosa que si, por el contrario, solo se guarda una referencia a ellas (path+nombre), la BD casi ni se entera (en tamaño)

Referente al segundo punto, no conozco el tratamiento de IB referente a los Blobs, por lo que me abstengo de opinar
Responder Con Cita
  #5  
Antiguo 12-08-2003
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: May 2003
Posts: 2.621
Poder: 18
kinobi Va por buen camino
Hola,

Cita:
Posteado originalmente por cadetill
Creo que lo que Viet queria decir es que si se ponen las imagenes dentro de la BD, esta augmenta de tamaño considerablemente (segun el tamaño y numero de imagenes), cosa que si, por el contrario, solo se guarda una referencia a ellas (path+nombre), la BD casi ni se entera (en tamaño)
precisamente por eso. ¿Qué sentido tiene utilizar una base de datos si una parte de la información, y una parte importante en volumen, se almacena fuera de la base de datos?.

Personalmente veo muy pocas ventajas, en realidad ninguna, almacenando las imágenes fuera de la base de datos, y sí desventajas: posibilidad de pérdida de integridad, disminución de la seguridad, pérdida de movilidad entre diferentes plataformas, ...

Saludos.
Responder Con Cita
  #6  
Antiguo 13-08-2003
jacanche jacanche is offline
Miembro
 
Registrado: May 2003
Ubicación: Campeche,Campeche,Mexico
Posts: 137
Poder: 16
jacanche Va por buen camino
Hola, ¿puedes ser mas especifico con la clase de error que te marca, y de ser posible algo de codigo con el que haces el guardado?. Realmente no deberia de haber problemas con el guardado de una imagen jpeg en un campo blob de interbase, con el metodo LoadFromFile del TBlobField, deberia ser suficiente.

Saludos
Alfredo.
Responder Con Cita
  #7  
Antiguo 13-08-2003
Iván Iván is offline
Miembro
 
Registrado: May 2003
Ubicación: Palma de Mallorca
Posts: 118
Poder: 16
Iván Va por buen camino
Buenas

Yo particularmente siempre he usado la opción de las imagenes fuera de la Base de Datos.

La explicación es sencilla. Cuando empecé a programar con IB en la versión 5.x, el como usar los Blobs por esa época, para mi era toda una incognita. Eran mis primeros pasos en estos mundos de Dios....

Además, de vez en cuando, la gente reportaba problemas de corrupción de la Base de Datos provocados por las imagenes. Bueno, mejor dicho, creo que era porque la BD eran grandes y ese era el problema, no las imagenes en si mismo.

Así que yo me he acostumbrado a usar las imagenes fuera de la BD.

Hoy en día, creo q el tema está más que superado. Y que con IB7, o con FB1.5, probablemente ya no haya ningún problema en trabajar con imagenes dentro de la BD.

Lo que dice Kinobi de poder transportar fácilmente de un SO a otro la BD es cierto, ya que a veces guardar las imagenes fuera de la BD es un verdadero dolor de cabeza.

Pero lo importante es que la gente conozca las dos opciones, pros y contras, y que se decida con la que mejor se ajusta a sus necesidades

Un saludo para todos.
__________________
Di amigo, y entra...
Guía de estilos de los foros

Visita www.mundobd.com
Responder Con Cita
  #8  
Antiguo 13-08-2003
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: May 2003
Posts: 2.621
Poder: 18
kinobi Va por buen camino
Hola Iván,

Cita:
Posteado originalmente por Iván
Además, de vez en cuando, la gente reportaba problemas de corrupción de la Base de Datos provocados por las imagenes. Bueno, mejor dicho, creo que era porque la BD eran grandes y ese era el problema, no las imagenes en si mismo.
extraño, al menos el diagnóstico. InterBase, versiones previas a la 6.x, tenía por defecto el modo de escritura síncrona; es decir, cuando se produce el commit de los datos actualizados, el servidor vuelca las páginas tocadas a disco, garantizando (con independencia del tamaño de la base, ya que trabaja a nivel de página) una posibilidad de corrupción lo menor posible. Además, hay que tener en cuenta que InterBase almacena la información de las columnas de tipo BLOB en un tipo de páginas diferentes a las páginas de datos "normales".

Tengo constancia de bases de datos InterBase (versiones 4.x y 5.x) con varios Gigas de almacenamiento (incluidos BLOBs), funcionando sin problemas.

Saludos.
Responder Con Cita
  #9  
Antiguo 13-08-2003
Carlitos Carlitos is offline
Miembro
 
Registrado: Aug 2003
Posts: 22
Poder: 0
Carlitos Va por buen camino
1. Entrando en la polémica de si en fichero o en la base de datos en un campo blob: Todo lo que esté dentro de la base de datos mejor (para eso se inventaron), simplifica la configuración del cliente (la aplicación cliente se entiende...) y no hay que andar compartiendo directorios. Evidentemente aumenta de tamaño la base de datos, pero también lo hacen los directorios donde se almacenan las imágenes. Además al estar en la propia base de datos, las copias con gbak también te guardarían las imágenes. Está claro que si la misma imagen se repite mucho, tendrás que organizar mejor la base de datos y tener una tabla exclusiva para las imágenes. Mucha gente comete el fallo de por ejemplo poner un campo de fotografía en la ficha de un "artículo" y luego tener la misma fotografía repetida porque la misma incluyen varios artículos o es la misma o parecida. Esto si hace aumentar la base de datos inecesariamente, pero como todo, hay que hacer un buen estudio al igual que se hacen para otras tablas, para las imágenes y evitar repeticiones..

2.Desconozco realmente las circunstancias y el error (necesitaría más información), pero suele ser muy frecuente, no el almacenamiento de la imágen en el campo blob, sino el visualizar una imagen JPEG en un componente dataware. Algunos componentes dataware de imágenes no están preparados para mostrar JPEG y hay que escribir un poco de código para que lo soporte...
Responder Con Cita
  #10  
Antiguo 13-08-2003
Iván Iván is offline
Miembro
 
Registrado: May 2003
Ubicación: Palma de Mallorca
Posts: 118
Poder: 16
Iván Va por buen camino
Como dirían mis amigos... "es una leyenda urbana", pero que al principio yo desconocía si era real o no, y me acostumbré a trabajar con las imagenes fuera de la BD.

Pero totalmente de acuerdo, que por comodidad mejor dentro de la BD, y que todos son ventajas.

Un saludo
__________________
Di amigo, y entra...
Guía de estilos de los foros

Visita www.mundobd.com
Responder Con Cita
  #11  
Antiguo 13-08-2003
Viet Viet is offline
Miembro
 
Registrado: Jul 2003
Ubicación: Argentina - Mar del Plata
Posts: 252
Poder: 16
Viet Va por buen camino
Pobre de quetzal..... que entre comentarios "fuera" y "dentro de la db" , ninguno de nosotros le soluciono el problema......


quetzal tal vez con esto :
guardar imagen

(el temilla se podria pasar a debates, no?.... es solo una sugerencia )
__________________
Marín Ignacio Borthiry (Viet) - "El hombre arriesga su vida cada vez que elije y eso es lo que lo hace libre" ;)
Responder Con Cita
  #12  
Antiguo 13-08-2003
cadetill cadetill is offline
Miembro
 
Registrado: May 2003
Posts: 3.387
Poder: 19
cadetill Va por buen camino
Cita:
Posteado originalmente por Viet
quetzal tal vez con esto :
guardar imagen
Segun IE, esto es una pagina de tu bandeja de entrada de MS Hotmail, por lo que no se puede visualizar (no tenemos permiso, claro esta )
Responder Con Cita
  #13  
Antiguo 13-08-2003
Viet Viet is offline
Miembro
 
Registrado: Jul 2003
Ubicación: Argentina - Mar del Plata
Posts: 252
Poder: 16
Viet Va por buen camino
perdon seria este

__________________
Marín Ignacio Borthiry (Viet) - "El hombre arriesga su vida cada vez que elije y eso es lo que lo hace libre" ;)
Responder Con Cita
  #14  
Antiguo 15-08-2003
quetzal quetzal is offline
Miembro
 
Registrado: May 2003
Posts: 78
Poder: 16
quetzal Va por buen camino
Talking

gracias a todos por sus comentarios

lo soluciones con este codigo



unit Unit1;

{
Copyright (c) 2001 Ernesto De Spirito
Latium Software http://www.latiumsoftware.com/
Email: edspirito@latiumsoftware.com

This example requires the BDE.
Este ejemplo requiere de la BDE.
}

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Db, DBTables, Grids, DBGrids, jpeg, ExtCtrls, DBCtrls, Menus,
ExtDlgs;

type
TForm1 = class(TForm)
Image1: TImage;
DataSource1: TDataSource;
Table1: TTable;
dlgOpenPicture: TOpenPictureDialog;
PopupMenu1: TPopupMenu;
mnuLoad: TMenuItem;
DBNavigator1: TDBNavigator;
mnuClear: TMenuItem;
Table1FOTO: TBlobField;
procedure Table1AfterScroll(DataSet: TDataSet);
procedure mnuLoadClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure mnuClearClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

type
TGraphType = (gtBitmap, gtIcon, gtMetafile, gtJpeg);

implementation

{$R *.DFM}

// =====================================================================

procedure TForm1.Table1AfterScroll(DataSet: TDataSet);
var
Stream: TMemoryStream;
Jpg: TJpegImage;
GraphType: TGraphType;
begin
Jpg := nil;
Stream := nil;
try
Stream := TMemoryStream.Create;
TBlobField(Table1.FieldByName('foto')).SaveToStream(Stream);
if Stream.Size > 0 then begin
Stream.Position := 0;
Stream.Read(GraphType, 1);
case GraphType of
gtBitmap: Image1.Picture.Bitmap.LoadFromStream(Stream);
gtIcon: Image1.Picture.Icon.LoadFromStream(Stream);
gtMetafile: Image1.Picture.Metafile.LoadFromStream(Stream);
gtJpeg: begin
Jpg := TJpegImage.Create;
Jpg.LoadFromStream(Stream);
Image1.Picture.Assign(Jpg);
end else
Image1.Picture.Assign(nil);
end;
end else
Image1.Picture.Assign(nil);
except
Image1.Picture.Assign(nil);
end;
jpg.Free;
Stream.Free;
end;

// =====================================================================

procedure TForm1.mnuLoadClick(Sender: TObject);
var
Jpg: TJpegImage;
Stream: TMemoryStream;
FileExt: string;
GraphType: TGraphType;
begin
if dlgOpenPicture.Execute then begin
Jpg := nil;
Stream := nil;
try
Stream := TMemoryStream.Create;
FileExt := LowerCase(ExtractFileExt(dlgOpenPicture.FileName));
if (FileExt = '.bmp') or (FileExt = '.dib') then begin
GraphType := gtBitmap;
Stream.Write(GraphType, 1);
with Image1.Picture.Bitmap do begin
LoadFromFile(dlgOpenPicture.FileName);
Image1.Picture.Bitmap.SaveToStream(Stream);
end;
end else if (FileExt = '.ico') then begin
GraphType := gtIcon;
Stream.Write(GraphType, 1);
with Image1.Picture.Icon do begin
LoadFromFile(dlgOpenPicture.FileName);
Image1.Picture.Bitmap.SaveToStream(Stream);
end;
end else if (FileExt = '.emf') or (FileExt = '.wmf') then begin
GraphType := gtMetafile;
Stream.Write(GraphType, 1);
with Image1.Picture.Metafile do begin
LoadFromFile(dlgOpenPicture.FileName);
Image1.Picture.Bitmap.SaveToStream(Stream);
end;
end else if (FileExt = '.jpg') or (FileExt = '.jpeg')
or (FileExt = '.jpe') then begin
Jpg := TJpegImage.Create;
Jpg.LoadFromFile(dlgOpenPicture.FileName);
Image1.Picture.Assign(Jpg);
GraphType := gtJpeg;
Stream.Write(GraphType, 1);
Jpg.SaveToStream(Stream);
end;
if (Table1.State <> dsEdit) and (Table1.State <> dsInsert) then
Table1.Edit;
Stream.Position := 0;
TBlobField(Table1.FieldByName('foto')).LoadFromStream(Stream);
except
jpg.Free;
Stream.Free;
raise;
end;
jpg.Free;
Stream.Free;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
if Not FileExists('GraphTest.DB') then
Table1.CreateTable;
Table1.Open;
end;

procedure TForm1.mnuClearClick(Sender: TObject);
begin
Image1.Picture.Assign(nil);
if (Table1.State <> dsEdit) and (Table1.State <> dsInsert) then
Table1.Edit;
Table1.FieldByName('foto').Assign(nil);
end;

end.


Gracias a spitito por compartir este codigo

es mejor gusrdar la informacion en una BD que fuera de ella, nsi no para que fueron creas
Responder Con Cita
  #15  
Antiguo 16-08-2003
luigui_vampa luigui_vampa is offline
Registrado
 
Registrado: Jun 2003
Ubicación: México
Posts: 2
Poder: 0
luigui_vampa Va por buen camino
Hola y antes que nada disculpen la intromision pero en realidad no puedo evitar hacerlo jejeje, bueno el caso es que por algo de tiempo he realizado un catálogo de productos para una compañia en el cual se debe agregar fotografia de los articulos y demas datos como precio y descripciones el caso es que en los primeros intentos (hace unos 5 años) insertaba las imagenes en un campo BLOB pero oh gran problema el sistema se hace terriblemente lento y esto es por lo que sigue:

El campo BLOB almacena (en el caso particular de las imagenes) en formato BMP el cual obviamente es mucho más grande en espacio dentro de tu base de datos y esto sucede aún que le pegues un JPG siendo asi tienes dos opciones que listo a continuación.

a) Lees tu archivo en formato JPG e insertas el contenido del mismo en un campo BLOB Byte (no Image) y te ahorras un espacio en tu base de datos.

b) Vinculas alguno de tus campos al nombre del archivo que contiene tu imagen en formato JPG y lo cargas en un componente Image.

En lo personal y si el comentario te es util prefiero la segunda opción ya que no tienes problemas de rendimiento en tus equipos y si quieres imprimir las imagenes en un reporte solo emplea el evento BeforePrint de la banda en cuestión, claro esto siempre y cuando emplees QReports.

Saludos desde México
Responder Con Cita
  #16  
Antiguo 16-08-2003
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: May 2003
Posts: 2.621
Poder: 18
kinobi Va por buen camino
Hola,

Cita:
Posteado originalmente por luigui_vampa
El campo BLOB almacena (en el caso particular de las imagenes) en formato BMP ...
seguramente no he entendido correctamente tu exposición, pero una columna BLOB InterBase no almacena imágenes en un formato (gráfico) particular. Simplemente es un "saco" para almacenar datos. Si esos datos pertenecen a una imagen Jpeg, se almacenan tal cual, sin ningún BMP asociado. Lo máximo que se puede distinguir es el subtipo BLOB (0->binario, 1->texto, resto->definido por el usuario); En cualquier caso, el servidor no hace ningún tipo de análisis o transformación de la información que entra o sale de un BLOB. No existe, por tanto, ninguna ventaja en cuanto al tamaño ocupado por el almacenamiento de la imagen, esté ésta en un archivo externo o en la base de datos dentro de un BLOB.

Saludos.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 19:04:21.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi