Avatar billede the_saint Nybegynder
22. oktober 2005 - 14:05 Der er 22 kommentarer og
1 løsning

Sammenligne billeder.

Hej Experter .. :)
Jeg har 3 spørgsmål ... :)

Lad os sige jeg tager et screenshot af min skærm, nu skal jeg så bruge en lille del af dette billede, lad os sige en lille firkant i midten .. :)
Er dette svært? og kan nogle evt. kaste nogle ledetråde efter mig? ;)

Nu når jeg så har det her billede, så vil jeg gerne have sammenlignet det med et andet billede. og bare retuneret en værdi der siger true eller false ..
Findes der ikk en færdig funktion eller lign til det? evt. en som en klog klog man har lavet? :)

og til sidst...
Lad os så sige, at den retunere false .. så skal den lave et mouseclick et bestemt sted på skærmen... ;)

Mvh.
Mikkel
Avatar billede the_saint Nybegynder
22. oktober 2005 - 15:16 #1
Fik svar på #3 ... Men mangler stadig de 2 andre :)

Mouseclick og mousemove
  INPUT Input[2];
  memset(Input, 0, sizeof(Input));
  Input[0].type = INPUT_MOUSE;
  Input[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
  Input[1].type = INPUT_MOUSE;
  Input[1].mi.dwFlags = MOUSEEVENTF_LEFTUP;

  SetCursorPos(x, y);
  Sleep(100);
  SendInput(2, Input, sizeof(INPUT));
Avatar billede bertelbrander Novice
22. oktober 2005 - 15:48 #2
Må jeg foreslå at du kikker på JDraw som du finder her:
http://home20.inet.tele.dk/midgaard/sample.html

Den har en ImageClass som bl.a. har en function til at lave et billede fra clipboard og en funktion til at tage et udsnit (crop) af billedet.

Det burde være simpelt at lave en sammenlignings funktion der kan sammenligne to ImageClass billeder, ellers kan jeg godt lave en.

Man kan også ret let lave en funktion der kan lave en ImageClass billede direkte fra skærmen.
Avatar billede the_saint Nybegynder
22. oktober 2005 - 16:08 #3
Takker det prøver jeg :)
Avatar billede the_saint Nybegynder
22. oktober 2005 - 16:18 #4
Er det muligt at få et positionen på et andet program? altså, x y :)
Avatar billede bertelbrander Novice
22. oktober 2005 - 17:17 #5
Hvad mener du med position? Programmets hovedvindues øverste venster hjørne?
Avatar billede the_saint Nybegynder
22. oktober 2005 - 17:54 #6
Ja, men det skal ikk være MIT program, men et andet program .. eks notepad .. :)
Avatar billede bertelbrander Novice
22. oktober 2005 - 18:16 #7
Noget i stil med:

#include <windows.h>
#include <psapi.h>
#include <stdlib.h>
#include <stdio.h>

void GetFileAndExt(const char *FullPath, char *Name)
{
  char Ext[MAX_PATH];
  _splitpath(FullPath, NULL, NULL, Name, Ext);
  strcat(Name, Ext);
}

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM Param)
{
  DWORD ProcessID = -1;

  GetWindowThreadProcessId(hwnd, &ProcessID);
  if(ProcessID == (DWORD )Param)
  {
      RECT R;
      GetWindowRect(hwnd, &R);
      printf("X: %d, Y: %d\n", R.left, R.top);
  }
  return TRUE;
}

int main(int argc, char *argv[])
{
  DWORD Processes[1024], ProcessesNeeded;
  DWORD NumProcesses, i;

  if(argc != 2)
  {
    printf("You have to specify which program you want to bring to front\n");
    return EXIT_FAILURE;
  }

  if(!EnumProcesses(Processes, sizeof(Processes), &ProcessesNeeded))
    return EXIT_FAILURE;

  NumProcesses = ProcessesNeeded/sizeof(DWORD);

  for(i = 0; i < NumProcesses; i++)
  {
    HMODULE ModHandle[1024];
    DWORD ModulesNeeded;
    HANDLE ProcessHandle;

    ProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_TERMINATE, FALSE, Processes[i]);
    if(EnumProcessModules(ProcessHandle, ModHandle, sizeof(ModHandle), &ModulesNeeded))
    {
      char ModuleName[MAX_PATH], FileName[MAX_PATH];
      if(GetModuleFileNameEx(ProcessHandle, ModHandle[0], ModuleName, sizeof(ModuleName)))
      {
        GetFileAndExt(ModuleName, FileName);
        if(!stricmp(FileName, argv[1]))
        {
          printf("Found a match: %s\n", ModuleName);
          EnumWindows(EnumWindowsProc, (LPARAM )Processes[i]);
          return EXIT_SUCCESS;
        }
      }
    }
    CloseHandle(ProcessHandle);
  }

  return EXIT_FAILURE;
}

Det køres med navnet på det program som man vil finde position på som parameter (f.ex spil.exe).
Husk at linke med psapi.lib
Avatar billede the_saint Nybegynder
22. oktober 2005 - 18:32 #8
Kigger på det .. :)

