Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-05-2007
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 19
MaMu Va por buen camino
Validar Imagen

Yo estoy haciendo un programa que muestra archivos de imagenes JPG y BMP en un TImage, pero como puedo hacer para validarlos, puesto a que yo, por ejemplo, puedo renombrar un archivo.txt a un archivo.jpg/archivo.bmp y me genera error al intentar cargalo, esto lo hago a modo de "error de lectura" como para poder contemplar esto. Existe alguna forma, es decir, hay algun encabezado o dato que pueda verificar que si existe en el archivo JPG o BMP, me lo valide y sino que lo descarte?

Saludos y gracias
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #2  
Antiguo 22-05-2007
Avatar de BuenaOnda
BuenaOnda BuenaOnda is offline
Miembro
 
Registrado: feb 2006
Ubicación: La Serena - Chile
Posts: 347
Poder: 19
BuenaOnda Va por buen camino
Para validar que un archivo exista puedes utilizar la funcion FileExists, pero si tu pregunta es que valide que el archivo de imagen no este dañado, no se si podrá, tendrías que crear un captura de errores TRY / EXCEPT, esa es la forma que utilizo, espero que te sirva.
Responder Con Cita
  #3  
Antiguo 22-05-2007
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 19
MaMu Va por buen camino
Cita:
Empezado por BuenaOnda
Para validar que un archivo exista puedes utilizar la funcion FileExists, pero si tu pregunta es que valide que el archivo de imagen no este dañado, no se si podrá, tendrías que crear un captura de errores TRY / EXCEPT, esa es la forma que utilizo, espero que te sirva.
En realidad es ver si el archivo esta dañado.
Podrias ponerme un ejemplo de como usar TRY / EXCEPT para capturar cuando esta dañado?

A ver, yo lo entiendo asi, es correcto?

Código Delphi [-]
...
try 
 Image1.LoadFromFile('c:\imagen.jpg');
except
 showmessage('Archivo Dañado');
 Image1.LoadFromFile('c:\mi_imagen_para_el_error.jpg');
end;
...

Saludos y Gracias
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #4  
Antiguo 22-05-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Podrías probar a mostrarlo en un TImage (puede estar oculto si no te interesa que se vea) a ver si genera algun error, posiblemente un EInvalidGraphic.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 22-05-2007
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 19
MaMu Va por buen camino
Cita:
Empezado por Neftali
Podrías probar a mostrarlo en un TImage (puede estar oculto si no te interesa que se vea) a ver si genera algun error, posiblemente un EInvalidGraphic.
Mmm, y como sería eso? Mi forma esta mal? Lo que quiero hacer es que si el archivo de imagen no es reconocido, me ponga la imagen de error.
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;

Última edición por MaMu fecha: 22-05-2007 a las 09:42:02.
Responder Con Cita
  #6  
Antiguo 22-05-2007
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 19
MaMu Va por buen camino
Esto es lo que hice, segun entiendo yo, pero no me captura le excepcion.
Tengo añadida JPEG en el uses.

Código Delphi [-]
...
try
 Image1.Picture.LoadFromFile('c:\imagen.jpg');
except
 on EInvalidGraphic do
  begin
   Image1.Picture.Graphic := nil;
  DeleteFile('c:\imagen.jpg');
  end;
end;
...
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #7  
Antiguo 22-05-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por mamu
... y como sería eso? Mi forma esta mal?
Más o menos me refería a eso.
No vi tu respuesta.
Yo intentaría capturar el tipo concreto del error; Algo así:

Código Delphi [-]
try
  Image1.Picture.Bitmap.LoadFromFile('C:\Temp\Readme.bmp');
except
  on E:EInvalidGraphic do begin
    MessageDlg('Archivo Dañado o no es un tipo de imagen reconocido.', mtError, [mbOK], 0);
    Image1.Picture.Bitmap.LoadFromFile('c:\mi_imagen_para_el_error.jpg');
  end;
  on E:EFOpenError do begin
    MessageDlg('El archivo de imagen no existe.', mtError, [mbOK], 0);
  end
  else begin
    MessageDlg('Error desconocido', mtError, [mbOK], 0);
  end;
end;
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #8  
Antiguo 22-05-2007
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 19
MaMu Va por buen camino
No importa como intente la captura de la excepcion, siempre me sale:

'JPEG error #42'

saltando todo el codigo de tratamiento.

Why?!?!
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #9  
Antiguo 22-05-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por mamu
No importa como intente la captura de la excepcion, siempre me sale:'JPEG error #42'
Pues yo he hecho la prueba renombrando un TXT a BMP e intentando cargarlo y me sale bien...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #10  
Antiguo 22-05-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Pues he probado con un Readme.txt renombreado a Readme.bmp y readme.jpg y este código y me lo captura perfectamente.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin


  try
    Image1.Picture.LoadFromFile('C:\Temp\Readme.jpg');
  except
    on E:EInvalidGraphic do begin
      MessageDlg('Archivo Dañado o no es un tipo de imagen reconocido.', mtError, [mbOK], 0);
      Image1.Picture.LoadFromFile('c:\mi_imagen_para_el_error.jpg');
    end;
    on E:EFOpenError do begin
      MessageDlg('El archivo de imagen no existe.', mtError, [mbOK], 0);
    end
    else begin
      MessageDlg('Error desconocido', mtError, [mbOK], 0);
    end;
  end;
