Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-03-2008
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 21
MaMu Va por buen camino
BMP/JPG a máxima velocidad

BMP/JPG a máxima velocidad

Existe alguna forma, digamos "al vuelo" para obtener el alto y el ancho de una imagen sea bmp y jpg?
Necesito algo que sea rapido y que no tome en cuenta el tamaño del archivo, ya pese 10kb como 10Mb, que solamente lea la resolucion.
Es que tengo que hacerlo con por lo menos 5000 imagenes, y realmente, ya con 100 me esta tardando horrores. Estuve usando las Vampyre Image Component, pero se me ralentiza todo. No se me ocurre como optimizar el proceso. Los path de las imagenes las cargo en un StringList, y luego cargo todo eso en una tabla (mySql), pero cuando quiero procesar la info de cada foto.... se hace demaciado lento el proceso, por lo que no me sirve.

Ideas bien locas serán vienvenidas.

Saludos.
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #2  
Antiguo 10-03-2008
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
Para bmp puedes usar algo como esto:

http://www.clubdelphi.com/foros/show...07&postcount=4

Para jpg se podría hacer algo similar, tendría que repasar la estructura de un archivo Jpeg, pero creo que no habría problema.
Responder Con Cita
  #3  
Antiguo 10-03-2008
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 21
MaMu Va por buen camino
Estuve probando con los BMP y la diferencia es rotundamente notable, se redujo el tiempo a pocos segundos. Ahora tendria que probar para los JPG, pero como seria la estructura, es decir, para hacer una funcion casi identica a:

Código Delphi [-]
GetBitmapInfo //como GetJPegInfo

Lo que temo, es que si convierto de JPG a BMP en la funcion, cada LoadFromFile del TJPEGImage haria todo mas lento, ya que dependeria del tamaño del JPG. Me gustaria poder hacer algo similar.

Saludos y muchas gracias seoane
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;

Última edición por MaMu fecha: 10-03-2008 a las 17:31:02.
Responder Con Cita
  #4  
Antiguo 10-03-2008
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
El código está un poco sucio pero quedaría mas o menos así:
Código Delphi [-]
type
  // No estan todos los elementos de la estructura
  TSOF = packed record
    Precision: Byte;
    Height: Word;
    Width: Word;
  end;
  PSOF = ^TSOF;

function GetJpegSize(Src: TStream; var Width: Integer; var Height: Integer): Boolean;
var
  Buffer: PByteArray;
  Size: Integer;
begin
  Result:= FALSE;
  GetMem(Buffer,Sizeof(TSOF));
  try
    while TRUE do
    begin
      FillChar(Buffer^,4,#0);
      if Src.Read(Buffer^,4) <> 4 then Break;
      Size:= ((Buffer[2] shl 8) + Buffer[3]) - 2;
      case Buffer[1] of
        $01,$D0..$D8:
          Src.Seek(-2,soFromCurrent);
        $C0: begin
            FillChar(Buffer^,Sizeof(TSOF),#0);
            if Src.Read(Buffer^,Sizeof(TSOF)) = Sizeof(TSOF) then
            begin
              Result:= TRUE;
              Width:= Swap(PSOF(Buffer).Width);
              Height:= Swap(PSOF(Buffer).Height);
            end;
            break;
          end;
        else
          Src.Seek(Size,soFromCurrent);
      end;
    end;
  finally
    FreeMem(Buffer);
  end;
end;

function GetJpegSizeFromFile(Filename: String; var Width: Integer;
  var Height: Integer): Boolean;
var
  Stream: TFileStream;
begin
  Result:= FALSE;
  Stream:= TFileStream.Create(Filename,fmOpenRead);
  try
    try
      Result:= GetJpegSize(Stream,Width,Height);
    except
    end;
  finally
    Stream.Free;
  end;
end;

// Un ejemplo de como usar la funcion
var
  x,y: Integer;
begin
  if GetJpegSizeFromFile('d:\1.jpg',x,y) then
    ShowMessage(Format('%d,%d',[x,y]));
end;
Responder Con Cita
  #5  
Antiguo 10-03-2008
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 21
MaMu Va por buen camino
SOLUCIONADO

Resultados Vampyre Imaging Library Vs. D. Seoane
-----------------------------------------------------
Cantidad TOTAL de imágenes procesadas: 13047
Cantidad de BMP: 8756
Cantidad de JPG: 4290
-----------------------------------------------------
Tiempo de proceso V.I.L.: 6m-18s
Tiempo de proceso D.Seoane: 1m-04s
-----------------------------------------------------
DB: DS Memoria
-----------------------------------------------------
Procesador: Athlon 2.2 - 512Kb DDR
-----------------------------------------------------

Gracias seoane, sin palabras.
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #6  
Antiguo 10-03-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 22
cHackAll Va por buen camino
No es por competir, pero la verdad que me daba mucha pena echar mi código al basurero;

Código Delphi [-]
function GetDimensions(lpFileName: PChar): TSize;
var hFile: Integer; Value, FileSize: Cardinal; Chunk: Word;
begin
 Result := TSize(Point(0, 0));
 hFile := _lopen(lpFileName, OF_READ);
 if hFile = -1 then Exit;
 _lread(hFile, @Value, 4);
 if Word(Value) = $4D42{BM} then
  begin
   _llseek(hFile, 18, FILE_BEGIN);
   _lread(hFile, @Result, SizeOf(Result));
  end
 else
  begin
   if Value = $E0FFD8FF{JPEG} then
    begin
     _lread(hFile, @Chunk, 2);
     _lread(hFile, @Value, 4);
     if Value = $4649464A{JFIF} then
      begin
       FileSize := GetFileSize(hFile, nil);
       Value := 4 + Swap(Chunk);
       while Value < FileSize do
        begin
         _llseek(hFile, Value, FILE_BEGIN);
         Inc(Value, 2); _lread(hFile, @Chunk, 2);
         if Lo(Chunk) <> $FF then Exit;
         if Hi(Chunk) = $C0 then
          begin
           _llseek(hFile, Value + 3, FILE_BEGIN);
           _lread(hFile, @Chunk, 2); Result.cy := Swap(Chunk);
           _lread(hFile, @Chunk, 2); Result.cx := Swap(Chunk);
           Break;
          end
         else
          begin
           _lread(hFile, @Chunk, 4);
           Inc(Value, Swap(Chunk));
          end;
        end;
      end;
    end;
  end;
 CloseHandle(hFile);
end;

Uso;

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var Size: TSize;
begin
 if OpenDialog1.Execute then
  begin
   Size := GetDimensions(PChar(OpenDialog1.FileName));
   ShowMessage(IntToStr(Size.cx) + 'x' + IntToStr(Size.cy));
  end;
end;

PD: Nadamas por curiosidad, cual es la velocidad de mi code?

Saludos
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Maxima valor de un nuevo registro Arturo_ Tablas planas 8 23-07-2007 22:14:32
Cantidad maxima de hilos ?? marceloalegre Varios 2 18-04-2007 17:27:46
imprimir imagenes en maxima calidad alain Impresión 3 22-06-2006 17:05:50
Longitud máxima para una consulta SQL moesis Conexión con bases de datos 3 17-08-2004 23:54:43
Longitud maxima integer cinecito Varios 10 12-05-2004 03:06:22


La franja horaria es GMT +2. Ahora son las 18:11:37.


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