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 19-03-2015
jesusgandia1966 jesusgandia1966 is offline
Miembro
 
Registrado: mar 2015
Posts: 27
Poder: 0
jesusgandia1966 Va por buen camino
Obtener info de un fichero JPG

Como puedo obtener información de un fichero de imagen JPG.

El problema es que a veces un usuario intenta cargarme una imagen JPG de 32 bits de profundidad de colores y el TImage de Builder no lo acepta con el consecuente error y salida del programa.

También he intentado proteger el código que abre el cuadro de dialogo de las imágenes para controlar el error y responder con un mensaje al usuario, pero da la casualidad que se comete el error y el programa sigue sin ir al Catch(...) del try{}.

He buscado por todo el foro y en Google, pero sigo sin saber como obtengo esa información.

De ya muchas gracias.

Aunque el mi código está en C++, si alguien me puede ayudar en Delphi, yo ya pasaría la función a C++.

Código:

Código PHP:
    String Fichero fV->SV->DatSetPCRutaTPV_Ncr "Imagenes\\Logo.jpg"
    if(!
ForceCurrentDirectory
    { 
        
ForceCurrentDirectory true
        
SetCurrentDir(fV->SV->DatSetPCRutaTPV_Ncr "Galeria\\Logos"); 
        
OPDLogo->InitialDir GetCurrentDir(); 
    } 
    else 
        { 
            
SetCurrentDir(ExtractFilePath(OPDLogo->FileName)); 
            
OPDLogo->InitialDir GetCurrentDir(); 
        } 

    try 
    { 
        if(
OPDLogo->Execute()) 
        { 
            if(
ComparaExtension(OPDLogo->FileName,".jpg")) 
            { 
                
ImagenLogo->Picture->LoadFromFile(OPDLogo->FileName);//Protegiendo esta linea conta posibles fallos de IMAGEN 
                
if(ImagenLogo->Picture->Width <300>Picture->Height <150>IBSQLExec->ParamByName("P_NOMIMAGEN")->AsString "Logo"
                    
MDatos->IBSQLExec->ParamByName("P_FOTO")->LoadFromFile(OPDLogo->FileName); 
                    
MDatos->IBSQLExec->ExecQuery(); 
                    
MDatos->IBSQLExec->Close(); 
                    
MDatos->IBTransaction->CommitRetaining(); 

                    
ImagenLogo->Picture->LoadFromFile(OPDLogo->FileName); 
                    
ImagenLogoTicket->Picture->LoadFromFile(OPDLogo->FileName); 
                    
ImagenLogo->Picture->SaveToFile(Fichero.w_str()); 
                } 
                else 
                    { 
                        
fV->MenDialogo
                        
"La imagen es demasiado grande\n" 
                        "Máximo alto permitido = 150 Pixels\n" 
                        "Maximo ancho permitido = 300 Pixels"
,'!'); 

                        if(
FileExists(Fichero.w_str())) 
                        { 
                            
ImagenLogo->Picture->LoadFromFile(Fichero.w_str()); 
                            
ImagenLogoTicket->Picture->LoadFromFile(Fichero.w_str()); 
                        } 
                        else 
                            { 
                                
ImagenLogo->Picture NULL
                                
ImagenLogoTicket->Picture NULL
                            } 
                    } 
            } 
            else 
                
fV->MenDialogo
                
"Solo puede seleccionar archivos de imagen (*.JPG).\n" 
                "El archivo para el logo, no se cargará."
); 
        } 
        else 
            
fV->MenDialogo
            
"Se ha cancelado la imagen.\n" 
            "El logo no se cambiará."
); 
    } 
    catch(...) 
        { 
            
fV->MenDialogo
            
"La imagen que ha seleccionado, tiene una profundidad de color de más de 24 bits, o no es una fichero de imagen correcto.\n\n" 
            "Se cancela la operacion de cargar LogoTipo."
,'!'); 
        } 

Última edición por ecfisa fecha: 19-03-2015 a las 20:04:43. Razón: etiquetas
Responder Con Cita
  #2  
