Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Obtener informacion de fichero JPG

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Obtener informacion de fichero JPG Responder citando

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.
Código:

    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.",'!');
        }

_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

He encontrado este código que quizás sea lo que busco, ya que el valor que me interesa es el del valor BitDepth...
Pero el código está en Delphi, ¿Alguien que pueda pasarlo a C++?
gracias.
Código:

function GetJpegSize(jpeg: TMemoryStream; out width, height, BitDepth: integer): boolean;
var n: integer;
    b: byte;
    w: Word;
begin
  result := false;
  n := jpeg.Size-8;
  jpeg.Position := 0;
  if n<=0 then
    exit;
  jpeg.Read(w,2);
  if w<>$D8FF then
    exit; // invalid format
  jpeg.Read(b,1);
  while (jpeg.Position<n) and (b=$FF) do begin
    jpeg.Read(b,1);
    case b of
      $C0..$C3: begin
        jpeg.Seek(3,soFromCurrent);
        jpeg.Read(w,2);
        height := swap(w);
        jpeg.Read(w,2);
        width := swap(w);
        jpeg.Read(b,1);
        BitDepth := b*8;
        Result := true; // JPEG format OK
        exit;
      end;
      $FF:
        jpeg.Read(b,1);
      $D0..$D9, $01: begin
        jpeg.Seek(1,soFromCurrent);
        jpeg.Read(b,1);
      end;
      else begin
        jpeg.Read(w,2);
        jpeg.Seek(swap(w)-2, soFromCurrent);
        jpeg.Read(b,1);
      end;
    end;
  end;
end;

_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.