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
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
  #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
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
  #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
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
  #4  
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
  #5  
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: 28
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
  #6  
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 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
  #7  
Antiguo 10-03-2008
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.144
Poder: 36
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
  #8  
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
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
  #9  
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
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
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 16:40:00.


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