Antiguo 19-03-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
jesusgandia1966,

¡Bienvenido al Club Delphi!

Te sugiero revisar la Guía de estilo de los foros, recomendada a todos los nuevos ingresos al Club Delphi.

¡Gracias por tu cooperación!

Saludos,

Nelson.
Responder Con Cita
  #3  
Antiguo 19-03-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola jesusgandia1966.

Revisa este enlace: Getting JPEG resolution without decoding the image

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 20-03-2015
jesusgandia1966 jesusgandia1966 is offline
Miembro
 
Registrado: mar 2015
Posts: 27
Poder: 0
jesusgandia1966 Va por buen camino
El enlace que sugieres, muestra información sobre la cabecera de fichero JPG, pero no me dice si el fichero está guardado con 8, 16, 24 o 32 bits de profundidad de color.

Ya miré en todo el foro y no encontré respuesta.
Responder Con Cita
  #5  
Antiguo 20-03-2015
jesusgandia1966 jesusgandia1966 is offline
Miembro
 
Registrado: mar 2015
Posts: 27
Poder: 0
jesusgandia1966 Va por buen camino
Ok

Esto Es Lo Que Quiero Obtener:
Imágenes Adjuntas
Tipo de Archivo: jpg Captura.JPG (27,5 KB, 9 visitas)
Responder Con Cita
  #6  
Antiguo 20-03-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Haz una búsqueda por EXIF.
De todas formas, dices que el problema es que no puedes mostrar imágenes de 32 bits en un TImage, ¿es eso?
Responder Con Cita
  #7  
Antiguo 20-03-2015
jesusgandia1966 jesusgandia1966 is offline
Miembro
 
Registrado: mar 2015
Posts: 27
Poder: 0
jesusgandia1966 Va por buen camino
NO, NO ES ESO. Abrir un JPG de 32 bits de color en un TImage no es lo que quiero.

El problema es que antes de abrir o cargar el fichero, quiero detectar si es de 32 bits o de 24 bits.
Responder Con Cita
  #8  
Antiguo 20-03-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Haz una búsqueda por EXIF.




..............
Responder Con Cita
  #9  
Antiguo 20-03-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola jesusgandia1966
Cita:
Empezado por jesusgandia1966 Ver Mensaje
El enlace que sugieres, muestra información sobre la cabecera de fichero JPG, pero no me dice si el fichero está guardado con 8, 16, 24 o 32 bits de profundidad de color.

Ya miré en todo el foro y no encontré respuesta.
Pues no has mirado lo suficientemente bién.

La función que presentan en el segundo mensaje,
Código Delphi [-]
function GetJpegSize(jpeg: TMemoryStream; out width, height, BitDepth: integer): boolean;
devuelve la profundidad del color en el parámetro BitDepth.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #10  
Antiguo 20-03-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por ecfisa Ver Mensaje
La función que presentan en el segundo mensaje devuelve la profundidad del color en el parámetro BitDepth.
Responder Con Cita
  #11  
Antiguo 21-03-2015
jesusgandia1966 jesusgandia1966 is offline
Miembro
 
Registrado: mar 2015
Posts: 27
Poder: 0
jesusgandia1966 Va por buen camino
Gracias tienes toda la razón no vi el segundo mensaje.
Di por hecho que solo mostraba la cabecera del JPG y me salte ver la función.
Responder Con Cita
  #12  
Antiguo 28-03-2015
jesusgandia1966 jesusgandia1966 is offline
Miembro
 
Registrado: mar 2015
Posts: 27
Poder: 0
jesusgandia1966 Va por buen camino
Esta función no obtiene la información de si la imagen es de 32, 24, 16 o 8 bits.
El valor obtenido no corresponde con lo mencionado en el post.
Pueden comprobarlo ustedes mismos.
Deje en un post mas arriba lo que quiero y lo que quiero es consultar un fichero JPG directamente en el archivo y comprobar si es de 32 bits, 24, 16 o 8 bits.
Tal como cuando hace Windows con las propiedades del fichero, que si es de IMAGEN muestra dichos valores de forma muy directa.
Responder Con Cita
  #13  
