 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Jue 19 Mar, 2015 6:18 pm Asunto: Obtener informacion de 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.
| 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 |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Sab 21 Mar, 2015 1:15 pm Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|