end;

Desactiva que salten las excepciones en diseño (Stop on Delphi exceptions) en el IDE.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #11  
Antiguo 22-05-2007
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 19
MaMu Va por buen camino
Hice todo, desactive eso del IDE, lo que yo hago es lo siguiente:


Código Delphi [-]
for z:=0 to Lista.Count-1 do
  begin
     CopiarArchivo(lista.Strings[z],dirtmp+'\'+ExtractFileName(lista.Strings[z]));
     try
       Image5.Picture.LoadFromFile(lista.Strings[z]);
     except
       on EInvalidGraphic do
          begin
            DeleteFile(dirtmp+'\'+ExtractFileName(lista.Strings[z]));
          end;
       on EFOpenError do
           begin
             DeleteFile(dirtmp+'\'+ExtractFileName(lista.Strings[z]));
           end;
       on EOutOfResources do
           begin
             DeleteFile(dirtmp+'\'+ExtractFileName(lista.Strings[z]));
           end;
        on E: EOSError do
           begin
             DeleteFile(dirtmp+'\'+ExtractFileName(lista.Strings[z]));
           end;
        on EReadError do
           begin
             DeleteFile(dirtmp+'\'+ExtractFileName(lista.Strings[z]));
           end;
      else begin
         DeleteFile(dirtmp+'\'+ExtractFileName(lista.Strings[z]));
      end;
 end;


Pero no me borra el archivo que esta mal, me lo deja. Porque?
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;

Última edición por MaMu fecha: 22-05-2007 a las 14:25:15.
Responder Con Cita
  #12  
Antiguo 22-05-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Interesante código manu, pero como no te andes con cuidado puedes quedarte sin fotos En concreto, los errores EOutOfResources y EOSError pueden producirse aunque el archivo sea valido, solo hace falta que pilles al windows en un "mal momento".

Por otro lado, comprueba que:
Código Delphi [-]
dirtmp+'\'+ExtractFileName(lista.Strings[z])
es verdaderamente la ruta del archivo.
Responder Con Cita
  #13  
Antiguo 22-05-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por mamu
Pero no me borra el archivo que esta mal, me lo deja. Porque?
¿Lo has ejecutado paso a paso? ¿Exactamente por dónde está pasando?
Estaría bien que comprobaras antes de borrar si el archivo existe...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #14  
Antiguo 22-05-2007
Wellnic Wellnic is offline
Miembro
 
Registrado: mar 2007
Posts: 68
Poder: 18
Wellnic Va por buen camino
Para saber desde el principio si un fichero es una imagen (tenga la extensión que tenga) lo mejor es abrirlo en modo binario y comprobar si tiene determinada característica propia de ese archivo. Por ejemplo, los jpg siempre tienen la cadena JFIF en la 7ª posición:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var fc: File;
    tf: String;

begin
tf:= StringOfChar(#32, 4);//hace sitio para almacenar 4 caracteres
AssignFile(fc, 'C:\Imagen.jpg');
FileMode:= fmOpenRead; // abrir como solo lectura... por si acaso
Reset(fc, 1);
Seek(fc, 6); //situar el puntero en la 7ª posición
BlockRead(fc, tf[1], 4); //lee esos 4 bytes en la variable tf
CloseFile(fc);
If tf='JFIF' Then ShowMessage('Es una imagen JPG');
end;
Cada formato de imagen tiene sus características, que se pueden averiguar con cualquier editor hexadecimal.
Responder Con Cita
  #15  
Antiguo 22-05-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por Wellnic
Para saber desde el principio si un fichero es una imagen (tenga la extensión que tenga) lo mejor es abrirlo en modo binario y comprobar si tiene determinada característica propia de ese archivo. Por ejemplo, los jpg siempre tienen la cadena JFIF en la 7ª posición:
¿Y si el archivo esta corrupto? ¿Le falta un trozo?, etc ... Si el propio método Loadfromfile no avisa por medio de excepciones de todos estos errores, para que vamos a complicarnos.
Responder Con Cita
Respuesta



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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Validar Nif Colgueit OOP 12 10-05-2006 02:50:28
Validar Fecha Gustavo Gowdak OOP 7 03-05-2006 19:24:37
Validar un campo gluglu Varios 3 14-01-2005 15:43:58
validar sin exepciones gustavo2 Conexión con bases de datos 2 30-01-2004 15:54:56
validar en qry alcides SQL 2 06-01-2004 18:11:19


La franja horaria es GMT +2. Ahora son las 17:44:03.


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