Antiguo 28-03-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Puedes poner tu código?
Responder Con Cita
  #14  
Antiguo 28-03-2015
jesusgandia1966 jesusgandia1966 is offline
Miembro
 
Registrado: mar 2015
Posts: 27
Poder: 0
jesusgandia1966 Va por buen camino
Supuestamente el valor Read, obtiene el valor de los Bits de color.
Esto está cogido basándose en el código sugerido mas arriba puesto por otros foreros.
El código está en Delphi, pero en C++ es muy parecido.
Este código no funciona:

Código:
    	String Fichero = fV->SV->DatSetPCRutaTPV_Ncr + "Imagenes\\Logo.jpg";
        TJPEGImage* Imagen_JPG = new TJPEGImage();
        TMemoryStream *StreamTmp = new TMemoryStream;

        Imagen_JPG->LoadFromFile(Fichero.w_str());
        Imagen_JPG->SaveToStream(StreamTmp);

        wchar_t buffer[1024];
        StreamTmp->Read(buffer, 0);
        INT COLOR = buffer[0] * 8;

        ShowMessage(COLOR);
Responder Con Cita
  #15  
Antiguo 28-03-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Y en qué parte de ese código se leen los datos de la imagen?
Responder Con Cita
  #16  
Antiguo 28-03-2015
jesusgandia1966 jesusgandia1966 is offline
Miembro
 
Registrado: mar 2015
Posts: 27
Poder: 0
jesusgandia1966 Va por buen camino
Código:
wchar_t buffer[1024];
        StreamTmp->Read(buffer, 0);
        INT COLOR = buffer[0] * 8;
Responder Con Cita
  #17  
Antiguo 28-03-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Jesus.