Kan du ikk lede mig i den rigtige retning med hvordan jeg laver et ImageClass direkte fra skærmen? og evt kun en lille del af skærmen .. :)
Avatar billede the_saint Nybegynder
22. oktober 2005 - 18:37 #9
Altså, det skal bruges til:
jeg har et program, som viser et tal ...
I mit program skal jeg finde ud af hvad det er for et tal der står der ... :)
Avatar billede bertelbrander Novice
22. oktober 2005 - 19:54 #10
Jeg prøver at lave et eksempel på at lave en ImageClass direkte fra skærmen, det bliver nok først sent i aften. Måden det gøres på er at hente en DC med GetDC hvor HWND er 0, så får man en DC der gælder hele skærmen, så kan mab bruge diverse bitmap funktioner med DC'en.

Hvis tallet står i en edit box eller en anden windows control, kan man måske bruge GetWindowText (eller sende en WM_GETTEXT). Hvad er det for et program du skal læse fra?
Avatar billede the_saint Nybegynder
22. oktober 2005 - 20:06 #11
Det står ikk i en Edit control, desværre har tjekket .. :(

Jeg ser frem til en lille kodesnip :)
Avatar billede bertelbrander Novice
23. oktober 2005 - 02:13 #12
Jeg fik strikket noget sammen.

ImageClass har fået en CreateFromScreenDump() funktion, der opretter et image fra et screen dump. Du kan prøve funktionen fra programmet med Menu -> Image -> Screen Dump.

ImageClass har også fået en == operator til at sammenligne to ImageClass objekter. Jeg har ikke testet den endnu, men den er ret simpel så mon ikke den virker.

Downlod:
http://home20.inet.tele.dk/midgaard/jdraw-beta.zip

zip-filen indeholder ikke jpeg biblioteket, det skal du downloade sammen med den oprindelige JDraw.
Avatar billede the_saint Nybegynder
23. oktober 2005 - 09:07 #13
Bertel.. Du er min nye helt ... jeg kigger på det .. :)

Takker mange gange :)
Avatar billede the_saint Nybegynder
23. oktober 2005 - 10:58 #14
Vil det her fungere?:

ImageClass *CurrentImage = new ImageClass;
CurrentImage->CreateFromScreenDump();
CurrentImage->Crop(48,116,180,64);
CurrentImage->WriteBmp("c:\ok.bmp");

Det gemmer en fil, men filen er en korrupt BMP fil :(
Avatar billede bertelbrander Novice
23. oktober 2005 - 13:36 #15
Argumenterne til Crop er left, top, right, bottom, i dit kald er top større end bottom, og det vil gå galt. Right skal være større end left og bottom skal være større end top.

Når man bruger \ i en streng skal du "escape" den, så det bliver: "c:\\ok.bmp"
Avatar billede the_saint Nybegynder
23. oktober 2005 - 14:39 #16
CurrentImage->CreateFromScreenDump();
                CurrentImage->Crop(10, 11, 100, 110);
//                left, top, right, bottom
                sprintf(chrBuffer, "c:\\numbers\\%d.bmp", i);
                CurrentImage->WriteBmp(chrBuffer);

Nu tager jeg bare et helt tilfældigt sted på skærmen, men det der viker heller ikke ... :(

Den opretter filen, men, der er bare et rødt kryds :S
Avatar billede the_saint Nybegynder
23. oktober 2005 - 15:00 #17
og hvis jeg fjerne Crop, så virker det heller ikke ...

Dens fil størrelse ændre sig, men der er stadig kun et rødt kryds :S
Avatar billede the_saint Nybegynder
23. oktober 2005 - 16:13 #18
Hmm .. Hvis jeg laver et SS i dit program, og så prøver at gemme det, så kommer der en uventet fejl :(
Avatar billede bertelbrander Novice
23. oktober 2005 - 16:34 #19
Der er en fejl i SaveBMP og SaveJPG. Denne linie:
  FileNameList[FileNameIndex] = Drive;
Skal i begge funktioner ændres til:
if(FileNameList.size() <= FileNameIndex)
  FileNameList.push_back(Drive);
else
  FileNameList[FileNameIndex] = Drive;

Det forklarer dog ikke hvorfor din kode ikke virker. Kunne du prøve at sende mig en af de filer der fejler? Min email: bertel @ post4 . tele . dk
Avatar billede the_saint Nybegynder
23. oktober 2005 - 18:32 #20
Det er gjort .. :)
Ikk fordi at den inderholder andet end det jeg har skrevet :)
Avatar billede the_saint Nybegynder
29. oktober 2005 - 13:50 #21
Det virker langt om længe :)
Tak Bertel - og damn vi fik testet din JDraw ;)

Smid et svar :)
Avatar billede bertelbrander Novice
29. oktober 2005 - 14:30 #22
Du har fået det til at virke HVER gang?

Jeg samler ikke point.
Avatar billede the_saint Nybegynder
29. oktober 2005 - 22:40 #23
Yep .. det virker HVER gang .. :)
Mit program har kørt upåklageligt HELE dagen .. på 2 maskiner :)

Okay .. Så snupper jeg dem selv :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester