Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros temas > Trucos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Los mejores trucos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-02-2008
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Determinar el tipo de imagen a nivel de dato

Seguramente, todos los que hemos trabajado con campos Blob para guardar imágenes nos hemos querido "modernizar" y en vez de guardar BMPs intentamos guardar JPEGs o PNGs, las razones están fuera del alcance de este trick, así que no las quiero mencionar.

Pero que pasa si quieres recuperar esas imágenes para guardarlas en un archivo? Tendrás problemas, a menos que las guardes en *.BMP (archivos enormes). Desde este punto tomo en cuenta que conocen como cargar en un objeto TBitmap el contenido de un campo Blob.

Fijándome en el código fuente de la unidad Graphics de Delphi, leí que la forma de determinar el tipo de imagen que hace el objecto TImage es cabernicola, lo hace por medio de la extensión del nombre de archivo. Esta unidad no implementa algún recurso para determinar el formato de la imagen a nivel binario. Por esta razón es que me dispuse a escribir el siguiente código, que quiero compartirlo con ustedes.
Código Delphi [-]
Function GetGraphicClass(Source:TStream):TGraphicClass;
var
FStreamHeader : TStringStream;
StartPosition : Int64;
CONST
PNGFILE_HEADER = '‰PNG';
BMPFILE_HEADER = 'BM';
JPGFILE_HEADER = 'ÿØÿà';
Begin
try
  StartPosition := Source.Position;
  IF Source.Size > 0 Then
      Source.Position := 0
  else // Stream vacío
    Raise Exception.Create('El stream no tiene datos');
    
  FStreamHeader := TStringStream.Create('');

    with FStreamHeader do
    begin
    CopyFrom(Source,512);   // Copiamos el header del Stream
    if pos(PNGFILE_HEADER,DataString) > 0 Then
      Result := TPNGObject
    else if pos(BMPFILE_HEADER,DataString) > 0 Then
      Result := TBitmap
    else if pos(JPGFILE_HEADER,DataString) > 0 Then
      Result := TJPEGImage
    else
      Result := TGraphic; // no quiero producir una excepción a este nivel
    end;
finally
  Source.Position := StartPosition;
end;
end;
A como se ve, esta función está también lejos de ser perfecta, pero a su vez es mucho más segura que la forma en que lo hace Delphi.

En mi caso, en el sistema que me encuentro desarrollando, solo espero manejar imágenes BMP, JPG y PNG, es por esa razón que el código solamente soporta este tipo de imágenes, pero muy facimente se puede escalar.

¿Cómo utilizarlo?
Código Delphi [-]
procedure GuardarImagen;
var
imgStream : TStream;
imgObject : TGraphic;
begin
// cargamos el contenido del campo en el stream
imgStream := TStream.Create;
imgStream := MiTabla.CreateBlobField(miTabla.FieldByName('campoblob'),bmRead);

//determinamos el tipo de imagen
imgObject := GetGraphicClass(imgStream).Create;
imgObject.LoadFromStream(imgStream);
imgObject.SavetoFile(...);
// ... Liberamos el imgObject y imgStream en las siguientes lineas ....
De esta forma tendrás una forma segura de cargar imágenes en un objecto TGraphic y salvarlas en un archivo.

Saludos.
Responder Con Cita
  #2  
Antiguo 12-02-2008
adearmas adearmas is offline
Registrado
 
Registrado: ago 2007
Posts: 4
Poder: 0
adearmas Va por buen camino
Me gusto mucho el truco... Me resulto muy interesante... sobretodo porque no sabia que se podian devolver tipos de datos e instanciar una clase como lo hiciste.
Siempre se aprende algo nuevo... Gracias!

Responder Con Cita
  #3  
Antiguo 12-02-2008
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
No hay de que adearmas, es un placer compartir. :-)
Responder Con Cita
  #4  
Antiguo 27-03-2008
Delfino Delfino is offline
Miembro
 
Registrado: jul 2003
Ubicación: Madrid
Posts: 974
Poder: 21
Delfino Va por buen camino
Puedes mejorar la funcion mirando este enlace http://www.clubdelphi.com/foros/showthread.php?t=12174
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 07:18:26.


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