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 10-03-2008
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 20
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: 25
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: 20
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: 25
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: 20
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: 21
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
  #7  
Antiguo 10-03-2008
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 26
eduarcol Va por buen camino
Cita:
Empezado por cHackAll Ver Mensaje
***PD: Nadamas por curiosidad, cual es la velocidad de mi code?

Saludos

se abren las apuestas, quien da mas???
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #8  
Antiguo 10-03-2008
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 20
MaMu Va por buen camino
SOLUCIONADO

Resultados Vampyre Imaging Library Vs. D. Seoane Vs. cHackAll
-----------------------------------------------------
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
Tiempo de proceso cHackAll: 2m-27s
-----------------------------------------------------
DB: DS Memoria
-----------------------------------------------------
Procesador: Athlon 2.2 - 512Kb DDR
-----------------------------------------------------

Gracias seoane, cHackAll sin palabras.
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #9  
Antiguo 10-03-2008
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.122
Poder: 35
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Sin querer quitar méritos a los compañeros (que no podría) me gustaría que pusieras el código que estabas usando cuando lo hacías con Vampyre Imaging. Me consta que la librería puede trabajar de varias formas, y, tal vez pudiera hacerse algo al respecto. Ahora mismo estoy echando un vistazo a su documentación, por cierto.

Concretando un poco, quisiera saber si haces uso de la "interfaz de alto nivel" o la "interfaz de bajo nivel", o las "clases VCL/CLX/LCL". Por poner un ejemplo, así sería el asunto usando la "interfaz de bajo nivel", según la documentación:

Código Delphi [-]
uses
  SysUtils, Classes, ImagingTypes, Imaging;
var
  Img: TImageData;
begin
  // call this before using any TImageData record
  InitImage(Img);
  // load tigers from file
  LoadImageFromFile('X:\images\tigers.jpg', Img);
  //write some image info
  WriteLn('Mighty tigers have resolution ', Img.Width, 'x', Img.Height,
  ' and occupy ', Img.Size, ' bytes of your memory.');
  // memory occupied by image is freed
  FreeImage(Img);
end.

Ojo, porque el "InitImage()" acaso no haga falta ejecutarlo en todo momento, para todas las imágenes. Lo mismo que el "FreeImage()". No sé. Tal vez esté un poco confundido. La idea de los compañeros (excelentemente implementada) creo que es correcta, es decir, no se carga toda la imagen, sino que se intenta obtener sólo la información necesaria, pero, tengo cierta esperanza de que la Vampyre Imaging pueda con algo similar, puesto que parece una estupenda "pieza de software".
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 10-03-2008 a las 22:33:26.
Responder Con Cita
  #10  
Antiguo 10-03-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 21
cHackAll Va por buen camino
Cita:
Empezado por mamu Ver Mensaje
Tiempo de proceso V.I.L.: 6m-18s
Tiempo de proceso D.Seoane: 1m-04s
Tiempo de proceso cHackAll: 2m-27s
mamu, cronometraste la comparacion de BMP + JPG en todos los casos?
en fin... habra que darle una oportunidad a los benditos Streams


Felicidades amigo seoane

Saludos
Responder Con Cita
  #11  
Antiguo 10-03-2008
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 20
MaMu Va por buen camino
dec

Si, estoy usando a bajo nivel, y la forma que empleo es la siguiente:
Código Delphi [-]
 
var imagen:TImageData;
     x,y:integer;
begin
   ...
    LoadImageFromFile(lista[i],imagen);  //cargo la imagen
    if TestImage(imagen)                    //valida=True - archivo_corrupto=False           
       then begin
         x:=imagen.Width;
         y:=Img.Height;
       end;
   ...
end;

El tema del retraso pasa por la siguiente línea ya que tiene dependencia sobre el tamaño del archivo, y no encontré en la documentación otro método mas directo para las propiedades
Código Delphi [-]
LoadImageFromFile(lista[i],imagen);  //cargo la imagen

Con respecto a las funciones
Código Delphi [-]
InitImage(imagen);
FreeImage(imagen);

en este caso no son necesarias en todo momento, ya que no estoy utilizando ninguna de las funciones que se incluyen en las V.I.L. que dependen del TImageData en cuestión

cHackAll

Si, cronometré a las 3 funciones por igual proceso.
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #12  
Antiguo 10-03-2008
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.122
Poder: 35
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Pues tal vez el "TestImage()"... pero, me parece que no. Quiero decir, queda más o menos claro que se carga la imagen completamente, al menos con las funciones de que hablamos. De este modo se puede conseguir mucha información acerca de la imagen, pero, lo que interesa en este caso es conseguir parte de esa información, y por tanto todo el tiempo que se invierta en lo demás será para nada.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #13  
Antiguo 11-03-2008
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 20
MaMu Va por buen camino
Cita:
Empezado por dec Ver Mensaje
Hola,

Pues tal vez el "TestImage()"... pero, me parece que no. Quiero decir, queda más o menos claro que se carga la imagen completamente, al menos con las funciones de que hablamos. De este modo se puede conseguir mucha información acerca de la imagen, pero, lo que interesa en este caso es conseguir parte de esa información, y por tanto todo el tiempo que se invierta en lo demás será para nada.
Claro, pero el "TestImage()"... es muy util, sobre todo cuando los mal intencionados le cambian la extención a un EXE por BMP/JPG, lo que ahorra código, o cuando simplemente un archivo esta corrupto. De todas maneras, no la estoy usando actualmente para la carga, sino que la uso para la revisión de imágenes, donde informo archivos corruptos, etc.

Otra cosa, yo capture los ticks, haciendo un LoadFromFile a un TImage tradicional, y lo compare con el LoadImageFromFile(), ambos con una imagen de 3.5Mb, el tiempo es idéntico. Y ojo, pienso tambien que esta librería es espectacular, quizas o le estemos pifiando en algo o no me sirve por tratarse de ser muchas fotos (5000 prom).
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;

Última edición por MaMu fecha: 11-03-2008 a las 00:04:59.
Responder Con Cita
  #14  
Antiguo 11-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: 25
seoane Va por buen camino
Cita:
Empezado por cHackAll Ver Mensaje
No es por competir


Cita:
Empezado por cHackAll Ver Mensaje
en fin... habra que darle una oportunidad a los benditos Streams
Deberías darles esa oportunidad, al final usan las mismas APIs que tu.
Responder Con Cita
  #15  
Antiguo 11-03-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 21
cHackAll Va por buen camino
Cita:
Empezado por seoane Ver Mensaje
Cita:
Empezado por cHackAll Ver Mensaje
en fin... habra que darle una oportunidad a los benditos Streams
Deberías darles esa oportunidad, al final usan las mismas APIs que tu.
Pues no es cierto, yo he utilizado APIs compatibles con 16 bits

PD: creo que la comprobación de formato me ha costado la victoria , sin embargo no olvidemos que el "concurso" de velocidades ha sido comprobado uno tras otro, y luego de que el NTFS ha echo un caché de gran parte de los datos y Sistema de archivos.



Saludos
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
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 07:10:56.


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