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 17-10-2014
ElDuc ElDuc is offline
Miembro
 
Registrado: jul 2004
Posts: 197
Poder: 20
ElDuc Va por buen camino
Buscar imagen en el escritorio u otra imagen mayor

Buenas, señores, vuelvo a estar por aquí.

Ante todo les diré que trabajo con Delphi 10 bajo Windows Vista.

Tengo un bitmap con una imagen (bmp) de 120 pixels x 50 pixels (aprox) y necesito buscar si se encuentra en el escritorio.

Para ello lo que yo sé hacer es capturar el escritorio en un bitmap (con BitBlt, no sé si hay otra forma mejor) y después recorrer todo el bitmap del escritorio buscando el bitmap de la imagen buscada (pixel por pixel).

Ya sé lo que pensarán, es una burrada, funciona pero puedes ir a cenar con los amigos y al regresar posiblemente el procedimiento haya encontrado la imagen y devuelto su posición (TPoint apuntando a Lef y Top en pantalla)

Es evidente que así no puedo continuar y estoy convencido que a nivel de tarjeta gráfica debe haber algún método que haga esto en un plis, al igual que hace la captura del escritorio, pero no tengo ni idea.

?Alguien puede ayudarme?

Gracias por vuestra colaboración.
Responder Con Cita
  #2  
Antiguo 17-10-2014
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
No tengo idea de manejo de imágenes, pero aquí va una idea para acelerar el tema:

Yo tomaría el primer pixel de la imagen (1,1).
Luego recorrería la imagen de la captura de pantalla pixel a pixel.
Si el pixel es igual al que busco compararía el resto de pixeles con la imagen que tengo. Esto te ahorrará la comparación de todos los pixeles que no tienen el color original.
Como paso intermedio, antes de comparar la imagen completa, podrías comparar las otras tres puntas (píxeles (120,1) (1,50) y (120,50)) y si son iguales continuar a comparar la imagen completa.

También dejaría de comparar 120pixeles antes de llegar al final derecho y 50 pixeles antes de llegar al fondo, pues la imagen no cabrá en la pantalla.
Creo que es obvio, pero también dejaría de comparar si he encontrado la imagen, a menos que exista la posibilidad de que haya más de una.

Si muestras la parte de código que compara una imagen con la de la captura de pantalla, quizás alguien pueda ayudarte a optimizarla.
Responder Con Cita
  #3  
Antiguo 17-10-2014
ElDuc ElDuc is offline
Miembro
 
Registrado: jul 2004
Posts: 197
Poder: 20
ElDuc Va por buen camino
Gracias por tu colaboración duilioisola.

En realidad ya hago lo que tu dices, es decir si el primer pixel no coincide ya no sigo y cambio al siguiente punto de pantalla y también elimino la parte derecha e inferior donde no puede estar, pero todos los comentarios de mi primer escrito ya contaban con estas características en el código y tarda el miserere.

Tal como me sugieres adjunto el código:
Código Delphi [-]
Function FindImage(AMonitor: Byte; B: TBitmap): Tpoint;
Var
    BB: TgvBitMap;
    BBB: TBitmap;
    X, Y, XX, YY: Integer;
    Font: TRect;
    Ok: Boolean;
Begin
Result.X := -1;
Result.Y := -1;
BB := TgvBitMap.Create;
BB.Bitmap := TBitmap.Create;
BB.Bitmap.Canvas.Lock;
BB.Left := 0;
BB.Top := 0;
If (AMonitor = 1) And (Screen.MonitorCount > 0) Then
    begin
    BB.Bitmap.Width := Screen.Monitors[1].Width;
    BB.Bitmap.Height := Screen.Monitors[1].Height;
    end
else
    begin
    BB.Bitmap.Width := Screen.Width;
    BB.Bitmap.Height := Screen.Height;
    end;
GetDeskTop(AMonitor, BB);
For X := 0 To BB.Bitmap.Width - B.Width Do
    Begin
    For Y := 0 To BB.Bitmap.Height - B.Width Do
        Begin
        Ok := True;
        For XX := 0 To B.Width - 1 Do
            Begin
            For YY := 0 To B.Height - 1 Do
                Begin
                If BB.Bitmap.Canvas.Pixels[X, Y] <> B.Canvas.Pixels[XX, YY] Then
                    begin
                    Ok := False;
                    Break;
                    end;
                End;
            If Not Ok Then
                Break;
            End;
        If Ok Then
            begin
            Result.X:=X;
            Result.Y:=Y;
            Break;
            end;
        End;
    If Ok Then
        Break;
    End;
If Assigned(BBB) Then
    begin
    BBB.Canvas.Unlock;
    BBB.Free;
    end;
If Assigned(BB) Then
    begin
    BB.Bitmap.Canvas.Unlock;
    BB.Free;
    end;
End;

Lo del monitor es porque trabajo con 2.

Saludos.
Responder Con Cita
  #4  
Antiguo 17-10-2014
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Aquí explican como comparar dos imágenes:
Mediante Scanline
Código Delphi [-]
function IsSameBitmapUsingScanLine(Bitmap1, Bitmap2: TBitmap): Boolean;
var
 i           : Integer;
 ScanBytes   : Integer;
begin
  Result:= (Bitmap1<>nil) and (Bitmap2<>nil);
  if not Result then exit;
  Result:=(bitmap1.Width=bitmap2.Width) and (bitmap1.Height=bitmap2.Height) and (bitmap1.PixelFormat=bitmap2.PixelFormat) ;

  if not Result then exit;

  ScanBytes := Abs(Integer(Bitmap1.Scanline[1]) - Integer(Bitmap1.Scanline[0]));
  for i:=0 to Bitmap1.Height-1 do
  Begin
    Result:=CompareMem(Bitmap1.ScanLine[i],Bitmap2.ScanLine[i],ScanBytes);
    if not Result then exit;
  End;
end;
Responder Con Cita
  #5  
Antiguo 18-10-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Quizás esto te de una idea: resta de imágenes, si la imagen resultante es negra, son iguales.

Saludos.
Responder Con Cita
  #6  
Antiguo 19-10-2014
ElDuc ElDuc is offline
Miembro
 
Registrado: jul 2004
Posts: 197
Poder: 20
ElDuc Va por buen camino
Gracias a todos, pero por el momento dimito de este empeño, no es imprescindible para mi aplicación y ya he invertido demasiado tiempo en ello sin conseguir algo aceptable (desde el punto de vista de rapidez)

MIL GRACIAS.
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
Zoom de una imagen en otra imagen Juliajuli Gráficos 1 02-09-2013 18:17:35
Buscar posición de una imagen en pantalla ZayDun Varios 7 26-06-2013 22:20:43
Comparar imagen en pantalla con otra imagen gorgori Gráficos 4 24-12-2010 13:17:22
Buscar imagen franfl C++ Builder 2 29-03-2008 14:28:44
Ver imagen en un DBImage en tamaño mayor pablorc Gráficos 2 23-01-2006 16:16:21


La franja horaria es GMT +2. Ahora son las 23:12:31.


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