Código PHP:
bool getJpegsize(TMemoryStream *jpegint &widthint &heightint &bitDepth) {
  
int n;
  
unsigned char b;
  
unsigned int w;
  
bool result false;

  
jpeg->Size;
  
jpeg->Position 0;
  if (
<= 0) return false;
  
jpeg->Read(&w2);
  if ( 
0xD8FF ) return false;
  
jpeg->Read(&b1);
  while (
jpeg->Position && b==0xFF) {
    
jpeg->Read(&b1);
    switch(
b) {
      case 
0xC0: case 0xC1: case 0xC2: case 0xC3: {
        
jpeg->Seek(3soFromCurrent);
        
jpeg->Read(&w2);
        
height = (w&0xFF)<<8|(w&0xFF00)>>8;
        
jpeg->Read(&w2);
        
width =  (w&0xFF)<<8|(w&0xFF00)>>8;
        
jpeg->Read(&b1);
        
bitDepth 8;
        return 
true;
      }; break;
      case 
0xFFjpeg->Read(&b1); break;
      case 
0xD0: case 0xD1: case 0xD2: case 0xD3: case 0xD4:
      case 
0xD5: case 0xD6: case 0xD7: case 0xD8: case 0xD9: {
        
jpeg->Seek(1soFromCurrent);
        
jpeg->Read(&b1);
      };
      default: {
        
jpeg->Read(&w2);
        
jpeg->Seek(((w&0xFF)<<8|(w&0xFF00)>>8)-2soFromCurrent);
        
jpeg->Read(&b,1);
      }; break;
    }
  }

Ejemplo de uso:
Código PHP:
void __fastcall TForm1::Button1Click(TObject *Sender){
  if (
OpenDialog1->Execute()) {
    
TMemoryStream *ms = new TMemoryStream;
    
int w,h,d;

    
ms->LoadFromFile(OpenDialog1->FileName);
    
getJpegsize(mswhd);
    
delete ms;
    
ShowMessage("Width: "+IntToStr(w)+
                
"\nHeight: "+IntToStr(h)+
                
"\nDepth: "+IntToStr(d));
  }

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #18  
Antiguo 28-03-2015
jesusgandia1966 jesusgandia1966 is offline
Miembro
 
Registrado: mar 2015
Posts: 27
Poder: 0
jesusgandia1966 Va por buen camino
Muchas gracias por tu aporte, lo probaré y te digo.
Responder Con Cita
  #19  
Antiguo 28-03-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Jesus.
Cita:
Empezado por jesusgandia1966 Ver Mensaje
Esta función no obtiene la información de si la imagen es de 32, 24, 16 o 8 bits.
El valor obtenido no corresponde con lo mencionado en el post.
Pueden comprobarlo ustedes mismos.
Deje en un post mas arriba lo que quiero y lo que quiero es consultar un fichero JPG directamente en el archivo y comprobar si es de 32 bits, 24, 16 o 8 bits.
Tal como cuando hace Windows con las propiedades del fichero, que si es de IMAGEN muestra dichos valores de forma muy directa.
No había leido este mensaje.

Te comento que en mis pruebas, la información que muestra la función traducida, se corresponde con la obtenida en el explorador de windows en las propiedades del archivo.

De todos modos se me ocurrió que también podrías probar de este modo:
Código PHP:
TPixelFormat getColorbit(const char* &fileName) {
  
TPixelFormat pf;

  
Graphics::TBitmap *bmp = new Graphics::TBitmap;
  
TJPEGImage *jpg = new TJPEGImage;
  
jpg->LoadFromFile(fileName);
  
bmp->Assign(jpg);
  
pf bmp->PixelFormat;
  
delete jpg;
  
delete bmp;

  return 
pf;

Ej. de llamada:
Código PHP:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  if (
OpenDialog1->Execute())
    switch (
getColorbit(OpenDialog1->FileName.c_str())) {
      case 
pfDeviceShowMessage("Device-dependant bitmap");break;
      case 
pf1bit  ShowMessage("One bit per pixel");break;
      case 
pf4bit  ShowMessage("Uses a 16-color palette");break;
      case 
pf8bit  ShowMessage("Uses a 256color palette"); break;
      case 
pf15bit ShowMessage("uses 15 bits per pixel (RGB compression)"); break;
      case 
pf16bit ShowMessage("uses 16 bits per pixel (bitfield compression)"); break;
      case 
pf24bit ShowMessage("uses 24 bits per pixel"); break;
      case 
pf32bit ShowMessage("uses 32 bits per pixel (RGB compression)"); break;
      case 
pfCustomShowMessage("TBitmap does not support pfCustom"); break;
    }

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #20  
Antiguo 29-03-2015
jesusgandia1966 jesusgandia1966 is offline
Miembro
 
Registrado: mar 2015
Posts: 27
Poder: 0
jesusgandia1966 Va por buen camino
El problema es que con este código cuando la imagen JPG es de 32 bits de color sucede un error al asignárselo al TBitmap en la siguiente LINEA:
Código:
bmp->Assign(jpg);//Salta una excepción si la IMANGEN DEL jpg es de 32 bits de color
Sin embargo la solución de "ecfisa" funciona perfectamente en todos los casos.
MUCHISIMAS GRACIAS A TODOS, habéis aportado mucho a mi problema en la resolución.
GRACIAS, GRACIAS y GRACIAS.

Última edición por jesusgandia1966 fecha: 29-03-2015 a las 03:44:05. Razón: Agradecimiento
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
Obtener datos de un fichero PDF Lourdes.Fdez Varios 7 03-02-2010 23:51:57
obtener fechas fichero meme C++ Builder 2 27-10-2007 16:12:05
Obtener un fichero adjunto a un nodo de un fichero XML muntasil Internet 0 18-07-2006 12:57:57
Obtener info de bateria igest2000 Varios 3 19-01-2006 23:25:41
Obtener INfo del la BIOS Enan0 API de Windows 3 04-05-2005 14:48:20


La franja horaria es GMT +2. Ahora son las 08:16:11.


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